我可以在SQL Server的更新语句中使用存储过程输出吗?

时间:2009-02-19 11:25:40

标签: sql sql-server sql-server-2005

我正在转换SQL Server 2005中的一些数据。我有一个像这样的表更新:

update Invoices set Invoices.InvoiceReference = 'NewRef'
where Invoices.InvoiceReference='Unknown'

但我想插入而不是'NewRef'是来自使用Invoices表列中的参数的存储过程的输出。存储过程本身会更新另一个表。可能吗?下面这样的东西(当然这是错的:)。

DECLARE @Ref nvarchar(20)   
update Invoices set Invoices.InvoiceReference = (
    EXEC InvoiceGenerateRef
        @ClientCode = Invoices.ClientCode,
        @EventCode = Invoices.EventCode,
        @Ref = @Ref OUTPUT
    SELECT @Ref)
where Invoices.InvoiceReference='Unknown'

我是否需要使用游标或语法错误?

谢谢, 克里斯。

4 个答案:

答案 0 :(得分:2)

我认为最好将存储过程更改为函数或视图(取决于您在proc中实际执行的操作)。

我认为你所追求的是加入存储过程的结果集,这将无效。

答案 1 :(得分:1)

您几乎就在那里,实现您要做的事情的正确方法是将输出参数定义为存储过程定义的一部分。

然后可以将此参数用作更新语句的一部分。

DECLARE @Ref nvarchar(20)  

EXEC InvoiceGenerateRef
        @ClientCode = N'ABC2',
        @EventCode = N'X1'
        @Ref = @Ref OUTPUT

update Invoices 
    set Invoices.InvoiceReference = @Ref
where Invoices.InvoiceReference='Unknown'

答案 2 :(得分:0)

通过使用OPENROWSET,您可以像查看视图一样查询存储过程结果:

http://blogs.technet.com/wardpond/archive/2005/08/01/the-openrowset-trick-accessing-stored-procedure-output-in-a-select-statement.aspx

因此,对于您的情况,这可能很有用。

答案 3 :(得分:0)

1)您可以更改InvoiceGenerateRef,以便可以选择将生成的Ref保存到InvoiceReference字段中。据推测,您还必须提供参数来定义选择

2)你可以用光标绕过

中的每一行
SELECT ...
FROM Invoices 
WHERE Invoices.InvoiceReference='Unknown'

并将详细信息传递给InvoiceGenerateRef,然后更新该行。这是糟糕的恕我直言,将会很慢(你最好的选择是一个基于集合的解决方案)

3)您可以选择适当的Invoices.ID进入临时表,该临时表将在InvoiceGenerateRef的范围内,以便它可以迭代(即更新的WHICH行的选择是在SProc外部,但SProc确实实际更新)

CREATE TABLE #TEMP
(
    T_ID int NOT NULL
)

INSERT INTO #TEMP (T_ID)
SELECT ID
FROM Invoices 
WHERE Invoices.InvoiceReference='Unknown'

EXEC InvoiceGenerateRef @ACTION='UpdateFromTemporaryTable'

4)您可以将InvoiceGenerateRef更改为执行相同任务的函数:

UPDATE U
SET U.InvoiceReference = 
    dbo.MyInvoiceGenerateRefFunction(U.ClientCode, U.EventCode)
FROM Invoices AS U
WHERE U.InvoiceReference='Unknown'

MyInvoiceGenerateRefFunction必须是确定性的(我想!)

这是我的首选