2017-01-04 8 views
1

ich eine gespeicherte Prozedur zu erstellen versuchen, die wie Mehrwertparameter für den in dem Zustand akzeptieren unterStored Procedure mit Mehrwertparameter

ALTER PROC spGetExpectedSalesOrActiveSales @Divisions NVARCHAR(200), @var1 int 
AS 
BEGIN 
    SELECT * 
    FROM ABC 
    WHERE x = '0' and [email protected] 
     AND y IN (@Divisions) 

END 
exec spGetExpectedSalesOrActiveSales 'EE, MM' ,1 

In-Place von @Divisions wenn ich ‚ABC‘ oder ' ABC, XYZ 'dann funktioniert es gut und , wenn ich einen einzelnen Wert über die API für die @Divisions übergeben dann seine Ausführung, aber wenn mehr als einen Wert wie' ABC, XYX 'übergeben, dann zeigt es einfach keine Datensätze. Die Werte, die ich durch meine API gebe, ist ein String-Array. Ich nehme die @Divisions-Werte nicht von einer Abfrage, sondern von der API.

+0

stattdessen einen Tabellenwertparameter verwendet verwenden. –

Antwort

0

Sie versuchen Abfrage wie diese

SELECT * 
    FROM ABC 
    WHERE x = '0' 
     AND y IN ('ABC,XYZ') 

zu holen Und natürlich können Sie nicht wie oben wählen Sie.

In diesem Fall können Sie auf zwei Arten gehen. Einer ist Dynamic-Codierung und ein anderer ist mit Benutzerdefinieren-Funktion.

Dynamisch:

CREATE PROC spGetExpectedSalesOrActiveSales @Divisions NVARCHAR(200), @var1 int 
AS 
BEGIN 
    DECLARE @QRY VARCHAR(MAX); 
    SELECT @DIVISIONS = REPLACE (@DIVISIONS,' ',''); 
    SELECT @DIVISIONS=''''+REPLACE(@DIVISIONS,',',''',''')+'''' 

    SELECT @QRY = ' 
    SELECT * 
    FROM ABC 
    WHERE x = ''0'' AND z='[email protected] 
     +'AND y IN ('[email protected]+')' 

    --PRINT @QRY 
    EXEC (@QRY) 
END 
+0

** Shakeer Mirza **, Ich habe gerade das gleiche gemacht, aber es sagt einfach Befehl erfolgreich abgeschlossen, und beim Ausführen der gespeicherten Prozedur gibt es nichts zurück. ** exec spGetExpectedSalesOrActiveSales 'EE, MM', 1 ** – Saleem

+0

Können Sie den Druckteil auskommentieren und sehen, was passiert? Es funktioniert für meine Datenbanktabelle @Saleem –

+0

** Shakeer Mirza **, es druckt nichts, wenn ich die Print @QRY auskommentiere. – Saleem

1

SQL Server nicht Arrays unterstützen. Es gibt mehrere ways to fake arrays, wenn Sie wirklich müssen.

0

ist es so etwas wie Table Valued Parametershttps://www.mssqltips.com/sqlservertip/2112/table-value-parameters-in-sql-server-2008-and-net-c/

Es ermöglicht die Anordnung von Elementen, um gespeicherte Prozeduren übergeben.

DataTable _dt; 
// create data table to insert items 
_dt = new DataTable("Items"); 
_dt.Columns.Add("ItemID", typeof(string)); 
_dt.Columns.Add("Name", typeof(string)); 
_dt.Rows.Add(4, "SuperBowl 9 Hat"); 
_dt.Rows.Add(5, "SuperBowl 10 T-Shirt"); 
_dt.Rows.Add(6, "SuperBowl 13 Towel"); 
_dt.Rows.Add(7, "SuperBowl 14 Helmet"); 

dann in gespeicherte Prozedur haben Sie so etwas wie diese

CREATE PROCEDURE [dbo].[InsertItemsTVP] @ItemTVP TVP_Items READONLY 
AS 
BEGIN 
INSERT INTO dbo.Items (ItemID, Name) 
SELECT ItemID, Name 
FROM @ItemTVP 
END 
GO 

Lese über Performace weil manchmal viel schneller sein Komma getrennte Zeichenfolge als TVP