根据表名自动生成I/S/U/D的SQL语句,用于MSSQL2000/2005/2008

网上流传的基本SQL生成语句(Inset/Selec/Update/Delete)方法多了,这里介绍一种,可以用于MSSQL 2000/2005/2008。

 

第一步:生成测试数据库

/* ************自动生成存储过程演示 **************** */

/* ************主要生成以下四个脚本 Delete/Select/Insert/Update **************** */

/* ************说明:仅用于MSSQL 2000/2005/2008 **************** */

/* ************tony 2009.06.06 Update **************** */

/* ************MSN:[email protected] **************** */

/* ************自动生成存储过程演示 **************** */

/* ***********************创建测试数据库[TestProcedure]****************************** */

use master 

go

IF EXISTS ( SELECT name FROM master.dbo.sysdatabases WHERE name = N ' TestProcedure ' )

DROP DATABASE [ TestProcedure ] 

GO 

 

create database [ TestProcedure ]

go

 

use [ TestProcedure ] 

go

 

第二步:生成主要存储过程

SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO

/* 生成一个Delete记录的存储过程************************* tony 2009.06.06 Update MSN:[email protected] @sTableName 表名 @bExecute 是否执行 默认0不执行 */

 

CREATE PROC CPP__SYS_MakeDeleteRecordProc

    @sTableName varchar ( 128 ),

    @bExecute bit = 0

AS

IF dbo.fnTableHasPrimaryKey( @sTableName ) = 0

BEGIN

  RAISERROR ( ' Procedure cannot be created on a table with no primary key. ' , 10 , 1 )

  RETURN

END

 

DECLARE @sProcText varchar ( 8000 ), @sKeyFields varchar ( 2000 ),

@sWhereClause varchar ( 2000 ), @sColumnName varchar ( 128 ),

@nColumnID smallint , @bPrimaryKeyColumn bit , @nAlternateType int ,

@nColumnLength int , @nColumnPrecision int , @nColumnScale int ,

@IsNullable bit , @IsIdentity int , @sTypeName varchar ( 128 ),

@sDefaultValue varchar ( 4000 ), @sCRLF char ( 2 ),@sTAB char ( 1 )

 

SET @sTAB = char ( 9 )

SET @sCRLF = char ( 13 ) + char ( 10 )

SET @sProcText = '' SET @sKeyFields = ''

SET @sWhereClause = ''

SET @sProcText = @sProcText + ' IF EXISTS(SELECT * FROM sysobjects WHERE name = '' AutoGenerateSys__ ' + @sTableName + ' _Delete '' ) ' + @sCRLF

SET @sProcText = @sProcText + @sTAB + ' DROP PROC AutoGenerateSys__ ' + @sTableName + ' _Delete ' + @sCRLF

 

IF @bExecute = 0

SET @sProcText = @sProcText + ' GO ' + @sCRLF 

SET @sProcText = @sProcText + @sCRLF PRINT @sProcText

 

IF @bExecute = 1

EXEC ( @sProcText )

 

SET @sProcText = '' 

SET @sProcText = @sProcText + ' ---------------------------------------------------------------------------- ' + @sCRLF

SET @sProcText = @sProcText + ' -- Delete a single record from ' + @sTableName + @sCRLF

SET @sProcText = @sProcText + ' ---------------------------------------------------------------------------- ' + @sCRLF

SET @sProcText = @sProcText + ' CREATE PROC AutoGenerateSys__ ' + @sTableName + ' _Delete ' + @sCRLF

 

DECLARE crKeyFields cursor for

SELECT * FROM dbo.fnTableColumnInfo( @sTableName ) ORDER BY 2

 

OPEN crKeyFields 

 

FETCH NEXT FROM crKeyFields INTO

@sColumnName , @nColumnID , @bPrimaryKeyColumn , @nAlternateType , @nColumnLength ,

@nColumnPrecision , @nColumnScale , @IsNullable , @IsIdentity , @sTypeName , @sDefaultValue

 

WHILE ( @@FETCH_STATUS = 0 )

BEGIN

IF ( @bPrimaryKeyColumn = 1 )

BEGIN

IF ( @sKeyFields <> '' )

SET @sKeyFields = @sKeyFields + ' , ' + @sCRLF

