问题描述
|
我需要编写一个仅包含执行语句的过程。
例:
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,@tdcol
END
close ticker
deallocate ticker