2009-02-19 8 views
0

Je suis convertir des données dans SQL Server 2005. J'ai une mise à jour de table comme ceci:Puis-je utiliser une sortie de procédure de magasin dans une instruction de mise à jour dans SQL Server?

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

Mais ce que je voudrais brancher au lieu de « NewRef » est la sortie d'une procédure stockée utilise les paramètres des colonnes de la table Factures. La procédure stockée elle-même met à jour une autre table. C'est possible? Quelque chose comme ceci ci-dessous (ce qui est faux bien sûr :)

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' 

Ai-je besoin d'utiliser un curseur ou la syntaxe tout simplement faux?

Merci, Chris.

Répondre

0

Vous y êtes presque, la manière correcte de réaliser ce que vous voulez faire serait de définir un paramètre de sortie dans le cadre de votre définition de procédure stockée.

Ce paramètre peut ensuite être utilisé dans le cadre de votre instruction de mise à jour.

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

Salut, merci pour la réponse, mais il est pas tout à fait ce que je suis après. Les paramètres du processus stocké doivent provenir de la ligne en cours de mise à jour. Donc, si j'avais 2 lignes dans les factures, la mise à jour donnerait des références différentes aux lignes en fonction des données dans les colonnes des lignes. J'espère que cela a du sens! – Chris

+0

J'aurais dû le rendre plus clair dans mon exemple, désolé :( – Chris

2

Je pense que vous feriez mieux de changer votre procédure stockée en une fonction ou une vue (en fonction de ce que vous faites réellement dans le proc).

Je pense que ce que vous recherchez est de rejoindre le jeu de résultats d'un proc stocké qui ne fonctionnerait pas.

0

1) Vous pouvez modifier InvoiceGenerateRef afin qu'il puisse sauvegarder le champ Ref dans le champ InvoiceReference. On peut supposer que vous auriez également fournir des paramètres pour définir la sélection

2) Vous pouvez nous e curseur à l'étape autour de chaque ligne dans

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

et passer les détails à InvoiceGenerateRef puis mettez à jour la ligne. Ceci est mauvais à mon humble avis et sera lent (Votre meilleur pari est une solution basée sur l'ensemble)

3) Vous pouvez sélectionner les Factures.ID appropriées dans une table temporaire qui serait dans la portée de l'InvoiceGenerateRef afin qu'il puisse itérer que (le choix des lignes à mettre à jour est externe au SProc, mais le SProc fait la mise à jour réelle)

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) Vous pouvez changer InvoiceGenerateRef à une fonction qui a effectué la même tâche:

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

MyInvoiceGenerateRefFunction doivent être déterministe (je pense!)

Ce serait mon choix préféré

Questions connexes