SET @sKeyFields = @sKeyFields + @sTAB + ' @ ' + @sColumnName + ' ' + @sTypeName

 

IF ( @nAlternateType = 2 )  -- decimal, numeric

SET @sKeyFields = @sKeyFields + ' ( ' + CAST ( @nColumnPrecision AS varchar ( 3 )) + ' , ' + CAST ( @nColumnScale AS varchar ( 3 )) + ' ) '

ELSE IF ( @nAlternateType = 1 ) -- character and binary

SET @sKeyFields = @sKeyFields + ' ( ' + CAST ( @nColumnLength AS varchar ( 4 )) + ' ) '

IF ( @sWhereClause = '' )

SET @sWhereClause = @sWhereClause + ' WHERE '

ELSE

SET @sWhereClause = @sWhereClause + ' AND ' 

SET @sWhereClause = @sWhereClause + @sTAB + @sColumnName + ' = @ ' + @sColumnName + @sCRLF 

END 

FETCH NEXT FROM crKeyFields INTO 

@sColumnName , @nColumnID , @bPrimaryKeyColumn , @nAlternateType , @nColumnLength , 

@nColumnPrecision , @nColumnScale , @IsNullable , @IsIdentity , @sTypeName , @sDefaultValue 

END 

CLOSE crKeyFields 

DEALLOCATE crKeyFields 

 

SET @sProcText = @sProcText + @sKeyFields + @sCRLF 

SET @sProcText = @sProcText + ' AS ' + @sCRLF 

SET @sProcText = @sProcText + @sCRLF 

SET @sProcText = @sProcText + ' DELETE ' + @sTableName + @sCRLF 

SET @sProcText = @sProcText + @sWhereClause 

SET @sProcText = @sProcText + @sCRLF 

 

IF @bExecute = 0 

SET @sProcText = @sProcText + ' GO ' + @sCRLF 

PRINT @sProcText 

 

IF @bExecute = 1 

EXEC ( @sProcText ) 

GO 

 

SET QUOTED_IDENTIFIER OFF 

GO 

 

SET ANSI_NULLS ON 

GO 

 

SET QUOTED_IDENTIFIER ON 

GO 

 

SET ANSI_NULLS ON 

GO 

 

/* 生成一个Insert记录的存储过程************************* 

tony 2009.06.06 Update MSN:[email protected] @sTableName 

表名 @bExecute 是否执行 默认0不执行 */ 

CREATE PROC CPP__SYS_MakeInsertRecordProc 

@sTableName varchar ( 128 ), 

@bExecute bit = 0 

AS 

IF dbo.fnTableHasPrimaryKey( @sTableName ) = 0 

BEGIN 

RAISERROR ( ' Procedure cannot be created on a table with no primary key. ' , 10 , 1 ) 

RETURN 

END 

 

DECLARE @sProcText varchar ( 8000 ), @sKeyFields varchar ( 2000 ), @sAllFields varchar ( 2000 ), 

@sAllParams varchar ( 2000 ), @sWhereClause varchar ( 2000 ), @sColumnName varchar ( 128 ), @nColumnID smallint , 

@bPrimaryKeyColumn bit , @nAlternateType int , @nColumnLength int , @nColumnPrecision int , @nColumnScale int , 

@IsNullable bit , @IsIdentity int , @HasIdentity int , @sTypeName varchar ( 128 ), @sDefaultValue varchar ( 4000 ), 

@sCRLF char ( 2 ), @sTAB char ( 1 ) 

 

SET @HasIdentity = 0 

SET @sTAB = char ( 9 ) 

SET @sCRLF = char ( 13 ) + char ( 10 ) 

SET @sProcText = '' 

SET @sKeyFields = '' 

SET @sAllFields = '' 

SET @sWhereClause = '' 

SET @sAllParams = '' 

SET @sProcText = @sProcText + ' IF EXISTS(SELECT * FROM sysobjects WHERE name = '' AutoGenerateSys__ ' + @sTableName + ' _Insert '' ) ' + @sCRLF 

SET @sProcText = @sProcText + @sTAB + ' DROP PROC AutoGenerateSys__ ' + @sTableName + ' _Insert ' + @sCRLF 

 

IF @bExecute = 0 

SET @sProcText = @sProcText + ' GO ' + @sCRLF 

SET @sProcText = @sProcText + @sCRLF 

