Skabe, der er gemt procedure med at erklære, og sæt variabler

At jeg skaber en lagret procedure, hvor der kun er værdien, der er til at passere, og jeg er nødt til at hente flere værdier fra flere tabeller. Jeg forsøgte at gøre som dette, men viser fejl som

Forkert Syntaks nær Begynde

og

Skal erklære skalar variabel @OrderID

Declare @OrderItemID AS INT
DECLARE @AppointmentID AS INT
DECLARE @PurchaseOrderID AS INT
DECLARE @PurchaseOrderItemID AS INT
DECLARE @SalesOrderID AS INT
DECLARE @SalesOrderItemID AS INT

SET @OrderItemID = (SELECT OrderItemID FROM [OrderItem] WHERE OrderID = @OrderID)

SET @AppointmentID = (SELECT  AppoinmentID FROM [Appointment] WHERE OrderID = @OrderID)

SET @PurchaseOrderID = (SELECT  PurchaseOrderID FROM [PurchaseOrder] WHERE OrderID = @OrderID)
Hvor er @OrderID erklæret? Bedes du sende hele den procedure, der er ingen BEGIN i det kode du har postet. Også derfor er du tildeler til variablerne så bruger aldrig de resultater, hvor som helst? Bør disse være output-parametre?
Da jeg antager, at der kan være for mange elementer, aftaler, eller indkøbsordrer til en ordre, kan du beskrive, hvilken du ønsker at tildele variabel? Det kan også hjælpe at skrive hele koden som @Martin foreslog, og også at skrive dit egentlige mål, nogle eksempler på data og ønskede resultater.

OriginalForfatteren LovingMVC | 2012-02-11

2 svar

  1. 17

    Bør du prøve denne syntaks – hvis du ønsker at have @OrderID som en parameter for din lagrede procedure:

    CREATE PROCEDURE dbo.YourStoredProcNameHere
       @OrderID INT
    AS
    BEGIN
     DECLARE @OrderItemID AS INT
     DECLARE @AppointmentID AS INT
     DECLARE @PurchaseOrderID AS INT
     DECLARE @PurchaseOrderItemID AS INT
     DECLARE @SalesOrderID AS INT
     DECLARE @SalesOrderItemID AS INT
    
     SELECT @OrderItemID = OrderItemID 
     FROM [OrderItem] 
     WHERE OrderID = @OrderID
    
     SELECT @AppointmentID = AppoinmentID 
     FROM [Appointment] 
     WHERE OrderID = @OrderID
    
     SELECT @PurchaseOrderID = PurchaseOrderID 
     FROM [PurchaseOrder] 
     WHERE OrderID = @OrderID
    
    END

    Selvfølgelig, at det kun virker, hvis du returnerer præcis én værdi (ikke flere værdier!)

    OriginalForfatteren marc_s

  2. 6

    Jeg antage, at du ønsker at passere Ordre-ID. Så:

    CREATE PROCEDURE [dbo].[Procedure_Name]
    (
        @OrderID INT
    ) AS
    BEGIN
        Declare @OrderItemID AS INT
        DECLARE @AppointmentID AS INT
        DECLARE @PurchaseOrderID AS INT
        DECLARE @PurchaseOrderItemID AS INT
        DECLARE @SalesOrderID AS INT
        DECLARE @SalesOrderItemID AS INT
    
        SET @OrderItemID = (SELECT OrderItemID FROM [OrderItem] WHERE OrderID = @OrderID)
        SET @AppointmentID = (SELECT AppoinmentID FROM [Appointment] WHERE OrderID = @OrderID)
        SET @PurchaseOrderID = (SELECT PurchaseOrderID FROM [PurchaseOrder] WHERE OrderID = @OrderID)
    END
    Jeg ved ikke, jeg tror det er personlige præferencer, men det er tydeligere, hvad der foregår ved hjælp af SET, især for en enkelt værdi. Ellers bliver det skjult i hele SELECT erklæring.
    På den anden side, dit resultat er udefineret, fordi du har brugt TOP uden ORDER BY – det vil vælge en vilkårlig række. Jeg ville foretrække at udelade de TOP – på denne måde, hvis du mente det indre forespørgsel til kun at vælge et træk, får du en fejl på anden måde. Med SELECT @OrderItemID = eller TOP 1 tilgange, du får vilkårlig række lydløst. I de tilfælde, hvor OrderID er den primære nøgle, det er én ting, men i andre tilfælde jeg tror, vi har brug for en bedre definition af, hvilke AppointmentID / PurchaseOrderID er faktisk ønskede. Den ældste? Den seneste? Den ene med den højeste værdi?
    Fair kommentar om TOP

    OriginalForfatteren twilson

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *