如何在sql中创建公共代码方法

时间:2018-02-17 17:18:28

标签: sql-server tsql

我的存储过程工作正常。我的问题是我重复动态查询3次使用它: -

    --For Note
    SET @TblMaterial = 'ClassNote'
    SET @ColMaterialID = 'ClassNoteID'
    SET @ColMaterialFK = 'ClassNoteFK'              
    SET @cmdForMaterial = N'UPDATE '+@TblMaterial+' Set Status_Info = 0 where '+@ColMaterialID+' in ( Select s.'+@ColMaterialFK+' from  '+@RelTbl+' s where s.' +  @ColForFK + ' = ' +  @MainID + ' AND s.ClassSubjectFK IN ( SELECT T.ClassSubjectFK FROM ' + @RelTbl + ' T WHERE  T.'+@ColForFK+' = '+ @MainID + ') and s.ClassSubjectFK NOT IN ( SELECT E.ClassSubjectFK FROM ' +@RelTbl+' E WHERE E.'+@ColForFK+' != '+ @MainID +') and s.'+@ColMaterialFK+'  is not null )'
    EXEC(@cmdForMaterial)

    --For EBook
    SET @TblMaterial = 'ClassEbook'
    SET @ColMaterialID = 'ClassEbookID'
    SET @ColMaterialFK = 'ClassEbookFK'
    SET @cmdForMaterial = N'UPDATE '+@TblMaterial+' Set Status_Info = 0 where '+@ColMaterialID+' in ( Select s.'+@ColMaterialFK+' from  '+@RelTbl+' s where s.' +  @ColForFK + ' = ' +  @MainID + ' AND s.ClassSubjectFK IN ( SELECT T.ClassSubjectFK FROM ' + @RelTbl + ' T WHERE  T.'+@ColForFK+' = '+ @MainID + ') and s.ClassSubjectFK NOT IN ( SELECT E.ClassSubjectFK FROM ' +@RelTbl+' E WHERE E.'+@ColForFK+' != '+ @MainID +') and s.'+@ColMaterialFK+'  is not null )'
    EXEC(@cmdForMaterial)

    --For SP
    SET @TblMaterial = 'ClassSamplePaper'
    SET @ColMaterialID = 'ClassSamplePaperID'
    SET @ColMaterialFK = 'ClassSPFK'
    SET @cmdForMaterial = N'UPDATE '+@TblMaterial+' Set Status_Info = 0 where '+@ColMaterialID+' in ( Select s.'+@ColMaterialFK+' from  '+@RelTbl+' s where s.' +  @ColForFK + ' = ' +  @MainID + ' AND s.ClassSubjectFK IN ( SELECT T.ClassSubjectFK FROM ' + @RelTbl + ' T WHERE  T.'+@ColForFK+' = '+ @MainID + ') and s.ClassSubjectFK NOT IN ( SELECT E.ClassSubjectFK FROM ' +@RelTbl+' E WHERE E.'+@ColForFK+' != '+ @MainID +') and s.'+@ColMaterialFK+'  is not null )'
    EXEC(@cmdForMaterial)

我只是想知道是否有任何出路以便我可以设置此代码: -

SET @cmdForMaterial = N'UPDATE '+@TblMaterial+' Set Status_Info = 0 where '+@ColMaterialID+' in ( Select s.'+@ColMaterialFK+' from  '+@RelTbl+' s where s.' +  @ColForFK + ' = ' +  @MainID + ' AND s.ClassSubjectFK IN ( SELECT T.ClassSubjectFK FROM ' + @RelTbl + ' T WHERE  T.'+@ColForFK+' = '+ @MainID + ') and s.ClassSubjectFK NOT IN ( SELECT E.ClassSubjectFK FROM ' +@RelTbl+' E WHERE E.'+@ColForFK+' != '+ @MainID +') and s.'+@ColMaterialFK+'  is not null )'

一次并多次使用它?

1 个答案:

答案 0 :(得分:0)

避免使用动态查询,您可以编写更易于管理的简单更新语句。

如果在这种情况下无法将其更改为正常更新查询,则可以继续 对于具有所需参数的存储过程,并使用不同的参数多次调用它。

不推荐: 如果你不能选择上述任何一个选项,你可以尝试以下。

  CREATE TABLE  #T(
  [Index] INT Identity ,ColMaterialID VARCHAR(100)
   , ColMaterialFK  VARCHAR(100),TblMaterial VARCHAR(100)
  )


INSERT INTO  #T(ColMaterialID,ColMaterialFK,TblMaterial)
SELECT 'ClassNote','ClassNoteID','ClassNoteFK'  

--Insert Remaning values 


WHILE(SELECT COUNT(*) FROM #T) > 0
BEGIN
 --Read the top 1 from temp table
 --Build the Query and Execute
 --Remove the processed entiry

END
相关问题