2017-03-26 1 views
0

Ich habe eine gespeicherte Prozedur, die eine SELECT-Anweisung ausgibt, wie Sie unten sehen:Wie gespeicherte Prozedur geschrieben wird, die SELECT-Anweisung als Eingabeparameter übergeben?

select case when count(*) > 10 then ''A1'' else ''B1'' end as id, name, address from database.dbo.student 

Jetzt habe ich eine gespeicherte Prozedur schreiben möchten, die eine solche select Anweisung als String-Eingang nimmt und alle oben genannten Ausgänge zurück. Ich bin mir nicht sicher, wo ich die Ausgangsvariablen zuweisen soll.

ALTER PROCEDURE dbo.selectAttributes 
    @select_statement Nvarchar(MAX), 
    @id Nvarchar(255) OUT, 
    @name nvarchar(255) OUT, 
    @address nvarchar(255) OUT 
AS 
BEGIN 
    DECLARE @query nvarchar(MAX) 

    SET @query = @select_statement 

    EXEC sp_executesql @query, 
         N'@select_statement Nvarchar(MAX), 
         @idOUT Nvarchar(255) OUTPUT, 
         @nameOUT nvarchar(255) OUTPUT, 
         @addressOUT nvarchar(255) OUTPUT', 
         @select_statement, @id OUTPUT, @name OUTPUT, @address OUTPUT 
END 

Antwort

1

Ich glaube, Sie sind in der Nähe:

ALTER PROCEDURE dbo.selectAttributes (
    @select_statement Nvarchar(MAX), 
    @id Nvarchar(255) OUTPUT, 
    @name nvarchar(255) OUTPUT, 
    @address nvarchar(255) OUTPUT 
) AS 
BEGIN 
    EXEC sp_executesql @select_statement, 
     N'@id Nvarchar(255) OUTPUT, @name nvarchar(255) OUTPUT, @address nvarchar(255) OUTPUT', 
      @id = @id OUTPUT, 
      @name = @name OUTPUT, 
      @address = @address OUTPUT 
END; 

Mit anderen Worten:

  • Sie haben überall die OUTPUT Stichwort zu setzen.
  • Die Abfragezeichenfolge wird nicht als Parameter eingegeben.
  • Ich die Parameter nicht umbenennen, aber wenn Sie dies tun, müssen sie irgendwo deklariert werden.
+0

Was passiert, wenn die Anweisung 'select' einen Alias ​​enthält? Zum Beispiel, wählen Sie die Groß-/Kleinschreibung aus, wenn die Anzahl (*)> 10, dann '' A1 '' else '' B1 '' als ID, Name, Adresse aus der Datenbank.dbo.student endet. In diesem Fall gibt der Ausgabeparameter null –

+0

@AyanabhChakraborty zurück. . . Ich denke nicht, dass diese Art von dynamischem SQL für eine übergebene Abfrage im Allgemeinen eine gute Idee ist. Aber das ist nicht das Thema Ihrer Frage. Das Thema ist, wie Sie die gespeicherte Prozedur dazu bringen, das zu tun, was Sie wollen und darauf antworten Sie. Die Argumente müssen miteinander kompatibel sein. –

+0

Ja, ich stimme dir zu. In meiner Implementierung übergebe ich es nicht manuell. Es ist eigentlich ein komplizierter Stored-Proc mit dynamischer Tabelle, Schema und Datenbankname als Eingaben, die Berechnungen durchführen und eine select-Anweisung werfen, die ich behandeln muss, um die Spalten daraus zu machen. Ich habe gerade den ersten gespeicherten Proc so modifiziert, dass er mir etwas ausgibt, wie 'select @id = case wenn count (*)> 10 dann '' A1 '' else '' B1 '' end, ....' und es hat funktioniert. Vielen Dank! –

Verwandte Themen