PRINT @sProcText 

 

IF @bExecute = 1 

EXEC ( @sProcText ) 

SET @sProcText = '' 

SET @sProcText = @sProcText + ' ---------------------------------------------------------------------------- ' + @sCRLF 

SET @sProcText = @sProcText + ' -- Insert a single record into ' + @sTableName + @sCRLF 

SET @sProcText = @sProcText + ' ---------------------------------------------------------------------------- ' + @sCRLF 

SET @sProcText = @sProcText + ' CREATE PROC AutoGenerateSys__ ' + @sTableName + ' _Insert ' + @sCRLF 

 

DECLARE crKeyFields cursor for 

SELECT * FROM dbo.fnTableColumnInfo( @sTableName ) ORDER BY 2 

 

OPEN crKeyFields 

 

FETCH NEXT FROM crKeyFields INTO 

@sColumnName , @nColumnID , @bPrimaryKeyColumn , @nAlternateType , @nColumnLength , 

@nColumnPrecision , @nColumnScale , @IsNullable , @IsIdentity , @sTypeName , @sDefaultValue 

 

WHILE ( @@FETCH_STATUS = 0 ) 

BEGIN 

IF ( @IsIdentity = 0 ) 

BEGIN 

IF ( @sKeyFields <> '' ) 

SET @sKeyFields = @sKeyFields + ' , ' + @sCRLF 

SET @sKeyFields = @sKeyFields + @sTAB + ' @ ' + @sColumnName + ' ' + @sTypeName 

IF ( @sAllFields <> '' ) 

BEGIN 

SET @sAllParams = @sAllParams + ' , ' 

SET @sAllFields = @sAllFields + ' , ' 

END 

IF ( @sTypeName = ' timestamp ' ) 

SET @sAllParams = @sAllParams + ' NULL ' 

ELSE IF ( @sDefaultValue IS NOT NULL ) 

SET @sAllParams = @sAllParams + ' COALESCE(@ ' + @sColumnName + ' , ' + @sDefaultValue + ' ) ' 

ELSE 

SET @sAllParams = @sAllParams + ' @ ' + @sColumnName

SET @sAllFields = @sAllFields + @sColumnName 

END 

ELSE 

BEGIN 

SET @HasIdentity = 1 

END 

IF ( @nAlternateType = 2 ) -- decimal, numeric 

SET @sKeyFields = @sKeyFields + ' ( ' + CAST ( @nColumnPrecision AS varchar ( 3 )) + ' , ' + CAST ( @nColumnScale AS varchar ( 3 )) + ' ) ' 

ELSE IF ( @nAlternateType = 1 ) -- character and binary 

SET @sKeyFields = @sKeyFields + ' ( ' + CAST ( @nColumnLength AS varchar ( 4 )) + ' ) ' 

IF ( @IsIdentity = 0 ) 

BEGIN 

IF ( @sDefaultValue IS NOT NULL ) OR ( @IsNullable = 1 ) OR ( @sTypeName = ' timestamp ' ) 

SET @sKeyFields = @sKeyFields + ' = NULL ' 

END 

FETCH NEXT FROM crKeyFields INTO 

@sColumnName , @nColumnID , @bPrimaryKeyColumn , @nAlternateType ,@nColumnLength , @nColumnPrecision , 

@nColumnScale , @IsNullable , @IsIdentity , @sTypeName , @sDefaultValue 

END 

CLOSE crKeyFields 

DEALLOCATE crKeyFields 

SET @sProcText = @sProcText + @sKeyFields + @sCRLF 

SET @sProcText = @sProcText + ' AS ' + @sCRLF 

SET @sProcText = @sProcText + @sCRLF 

SET @sProcText = @sProcText + ' INSERT ' + @sTableName + ' ( ' + @sAllFields + ' ) ' + @sCRLF 

SET @sProcText = @sProcText + ' VALUES ( ' + @sAllParams + ' ) ' + @sCRLF 

SET @sProcText = @sProcText + @sCRLF 

 

IF ( @HasIdentity = 1 ) 

BEGIN 

SET @sProcText = @sProcText + ' RETURN SCOPE_IDENTITY() ' + @sCRLF 

SET @sProcText = @sProcText + @sCRLF 

END 

 

IF @bExecute = 0 

SET @sProcText = @sProcText + ' GO ' + @sCRLF 

