SQL /**//*************自动生成存储过程演示 *****************/ /**//*************主要生成以下四个脚本 Delete/Select/Insert/Update *****************/ /**//*************说明:仅用于MSSQL 2000/2005/2008 *****************/ /**//*************tony 2009.06.06 Update *****************/ /**//*************MSN:3w@live.cn *****************/ /**//*************自动生成存储过程演示 *****************/ /**//************************创建测试数据库[TestProcedure]*******************************/ use master go IFEXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'TestProcedure') DROPDATABASE[TestProcedure] GO createdatabase[TestProcedure] go use[TestProcedure] go
第二步:生成主要存储过程
Code SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO /**//*生成一个Delete记录的存储过程************************* tony 2009.06.06 Update MSN:3w@live.cn @sTableName 表名 @bExecute 是否执行 默认0不执行 */ CREATEPROC CPP__SYS_MakeDeleteRecordProc @sTableNamevarchar(128), @bExecutebit=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@sProcTextvarchar(8000), @sKeyFieldsvarchar(2000), @sWhereClausevarchar(2000), @sColumnNamevarchar(128), @nColumnIDsmallint, @bPrimaryKeyColumnbit, @nAlternateTypeint, @nColumnLengthint, @nColumnPrecisionint, @nColumnScaleint, @IsNullablebit, @IsIdentityint, @sTypeNamevarchar(128), @sDefaultValuevarchar(4000), @sCRLFchar(2), @sTABchar(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 cursorfor SELECT* FROM dbo.fnTableColumnInfo(@sTableName) ORDERBY2 OPEN crKeyFields FETCHNEXT 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(@nColumnPrecisionASvarchar(3)) +', ' +CAST(@nColumnScaleASvarchar(3)) +')' ELSEIF (@nAlternateType=1) --character and binary SET@sKeyFields=@sKeyFields+'('+CAST(@nColumnLengthASvarchar(4)) +')' IF (@sWhereClause='') SET@sWhereClause=@sWhereClause+'WHERE ' ELSE SET@sWhereClause=@sWhereClause+' AND ' SET@sWhereClause=@sWhereClause+@sTAB+@sColumnName+' = @'+@sColumnName+@sCRLF END FETCHNEXT 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:3w@live.cn @sTableName 表名 @bExecute 是否执行 默认0不执行 */ CREATEPROC CPP__SYS_MakeInsertRecordProc @sTableNamevarchar(128), @bExecutebit=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@sProcTextvarchar(8000), @sKeyFieldsvarchar(2000), @sAllFieldsvarchar(2000), @sAllParamsvarchar(2000), @sWhereClausevarchar(2000), @sColumnNamevarchar(128), @nColumnIDsmallint, @bPrimaryKeyColumnbit, @nAlternateTypeint, @nColumnLengthint, @nColumnPrecisionint, @nColumnScaleint, @IsNullablebit, @IsIdentityint, @HasIdentityint, @sTypeNamevarchar(128), @sDefaultValuevarchar(4000), @sCRLFchar(2), @sTABchar(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 cursorfor SELECT* FROM dbo.fnTableColumnInfo(@sTableName) ORDERBY2 OPEN crKeyFields FETCHNEXT 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' ELSEIF (@sDefaultValueISNOTNULL) 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(@nColumnPrecisionASvarchar(3)) +', ' +CAST(@nColumnScaleASvarchar(3)) +')' ELSEIF (@nAlternateType=1) --character and binary SET@sKeyFields=@sKeyFields+'('+CAST(@nColumnLengthASvarchar(4)) +')' IF (@IsIdentity=0) BEGIN IF (@sDefaultValueISNOTNULL) OR (@IsNullable=1) OR (@sTypeName='timestamp') SET@sKeyFields=@sKeyFields+' = NULL' END FETCHNEXT 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:3w@live.cn @sTableName 表名 @bExecute 是否执行 默认0不执行 */ CREATEPROC CPP__SYS_MakeSelectRecordProc @sTableNamevarchar(128), @bExecutebit=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@sProcTextvarchar(8000), @sKeyFieldsvarchar(2000), @sSelectClausevarchar(2000), @sWhereClausevarchar(2000), @sColumnNamevarchar(128), @nColumnIDsmallint, @bPrimaryKeyColumnbit, @nAlternateTypeint, @nColumnLengthint, @nColumnPrecisionint, @nColumnScaleint, @IsNullablebit, @IsIdentityint, @sTypeNamevarchar(128), @sDefaultValuevarchar(4000), @sCRLFchar(2), @sTABchar(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 cursorfor SELECT* FROM dbo.fnTableColumnInfo(@sTableName) ORDERBY2 OPEN crKeyFields FETCHNEXT 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(@nColumnPrecisionASvarchar(3)) +', ' +CAST(@nColumnScaleASvarchar(3)) +')' ELSEIF (@nAlternateType=1) --character and binary SET@sKeyFields=@sKeyFields+'('+CAST(@nColumnLengthASvarchar(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 FETCHNEXT 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:3w@live.cn @sTableName 表名 @bExecute 是否执行 默认0不执行 */ CREATEPROC CPP__SYS_MakeUpdateRecordProc @sTableNamevarchar(128), @bExecutebit=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@sProcTextvarchar(8000), @sKeyFieldsvarchar(2000), @sSetClausevarchar(2000), @sWhereClausevarchar(2000), @sColumnNamevarchar(128), @nColumnIDsmallint, @bPrimaryKeyColumnbit, @nAlternateTypeint, @nColumnLengthint, @nColumnPrecisionint, @nColumnScaleint, @IsNullablebit, @IsIdentityint, @sTypeNamevarchar(128), @sDefaultValuevarchar(4000), @sCRLFchar(2), @sTABchar(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 cursorfor SELECT* FROM dbo.fnTableColumnInfo(@sTableName) ORDERBY2 OPEN crKeyFields FETCHNEXT 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(@nColumnPrecisionASvarchar(3)) +', ' +CAST(@nColumnScaleASvarchar(3)) +')' ELSEIF (@nAlternateType=1) --character and binary SET@sKeyFields=@sKeyFields+'('+CAST(@nColumnLengthASvarchar(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' ELSEIF (@sDefaultValueISNOTNULL) 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 FETCHNEXT 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
Code /**//*生成一些通用的Function ************************* tony 2009.06.06 Update MSN:3w@live.cn @sTableName 表名 @bExecute 是否执行 默认0不执行 */ SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO CREATEFUNCTION dbo.fnCleanDefaultValue(@sDefaultValuevarchar(4000)) RETURNSvarchar(4000) AS BEGIN RETURNSubString(@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 CREATEFUNCTION dbo.fnColumnDefault(@sTableNamevarchar(128), @sColumnNamevarchar(128)) RETURNSvarchar(4000) AS BEGIN DECLARE@sDefaultValuevarchar(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 CREATEFUNCTION dbo.fnIsColumnPrimaryKey(@sTableNamevarchar(128), @nColumnNamevarchar(128)) RETURNSbit AS BEGIN DECLARE@nTableIDint, @nIndexIDint, @iint SET@nTableID=OBJECT_ID(@sTableName) SELECT@nIndexID= indid FROM sysindexes WHERE id =@nTableID AND indid BETWEEN1And254 AND (status &2048) =2048 IF@nIndexIDIsNull RETURN0 IF@nColumnNameIN (SELECT sc.[name] FROM sysindexkeys sik INNERJOIN syscolumns sc ON sik.id = sc.id AND sik.colid = sc.colid WHERE sik.id =@nTableID AND sik.indid =@nIndexID) BEGIN RETURN1 END RETURN0 END GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO CREATEFUNCTION dbo.fnTableColumnInfo(@sTableNamevarchar(128)) RETURNSTABLE AS RETURN SELECT c.name AS sColumnName, c.colid AS nColumnID, dbo.fnIsColumnPrimaryKey(@sTableName, c.name) AS bPrimaryKeyColumn, CASEWHEN t.name IN ('char', 'varchar', 'binary', 'varbinary', 'nchar', 'nvarchar') THEN1 WHEN t.name IN ('decimal', 'numeric') THEN2 ELSE0 ENDAS 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 INNERJOIN 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 CREATEFUNCTION dbo.fnTableHasPrimaryKey(@sTableNamevarchar(128)) RETURNSbit AS BEGIN DECLARE@nTableIDint, @nIndexIDint SET@nTableID=OBJECT_ID(@sTableName) SELECT@nIndexID= indid FROM sysindexes WHERE id =@nTableID AND indid BETWEEN1And254 AND (status &2048) =2048 IF@nIndexIDISNOTNull RETURN1 RETURN0 END GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO