我创建了一个存储过程的表。我有近50个不同的值要输入存储过程,所以我创建了一个表来执行它们从db本身捕获值。以下是我正在使用的流程。
DECLARE @spvariable varchar(max);
SELECT @spvariable = e.ExecutionQuery FROM dbo.tmpsptable e where e.ID = @cnt;
Exec @spvariable;
在存储过程中,我有一个在执行每个存储过程后返回的值,表示在SP的末尾有一个带有SCOPE_IDENTITY()的select语句。当然,每个值都是唯一的。现在问题是,对于每次执行,我想将返回的值存储在我的表tmpsptable中。但是如何调用它并保存在特定行?
阻止Openrowset在我的服务器上使用它。我不能将insert语句添加到同一个SP中,因为它也用于其他目的。
以下是我正在尝试的那个。我知道在这种情况下使用OUTPUT参数是错误的。但是什么可以成为解决方案?
DECLARE @spvariable VARCHAR(MAX);
DECLARE @id INT;
DECLARE @insertedId TABLE(id INT);
DECLARE @cnt INT= 1;
WHILE @cnt <= 10
BEGIN
SELECT @spvariable = e.ExecutionQuery FROM dbo.tmpsptable e where e.ID = @cnt;
EXEC @spvariable;
OUTPUT INSERTED.SerialNumber
INTO @insertedId;
UPDATE e
SET
SerialNumber = @insertedId
FROM dbo.tmpsptable e
WHERE e.ID = @cnt;
SET @cnt = @cnt + 1;
END;
答案 0 :(得分:1)
如果我了解您要执行的操作,则需要使用INSERT..EXEC 语法。有许多限制,但它应该适合你:
DECLARE @spvariable VARCHAR(MAX);
DECLARE @id INT;
--DECLARE @insertedId TABLE(id INT);
-- you cannot INSERT from an EXEC into a @table variable
CREATE TABLE #insertedId(id INT);
DECLARE @cnt INT= 1;
WHILE @cnt <= 10
BEGIN
SELECT @spvariable = e.ExecutionQuery FROM dbo.tmpsptable e where e.ID = @cnt;
DELETE FROM #instertedId;
-- NOTE: the EXEC Result Set must exactly match the column types
INSERT INTO #insertedId
EXEC @spvariable;
UPDATE e
SET
SerialNumber = (Select TOP 1 id From #insertedId)
FROM dbo.tmpsptable e
WHERE e.ID = @cnt;
SET @cnt = @cnt + 1;
END;
答案 1 :(得分:0)
I know using OUTPUT parameter is wrong
- 为什么?
如果您正在使用SCOPE_IDENTITY()
,那么这始终是每个SP调用创建的单行,那么您肯定可以将此标量值作为输出参数返回:
EXEC @spvariable
@newID = @newID output
但总的来说我不喜欢你的做法。 WHILE
,单行SP ......