PRINT @sProcText 

IF @bExecute = 1 

EXEC ( @sProcText ) 

GO 

 

SET QUOTED_IDENTIFIER OFF 

GO 

 

SET ANSI_NULLS ON 

GO 

 

SET QUOTED_IDENTIFIER OFF 

GO 

 

SET ANSI_NULLS ON 

GO 

 

/* 生成一个Select记录的存储过程************************* 

tony 2009.06.06 Update MSN:[email protected] @sTableName 

表名 @bExecute 是否执行 默认0不执行 */ 

CREATE PROC CPP__SYS_MakeSelectRecordProc 

@sTableName varchar ( 128 ), 

@bExecute bit = 0 

AS 

IF dbo.fnTableHasPrimaryKey( @sTableName ) = 0 

BEGIN 

RAISERROR ( ' Procedure cannot be created on a table with no primary key. ' , 10 , 1 ) 

RETURN 

END 

 

DECLARE @sProcText varchar ( 8000 ), @sKeyFields varchar ( 2000 ), @sSelectClause varchar ( 2000 ), 

@sWhereClause varchar ( 2000 ), @sColumnName varchar ( 128 ), @nColumnID smallint , 

@bPrimaryKeyColumn bit , @nAlternateType int , @nColumnLength int , @nColumnPrecision int , 

@nColumnScale int , @IsNullable bit , @IsIdentity int , @sTypeName varchar ( 128 ), 

@sDefaultValue varchar ( 4000 ), @sCRLF char ( 2 ), @sTAB char ( 1 ) 

 

SET @sTAB = char ( 9 ) 

SET @sCRLF = char ( 13 ) + char ( 10 ) 

SET @sProcText = '' 

SET @sKeyFields = '' 

SET @sSelectClause = '' 

SET @sWhereClause = '' 

SET @sProcText = @sProcText + ' IF EXISTS(SELECT * FROM sysobjects WHERE name = '' AutoGenerateSys__ ' + @sTableName + ' _Select '' ) ' + @sCRLF 

SET @sProcText = @sProcText + @sTAB + ' DROP PROC AutoGenerateSys__ ' + @sTableName + ' _Select ' + @sCRLF 

 

IF @bExecute = 0 

SET @sProcText = @sProcText + ' GO ' + @sCRLF 

SET @sProcText = @sProcText + @sCRLF 

PRINT @sProcText 

 

IF @bExecute = 1 

EXEC ( @sProcText ) 

SET @sProcText = '' 

SET @sProcText = @sProcText + ' ---------------------------------------------------------------------------- ' + @sCRLF 

SET @sProcText = @sProcText + ' -- Select a single record from ' + @sTableName + @sCRLF 

SET @sProcText = @sProcText + ' ---------------------------------------------------------------------------- ' + @sCRLF 

SET @sProcText = @sProcText + ' CREATE PROC AutoGenerateSys__ ' + @sTableName + ' _Select ' + @sCRLF 

 

DECLARE crKeyFields cursor for 

SELECT * FROM dbo.fnTableColumnInfo( @sTableName ) ORDER BY 2 

 

OPEN crKeyFields 

 

FETCH NEXT FROM crKeyFields INTO 

@sColumnName , @nColumnID , @bPrimaryKeyColumn , @nAlternateType , @nColumnLength , 

@nColumnPrecision , @nColumnScale , @IsNullable , @IsIdentity , @sTypeName , @sDefaultValue 

 

WHILE ( @@FETCH_STATUS = 0 ) 

BEGIN 

IF ( @bPrimaryKeyColumn = 1 ) 

BEGIN 

IF ( @sKeyFields <> '' ) 

SET @sKeyFields = @sKeyFields + ' , ' + @sCRLF 

SET @sKeyFields = @sKeyFields + @sTAB + ' @ ' + @sColumnName + ' ' + @sTypeName 

IF ( @nAlternateType = 2 ) -- decimal, numeric

SET @sKeyFields = @sKeyFields + ' ( ' + CAST ( @nColumnPrecision AS varchar ( 3 )) + ' , ' + CAST ( @nColumnScale AS varchar ( 3 )) + ' ) ' 

ELSE IF ( @nAlternateType = 1 ) -- character and binary 

