表在每行中都有sql语句。我如何按顺序运行每个?

时间:2014-10-30 12:59:00

标签: sql sql-server tsql

我正在使用Microsoft SQL Server。我的数据库中有一个表。第一行是数字顺序的Item #,第二列是我需要运行的T-SQL的确切行。

如何按项目编号的顺序编写调用每一行的内容?

 Item #       Code
 ------       ----
   1          UPDATE GOC_AU_INTERSECTION SET GOC_AU_INTERSECTION.DSMT_BUSINESS = 'BUSA',
              GOC_AU_INTERSECTION.RULE_CODE = '101'  FROM DSMT_GOC_FLAT, GOC_AU_INTERSECTION                     
              WHERE GOC_AU_INTERSECTION.RULE_CODE Is Null AND DSMT_GOC_FLAT.MS_Level_10='14197'           
              AND DSMT_GOC_FLAT.GOC = GOC_AU_INTERSECTION.GOC;  

   2          UPDATE GOC_AU_INTERSECTION SET GOC_AU_INTERSECTION.DSMT_BUSINESS = 'BUSA',           
              GOC_AU_INTERSECTION.RULE_CODE = '102' FROM DSMT_GOC_FLAT, GOC_AU_INTERSECTION            
              WHERE GOC_AU_INTERSECTION.RULE_CODE Is Null AND DSMT_GOC_FLAT.MS_Level_10='14198'             
              AND DSMT_GOC_FLAT.GOC = GOC_AU_INTERSECTION.GOC;     

   3          UPDATE GOC_AU_INTERSECTION SET GOC_AU_INTERSECTION.DSMT_BUSINESS = 'BUSA', 
              GOC_AU_INTERSECTION.RULE_CODE = '103' FROM DSMT_GOC_FLAT, GOC_AU_INTERSECTION 
              WHERE GOC_AU_INTERSECTION.RULE_CODE Is Null AND DSMT_GOC_FLAT.MS_Level_10='14202' 
              AND DSMT_GOC_FLAT.GOC = GOC_AU_INTERSECTION.GOC ;

3 个答案:

答案 0 :(得分:2)

您可以使用光标和sp_executesql

执行此操作
DECLARE @sqlStmt VARCHAR(4000);

DECLARE exCursor CURSOR FOR
SELECT Column2 FROM table ORDER BY Column1;

OPEN exCursor;

FETCH NEXT FROM exCursor INTO @sqlStmt;

WHILE @@FETCH_STATUS = 0
BEGIN
    EXECUTE sp_executesql @sqlStmt;

    FETCH NEXT FROM exCursor INTO @sqlStmt;
END

CLOSE exCursor;
DEALLOCATE exCursor;

将创建游标以从您的语句表中查询并检索您的sql语句,按column1排序。然后,您将获得每个语句并执行它。

详细了解

sp_executesql的另一个问题是你也可以传递参数。我注意到你的陈述非常重复 - 你可以有一个包含查询的表和一个带参数的表。如果这是一个长期解决方案,那可能是一个好主意。

答案 1 :(得分:1)

我讨厌CURSORS,所以我会建议你构建一个动态SQL语句,然后执行它。 这是完整的工作示例:

SET NOCOUNT ON
GO

    DECLARE @Statement TABLE
    (
        [Item #] TINYINT IDENTITY(1,1)
       ,[Code] NVARCHAR(32)
    )

    INSERT INTO @Statement ([Code])
    VALUES ('SELECT 1')
          ,('SELECT 2')
          ,('SELECT 3')

    DECLARE @DynamicSQLStatement NVARCHAR(MAX)

    SET @DynamicSQLStatement =
    (
        SELECT CHAR(10) + CHAR(13) + [Code] + CHAR(10) + CHAR(13)
        FROM @Statement
        ORDER BY [Item #]
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)')

    --SELECT @DynamicSQLStatement

    EXEC sp_executesql @DynamicSQLStatement


SET NOCOUNT OFF
GO

答案 2 :(得分:1)

最简单的方法是

  declare @sql nvarchar(max)=''
  select @sql+= Code+' ' from tablename order by Item#
  exec sp_executesql  @sql

@DanielGimenez + =是一个有效的TSQL运算符。检查一下

DECLARE @string varchar(10) = 'abc'

SET @string += 'def'

print @string