如何为此编写动态SQL?

| 我需要编写一个仅包含执行语句的过程。 例:
Create Procedure dbo.allSPExecute( @id int)
as
begin

EXEC dbo.tic @day= 7,@name = \'Gname\',@Type = \'Utype\'
EXEC dbo.tic @day= 7,@name = \'tname\',@Type = \'Utype\'
EXEC dbo.gtype @day = 7,@Tname = \'UName_By\',@Udept = \'Dept\'

End
我有50多个这样的语句。我有一个表是Lookup:
ID  Name        SCol      Dcol       IOrd
1   dbo.tic     Gname     @name       1
1   dbo.tic     tname     @name       2
1   dbo.tic     Utype     @Type       1
1   dbo.tic     Utype     @Type       2
2   dbo.gtype   UName_By  @Tname      1
2   dbo.gtype   Dept      @Udept      1
有没有一种方法,如果我通过ID,它将从Lookup表中获取值并执行该过程。有人可以帮忙吗? 编辑:从查阅表和创建过程更改了数据     
已邀请:
        这是不需要游标的解决方案。我正在使用FOR XML关键字将字符串连接在一起。我在两个地方执行此操作-一次用于连接参数列表,一次用于连接所有单个exec语句。我还没有测试过,但是我认为这应该比使用游标快得多
CREATE PROCEDURE dbo.allSPExecute( @id INT ) 
AS  
BEGIN   
  DECLARE @query VARCHAR(MAX);   
  SELECT @query =   (
    SELECT ExecPart + \' \' + SUBSTRING(Params,2,LEN(Params)) + CHAR(10)
    FROM
    (
      SELECT 
        ExecPart =\'EXEC \' +(SELECT TOP 1 Name FROM MyTable WHERE ID = @id) ,
        Params = (SELECT \', \' + Dcol + \' = \' + Scol 
                  FROM MyTable t1 WHERE ID = @id AND t1.IOrd = t.IOrd FOR XML PATH(\'\'))
      FROM MyTable t
      WHERE ID = @id
      GROUP BY IOrd
    ) t
    FOR XML PATH(\'\')   
  ) 

  EXEC (@query) 
END
    
        最简单的解决方案-使您的存储过程如下:
Create Procedure dbo.allSPExecute( @id int)
as

DECLARE @SQL varchar(max)

SET @SQL = \'USE MyDB\'

SELECT @SQL = @SQL +
\'EXEC \' + t.Name + \' @day = 7,\' + t.Dcol + \' = \'\'\' + t.Scol + \'\'
FROM MyTable t
WHERE t.id = @ID

EXEC (@SQL)
    
        这是一个从头开始编写且未经测试的游标示例:
declare @dynsql as nvarchar(300)
declare @tname as nvarchar(100)
declare @tscol as nvarchar(100)
declare @tdcol as nvarchar(100)

set @dynsql = \'\'

declare ticker as cursor for select Name, SCol, DCol from Lookup
open ticker
fetch next from ticker into @tname, @tscol, @tdcol

while @@FETCH_STATUS = 0
BEGIN

set @dynsql = \'EXEC \' + @tname + \' @day=7, \' + @tdcol + \'=\'\'\' + @tscol + \'\'\'\'

exec(@dynsql)

FETCH NEXT from ticker into @tname, @tscol, @tdcol
END

close ticker
deallocate ticker
    

要回复问题请先登录注册