SET @sKeyFields = @sKeyFields + ' ( ' + CAST ( @nColumnLength AS varchar ( 4 )) + ' ) ' 

IF ( @sWhereClause = '' ) 

SET @sWhereClause = @sWhereClause + ' WHERE ' 

ELSE 

SET @sWhereClause = @sWhereClause + ' AND ' 

SET @sWhereClause = @sWhereClause + @sTAB + @sColumnName + ' = @ ' + @sColumnName + @sCRLF 

END 

IF ( @sSelectClause = '' ) 

SET @sSelectClause = @sSelectClause + ' SELECT ' 

ELSE 

SET @sSelectClause = @sSelectClause + ' , ' + @sCRLF 

SET @sSelectClause = @sSelectClause + @sTAB + @sColumnName 

FETCH NEXT FROM crKeyFields INTO 

@sColumnName , @nColumnID , @bPrimaryKeyColumn , @nAlternateType , @nColumnLength , 

@nColumnPrecision , @nColumnScale , @IsNullable , @IsIdentity , @sTypeName , @sDefaultValue 

END 

CLOSE crKeyFields 

DEALLOCATE crKeyFields 

SET @sSelectClause = @sSelectClause + @sCRLF 

SET @sProcText = @sProcText + @sKeyFields + @sCRLF 

SET @sProcText = @sProcText + ' AS ' + @sCRLF 

SET @sProcText = @sProcText + @sCRLF 

SET @sProcText = @sProcText + @sSelectClause 

SET @sProcText = @sProcText + ' FROM ' + @sTableName + @sCRLF 

SET @sProcText = @sProcText + @sWhereClause 

SET @sProcText = @sProcText + @sCRLF 

 

IF @bExecute = 0 

SET @sProcText = @sProcText + ' GO ' + @sCRLF 

PRINT @sProcText 

 

IF @bExecute = 1 

EXEC ( @sProcText )

GO

 

SET QUOTED_IDENTIFIER OFF 

GO 

 

SET ANSI_NULLS ON 

GO 

 

SET QUOTED_IDENTIFIER ON 

GO 

 

SET ANSI_NULLS ON 

GO 

 

/* 生成一个Update记录的存储过程************************* 

tony 2009.06.06 Update MSN:[email protected] @sTableName 

表名 @bExecute 是否执行 默认0不执行 */ 

CREATE PROC CPP__SYS_MakeUpdateRecordProc 

@sTableName varchar ( 128 ), 

@bExecute bit = 0 

AS 

IF dbo.fnTableHasPrimaryKey( @sTableName ) = 0 

BEGIN 

RAISERROR ( ' Procedure cannot be created on a table with no primary key. ' , 10 , 1 ) 

RETURN 

END 

 

DECLARE @sProcText varchar ( 8000 ), @sKeyFields varchar ( 2000 ), @sSetClause varchar ( 2000 ), 

@sWhereClause varchar ( 2000 ), @sColumnName varchar ( 128 ), @nColumnID smallint , @bPrimaryKeyColumn bit , 

@nAlternateType int , @nColumnLength int , @nColumnPrecision int , @nColumnScale int , @IsNullable bit , 

@IsIdentity int , @sTypeName varchar ( 128 ), @sDefaultValue varchar ( 4000 ), @sCRLF char ( 2 ), @sTAB char ( 1 ) 

 

SET @sTAB = char ( 9 ) 

SET @sCRLF = char ( 13 ) + char ( 10 ) 

SET @sProcText = '' 

SET @sKeyFields = '' 

SET @sSetClause = '' 

SET @sWhereClause = '' 

SET @sProcText = @sProcText + ' IF EXISTS(SELECT * FROM sysobjects WHERE name = '' AutoGenerateSys__ ' + @sTableName + ' _Update '' ) ' + @sCRLF 

SET @sProcText = @sProcText + @sTAB + ' DROP PROC AutoGenerateSys__ ' + @sTableName + ' _Update ' + @sCRLF 

 

IF @bExecute = 0 

SET @sProcText = @sProcText + ' GO ' + @sCRLF 

SET @sProcText = @sProcText + @sCRLF 

PRINT @sProcText 

 

IF @bExecute = 1 

EXEC ( @sProcText ) 

SET @sProcText = '' 

SET @sProcText = @sProcText + ' ---------------------------------------------------------------------------- ' + @sCRLF 

