Могу ли я использовать вывод процедуры хранения в операторе обновления в SQL Server? - PullRequest
0 голосов
/ 19 февраля 2009

Я конвертирую некоторые данные в 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 ]

2 голосов
/ 19 февраля 2009

Я думаю, вам лучше поменять хранимую процедуру на функцию или представление (в зависимости от того, что вы на самом деле делаете в процедуре).

Я думаю, что вам нужно присоединиться к набору результатов сохраненного процесса, который не будет работать.

1 голос
/ 19 февраля 2009

Вы почти на месте, правильный способ добиться того, что вы хотите сделать, - это определить выходной параметр как часть определения вашей хранимой процедуры.

Этот параметр затем можно использовать как часть вашего оператора обновления.

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'
0 голосов
/ 19 февраля 2009

1) Вы можете изменить InvoiceGenerateRef, чтобы он мог дополнительно сохранять сгенерированный Ref в поле InvoiceReference. Предположительно, вы также должны предоставить параметры для определения выбора

2) Вы можете использовать курсор для обхода каждой строки в

SELECT ...
FROM Invoices 
WHERE Invoices.InvoiceReference='Unknown'

и передайте детали InvoiceGenerateRef, а затем обновите строку. Это плохо ИМХО и будет медленным (Ваша лучшая ставка - решение на основе множеств)

3) Вы можете выбрать соответствующие Invoices.ID во временной таблице, которая будет находиться в области видимости для InvoiceGenerateRef, чтобы он мог выполнять эту итерацию (т. Е. Выбор КАКОГО строки для обновления является внешним для 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 должна быть детерминированной (я думаю!)

Это был бы мой предпочтительный выбор

0 голосов
/ 19 февраля 2009

с помощью OPENROWSET вы можете запрашивать результаты вашей хранимой процедуры так же, как представление:

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

так что для вашего случая это может быть полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...