我创建了一个存储过程的表。我有近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;
如果我理解你想要做什么,你想要使用INSERT..EXEC syntax。有许多限制,但它可能适合您:
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;
I know using OUTPUT parameter is wrong
- 为什么?
如果您正在使用SCOPE_IDENTITY()
,那么这始终是每个SP调用创建的单行,那么您肯定可以将此标量值作为输出参数返回:
EXEC @spvariable
@newID = @newID output
但总的来说,我不喜欢你的做法。 WHILE
,单排SP ......