SET @sProcText = @sProcText + ' -- Update a single record in ' + @sTableName + @sCRLF 

SET @sProcText = @sProcText + ' ---------------------------------------------------------------------------- ' + @sCRLF 

SET @sProcText = @sProcText + ' CREATE PROC AutoGenerateSys__ ' + @sTableName + ' _Update ' + @sCRLF 

 

DECLARE crKeyFields cursor for 

SELECT * FROM dbo.fnTableColumnInfo( @sTableName ) ORDER BY 2 

 

OPEN crKeyFields 

FETCH NEXT FROM crKeyFields INTO 

@sColumnName , @nColumnID , @bPrimaryKeyColumn , @nAlternateType , @nColumnLength , @nColumnPrecision , 

@nColumnScale , @IsNullable , @IsIdentity , @sTypeName , @sDefaultValue 

 

WHILE ( @@FETCH_STATUS = 0 ) 

BEGIN 

IF ( @sKeyFields <> '' ) 

SET @sKeyFields = @sKeyFields + ' , ' + @sCRLF 

SET @sKeyFields = @sKeyFields + @sTAB + ' @ ' + @sColumnName + ' ' + @sTypeName 

IF ( @nAlternateType = 2 ) -- decimal, numeric 

SET @sKeyFields = @sKeyFields + ' ( ' + CAST ( @nColumnPrecision AS varchar ( 3 )) + ' , ' + CAST ( @nColumnScale AS varchar ( 3 )) + ' ) ' 

ELSE IF ( @nAlternateType = 1 ) -- character and binary 

SET @sKeyFields = @sKeyFields + ' ( ' + CAST ( @nColumnLength AS varchar ( 4 )) + ' ) ' 

IF ( @bPrimaryKeyColumn = 1 ) 

BEGIN 

IF ( @sWhereClause = '' ) 

SET @sWhereClause = @sWhereClause + ' WHERE ' 

ELSE 

SET @sWhereClause = @sWhereClause + ' AND ' 

SET @sWhereClause = @sWhereClause + @sTAB + @sColumnName + ' = @ ' + @sColumnName + @sCRLF 

END 

ELSE IF ( @IsIdentity = 0 ) 

BEGIN 

IF ( @sSetClause = '' ) 

SET @sSetClause = @sSetClause + ' SET ' 

ELSE 

SET @sSetClause = @sSetClause + ' , ' + @sCRLF 

SET @sSetClause = @sSetClause + @sTAB + @sColumnName + ' = ' 

IF ( @sTypeName = ' timestamp ' ) 

SET @sSetClause = @sSetClause + ' NULL ' 

ELSE 

IF ( @sDefaultValue IS NOT NULL ) 

SET @sSetClause = @sSetClause + ' COALESCE(@ ' + @sColumnName + ' , ' + @sDefaultValue + ' ) ' 

ELSE 

SET @sSetClause = @sSetClause + ' @ ' + @sColumnName 

END 

IF ( @IsIdentity = 0 ) 

BEGIN 

IF ( @IsNullable = 1 ) OR ( @sTypeName = ' timestamp ' ) 

SET @sKeyFields = @sKeyFields + ' = NULL ' 

END 

 

FETCH NEXT FROM crKeyFields INTO 

@sColumnName , @nColumnID , @bPrimaryKeyColumn , @nAlternateType , @nColumnLength , @nColumnPrecision ,

@nColumnScale , @IsNullable , @IsIdentity , @sTypeName , @sDefaultValue  

 END 

CLOSE crKeyFields 

DEALLOCATE crKeyFields 

 

SET @sSetClause = @sSetClause + @sCRLF 

SET @sProcText = @sProcText + @sKeyFields + @sCRLF 

SET @sProcText = @sProcText + ' AS ' + @sCRLF 

SET @sProcText = @sProcText + @sCRLF 

SET @sProcText = @sProcText + ' UPDATE ' + @sTableName + @sCRLF 

SET @sProcText = @sProcText + @sSetClause 

SET @sProcText = @sProcText + @sWhereClause 

SET @sProcText = @sProcText + @sCRLF 

 

IF @bExecute = 0 

SET @sProcText = @sProcText + ' GO ' + @sCRLF 

PRINT @sProcText 

 

IF @bExecute = 1 

