2016-10-23 7 views
-1

Ich verwende SQL Server 2012.Warum erhalte ich Fehler beim Versuch, gespeicherte Prozeduren zu starten?

Ich muss ein Array von ganzen Zahlen an meine gespeicherte Prozedur von Visual Studio übergeben. Ich muss übergebene Array in where Klausel verwenden.

Zu diesem Zweck ich table valued parameter erstellt:

CREATE TYPE IdArray AS TABLE 
(
    Id int 
); 

Und hier meine gespeicherten Prozedur:

ALTER PROCEDURE [dbo].[SP_TEST_TLP] 
    @List dbo.IdArray READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT * 
    FROM Clients 
    WHERE Clients.Id IN ('@List') 
END 

Aber ich versuche, die gespeicherte Prozedur und Übergabe von Werten zu feuern (einige ganzen Zahlen) in Prozedur Fenster ausführen , Bekomme ich diesen Fehler:

Must pass parameter number 2 and subsequent parameters as '@name = value'. After the form '@name = value' has been used, all subsequent parameters must be passed in the form '@name = value'.

UPDATE:

Hier, wie ich die gespeicherte Prozedur aufrufen:

DECLARE @return_value int 

EXEC @return_value = [dbo].[SP_TEST_TLP] 
     @List = 1,6 

SELECT 'Return Value' = @return_value 

Jede Idee, warum ich diesen Fehler? Was mache ich falsch?

+1

Wenn Sie möchten, dass wir Ihnen zeigen, was Sie falsch machen, geben Sie den Code ein, mit dem Sie den Prozess ausführen. Verwenden Sie auch nicht 'sp_' als Namenspräfix für gespeicherte Prozeduren. Dies bezeichnet eine gespeicherte SQL Server-Systemprozedur. Umhüllen Sie den TVP nicht in Anführungszeichen. Geben Sie stattdessen eine Unterabfrage wie "SELECT ID FROM @ List" an. –

+0

'Wo Clients.Id IN ('@List')' wird auch nicht tun, was Sie wollen. Sie haben bereits die richtige Syntax hier gegeben http://stackoverflow.com/questions/40206849/why-i-get-error-when-i-try-to-create-stored-procedure –

+0

Können Sie den Code, der die Prozedur ausführen Fenster produziert? Ausführen von Prozedurfenstern verwendet die Syntax @name = value zum Aufrufen von SPs. Wenn Sie die Zahlen nur komma-getrennt (1, 2, 3) schreiben, wird es höchstwahrscheinlich als @List = 1, 2, 3 interpretiert. Das ist nicht das, was Sie wollen. – infiniteRefactor

Antwort

2

Tabelle Werttypen und Parameter in TSQL sind wenig anders als Sie konzipiert haben.

Tabellenwerte sind im Wesentlichen Tabellen, keine Arrays oder Listen. Sie können die Komma-getrennte Syntax nicht verwenden, um mehrere Werte anzugeben.

Sie sollten es tun wie

DECLARE @return_value int 
DECLARE @MyList AS dbo.IdArray 

INSERT INTO @MyList (Id) 
VALUES (1),(6) 

EXEC @return_value = [dbo].[SP_TEST_TLP] @List = @MyList 

SELECT 'Return Value' = @return_value 

Ich denke, man kann das nicht tun mit Verfahren Schnittstelle Stored Execute.

Und in der gespeicherten Prozedur Körper sollten Sie @List verwenden, wie Sie einen Tabellennamen verwenden. Ihr ... IN ('$List')... Konstrukt wird nicht funktionieren. Sie müssen einen Join oder eine Unterabfrage verwenden. Denken Sie daran, @List ist eine Tabelle.

+0

danke.Haben Sie eine Idee, wie kann ich Int-Array von Visual Studio übergeben, um den Tabellenwert Parameter zu füllen? – Michael

+0

@Michael, übergeben Sie einen Parameter vom Typ System.Data.SqlDbType.Structured. Der Wert kann eine 'DataTable',' DataRow [] 'oder' IEnumerable 'sein. Eine DataTable, die die Liste der Ganzzahlen enthält, ist wahrscheinlich am einfachsten. –

Verwandte Themen