2016-04-25 6 views
3

Ich habe eine gespeicherte Prozedur die Details RechnungenParametrisierte WHERE-Klausel in SQL Server gespeicherte Prozedur

Einige Gelegenheiten ich die Liste der Rechnungen erhalten zu erhalten, indem nur die InvoiceID Aber in einigen anderen Gelegenheiten zu senden ich die Notwendigkeit zu erhalten Liste der Rechnungen gemäß den vom Benutzer angegebenen Suchfeldern. Dazu sende ich alle Felder an die Stored Procedure und verwende diese Parameter wie folgt. Ich habe nur 2 Spalten aufgenommen, aber es gibt mehr.

Gibt es eine Möglichkeit, die Bedingung für die WHERE-Klausel als einen Parameter zu senden?

+0

Die Lösung ist dynamisch sql, aber Ihre beste Wette ist, die wirklich erforderlichen Suchfelder einzugrenzen (die Antwort 'alle Felder sind erforderlich' ist eine Lüge. Punkt.) Und sie als Parameter hinzuzufügen. – Paolo

Antwort

2

Ja, das ist mit Dynamic SQL möglich, aber ich rate dringend davon ab.

SELECT * FROM tbl WHERE @condition:

Wenn Sie das Verfahren

CREATE PROCEDURE search_sp @condition varchar(8000) AS 
    SELECT * FROM tbl WHERE @condition 

einfach vergessen, es zu schreiben erwägen. Wenn Sie dies tun, haben Sie den Übergang zur Verwendung der gespeicherten Prozedur noch nicht abgeschlossen, und Sie sammeln weiterhin Ihren SQL-Code im Client.

Es öffnet auch Ihre Anwendung für SQL-Injection-Angriffe.

0

Wenn Sie mit SQL Server 2016 oder ähnlich (überprüft select compatibility_level, name from sys.databases durch den Aufruf und zu sehen, dass Ihre DB 130 oder höher ist) verwenden Dann können Sie die integrierte Funktion string_split verwenden.

Ich fand es am besten, wie das funktioniert (ausgebreitet für Klarheit)

CREATE PROCEDURE [dbo].[GetInvoices] 
    @InvoiceNumber int = NULL 
    @PONo nvarchar(1024) = NULL 
AS 
SELECT * from [Invoices] AS [i] 
WHERE 
    i.InvoiceNumber = ISNULL(@InvoiceNunber, i.InvoiceNunber) 
    AND CASE 
     WHEN @PONo is null 
     THEN 1 
     ELSE (CASE 
      WHEN i.PONo IN (select value from string_split(@PONo, ',')) 
      THEN 1 
      ELSE 0 
      END) 
     END 
     = 1 

Also, wenn Sie in einem Null entweder Parameter übergeben es als where x = x übersetzt wird, die immer wahr ist, und wenn Sie passieren in ein CSV-Wert, wählt es aus einer geteilten Tabelle von Werten aus, die, falls vorhanden, zur where-Klausel where 1=1 führt, die wahr ist, oder 0=1, wenn der Wert nicht in der Eingabeliste vorhanden ist.

Also hier können Sie eine Rechnungsnummer oder PO-Nummer oder beides oder keine und es sollte zurückgeben, was Sie erwarten.

Verwandte Themen