EXEC ( @sProcText ) 

GO 

 

SET QUOTED_IDENTIFIER OFF 

GO 

 

SET ANSI_NULLS ON 

GO 

 

第三步:生成一些必须的Function 

/* 生成一些通用的Function ************************* 

tony 2009.06.06 Update MSN:[email protected] @sTableName 

表名 @bExecute 是否执行 默认0不执行 */ 

 

SET QUOTED_IDENTIFIER ON 

GO 

 

SET ANSI_NULLS ON 

GO 

 

 CREATE FUNCTION dbo.fnCleanDefaultValue

 ( 

@sDefaultValue varchar ( 4000 )

 ) 

 RETURNS varchar ( 4000 ) 

 AS 

 BEGIN 

RETURN SubString ( @sDefaultValue , 2 , DataLength ( @sDefaultValue ) - 2 ) 

 END 

 GO 

 

 SET QUOTED_IDENTIFIER OFF 

 GO 

 

 SET ANSI_NULLS ON 

 GO  

 

 SET QUOTED_IDENTIFIER ON 

 GO 

 

 SET ANSI_NULLS ON 

 GO 

 

CREATE FUNCTION dbo.fnColumnDefault

@sTableName varchar ( 128 ), 

@sColumnName varchar ( 128 )

RETURNS varchar ( 4000 ) 

AS 

BEGIN 

DECLARE @sDefaultValue varchar ( 4000 ) 

SELECT @sDefaultValue = dbo.fnCleanDefaultValue(COLUMN_DEFAULT) 

FROM INFORMATION_SCHEMA.COLUMNS 

WHERE TABLE_NAME = @sTableName AND COLUMN_NAME = @sColumnName 

RETURN @sDefaultValue 

END 

GO 

SET QUOTED_IDENTIFIER OFF 

GO 

 

SET ANSI_NULLS ON 

GO 

 

SET QUOTED_IDENTIFIER ON 

GO 

 

SET ANSI_NULLS ON 

GO 

 

CREATE FUNCTION dbo.fnIsColumnPrimaryKey

@sTableName varchar ( 128 ), 

@nColumnName varchar ( 128 )

RETURNS bit 

AS 

BEGIN 

DECLARE @nTableID int , @nIndexID int , @i int 

SET @nTableID = OBJECT_ID ( @sTableName ) 

 

SELECT @nIndexID = indid 

FROM sysindexes 

WHERE id = @nTableID AND indid BETWEEN 1 And 254 AND 

(status & 2048 ) = 2048 

IF @nIndexID Is Null 

RETURN 0 

IF @nColumnName IN 

SELECT sc. [ name ] 

FROM sysindexkeys sik INNER JOIN syscolumns sc 

ON sik.id = sc.id AND sik.colid = sc.colid 

WHERE sik.id = @nTableID AND sik.indid = @nIndexID 

BEGIN 

RETURN 1 

END 

RETURN 0 

END 

GO 

 

 

SET QUOTED_IDENTIFIER OFF 

GO 

 

SET ANSI_NULLS ON 

GO 

 

SET QUOTED_IDENTIFIER ON 

GO 

 

SET ANSI_NULLS ON 

GO 

 

CREATE FUNCTION dbo.fnTableColumnInfo

@sTableName varchar ( 128 )

RETURNS TABLE AS RETURN 

SELECT c.name AS sColumnName, c.colid AS nColumnID, dbo.fnIsColumnPrimaryKey( @sTableName , c.name) AS bPrimaryKeyColumn, 

CASE WHEN t.name IN ( ' char ' , ' varchar ' , ' binary ' , ' varbinary ' , ' nchar ' , ' nvarchar ' ) THEN 1 

WHEN t.name IN ( ' decimal ' , ' numeric ' ) THEN 2 

ELSE 0 END AS nAlternateType, 

c.length AS nColumnLength, c.prec AS nColumnPrecision, c.scale AS nColumnScale, c.IsNullable, 

SIGN (c.status & 128 ) AS IsIdentity, t.name as sTypeName, dbo.fnColumnDefault( @sTableName , c.name) AS sDefaultValue 

FROM syscolumns c INNER JOIN systypes t 

ON c.xtype = t.xtype and c.usertype = t.usertype 

WHERE c.id = OBJECT_ID ( @sTableName ) 

GO 

 

SET QUOTED_IDENTIFIER OFF 

GO 

 

SET ANSI_NULLS ON 

GO 

 

SET QUOTED_IDENTIFIER ON 

GO 

 

SET ANSI_NULLS ON 

GO 

 

CREATE FUNCTION dbo.fnTableHasPrimaryKey

@sTableName varchar ( 128 )

RETURNS bit 

AS 

BEGIN 

DECLARE @nTableID int , @nIndexID int 

SET @nTableID = OBJECT_ID ( @sTableName ) 

SELECT @nIndexID = indid 

FROM sysindexes 

WHERE id = @nTableID AND indid BETWEEN 1 And 254 AND (status & 2048 ) = 2048 

 

IF @nIndexID IS NOT Null 

RETURN 1 

RETURN 0 

END 

GO 

 

SET QUOTED_IDENTIFIER OFF 

GO 

 

SET ANSI_NULLS ON 

GO 

 

第四步:生成测试数据表,并执行 

/* ***********************创建测试数据表 Product ****************************** */ 

if not exists 

select * from dbo.sysobjects 

where id = object_id (N ' [dbo].[Product] ' ) and OBJECTPROPERTY (id, N ' IsUserTable ' ) = 1 

BEGIN 

CREATE TABLE [ Product ] ( [ P_ID ] [ bigint ] NOT NULL , [ P_Name ] [ nvarchar ] ( 255 ) COLLATE Chinese_PRC_CI_AS NULL , 

[ CategoryID1 ] [ int ] NULL , [ CategoryID2 ] [ int ] NULL , [ CategoryID3 ] [ int ] NULL , 

[ P_SingleIntro ] [ nvarchar ] ( 1000 ) COLLATE Chinese_PRC_CI_AS NULL , [ P_Intro ] [ ntext ] COLLATE Chinese_PRC_CI_AS NULL ,

[ P_Order ] [ float ] NULL , [ P_TopTime ] [ smalldatetime ] NULL , [ P_BigImage ] [ nvarchar ] ( 150 ) COLLATE Chinese_PRC_CI_AS NULL , 

[ P_SmallImage ] [ nvarchar ] ( 150 ) COLLATE Chinese_PRC_CI_AS NULL , [ CurState ] [ smallint ] NOT NULL , 

[ RecState ] [ smallint ] NOT NULL , [ P_CheckInfo ] [ nvarchar ] ( 80 ) COLLATE Chinese_PRC_CI_AS NULL , 

[ P_L_ID ] [ int ] NOT NULL , [ P_NewKey1 ] [ nvarchar ] ( 300 ) COLLATE Chinese_PRC_CI_AS NULL , 

[ AddTime ] [ datetime ] NOT NULL , [ AddUser ] [ nvarchar ] ( 50 ) COLLATE Chinese_PRC_CI_AS NULL , 

[ ModTime ] [ datetime ] NOT NULL , [ ModUser ] [ nvarchar ] ( 50 ) COLLATE Chinese_PRC_CI_AS NULL , 

[ F1 ] [ int ] NOT NULL , [ F3 ] [ nvarchar ] ( 50 ) COLLATE Chinese_PRC_CI_AS NULL , 

CONSTRAINT [ PK_Product ] PRIMARY KEY CLUSTERED ( [ P_ID ] ) ON [ PRIMARY ] ) ON [ PRIMARY ] TEXTIMAGE_ON [ PRIMARY ] 

END 

 

/* *******测试生成********** */ 

-- CPP__SYS_MakeDeleteRecordProc 'Product',0 -- 

go 

-- CPP__SYS_MakeInsertRecordProc 'Product',0 -- 

go 

-- CPP__SYS_MakeSelectRecordProc 'Product',0 -- 

go 

-- CPP__SYS_MakeUpdateRecordProc 'Product',0 -- 

go 

 

/* *******测试生成********** */ 

 

CPP__SYS_MakeDeleteRecordProc ' Product ' , 1 

go 

 

CPP__SYS_MakeInsertRecordProc ' Product ' , 1 

go

 

 CPP__SYS_MakeSelectRecordProc ' Product ' , 1 

 go 

 

 CPP__SYS_MakeUpdateRecordProc ' Product ' , 1 

 

你可能感兴趣的:(sql,function,null,delete,insert,character)