2016-12-13 3 views
1

brauche ich einen Weg, um die folgende Abfrage ausführen:PHP SQLSRV: eine Reihe von Werten IN-Klausel vorbei

SELECT * 
FROM myTable 
WHERE column NOT IN ('val1', 'val2') 

Nun val1 und val2 innerhalb eines Arrays sind, dass ich wie diese in einen String implodiert :

$inClause = "'" . implode("','", $inClauseArr) . "'"; 

Wenn ich die Zeichenfolge in der Abfrage Deklaration so sagen es funktioniert:

$sql = "[...]WHERE column NOT IN ($inClause)"; 

Aber wenn ich es als sqlsrv_query Parameter wie dies passieren, wird die Abfrage nicht funktioniert:

$stmt = sqlsrv_query($conn, $sql, array($inClause)); 

Ich bin nicht jeden Fehler. $stmt ist wahr, aber while Zyklus gibt nichts zurück.

Ich muss unbedingt durch sqlsrv_query gehen, wie kann ich das tun?


UPDATE

Hier ist der $sql Wert:

SELECT * 
FROM orders(NOLOCK) 
WHERE order_id NOT IN (?) 
+0

Können Sie uns zeigen den Wert von '$ sql', wenn Sie die Parameter zu verwenden versuchen? – ImClarky

+0

@ImClarky kann nicht sehen, wie dies helfen kann, aber ich habe die Frage aktualisiert (eigentlich ist es die gleiche der ersten Code-Zitat) – Mark

+0

Sie sollten auch Fragezeichen in Ihrer SQL-Abfrage nach '$ inClauseArr' Länge füllen. – alalp

Antwort

0

Pass es anschließend in einem Komma getrennten Zeichenfolge (Varchar) dann eine Split-Funktion verwenden, um eine Tabelle zu erstellen:

 declare @vars varchar(14) = 'G' + ',' + 'H' 

    select * from syscode_detail 
    where code in (select value from dbo.Split(@vars, ',')) 

    using this function: 

    CREATE function [dbo].[Split] 
    (
     @List nvarchar(2000), 
     @SplitOn nvarchar(5) 
    ) 

    returns @tblReturn table 
    (
    id int identity(1,1), 
    value nvarchar(100) 
    ) 
as 
Begin 

    While (Charindex(@SplitOn, @List) > 0) 
    Begin 
     Insert Into @tblReturn (value) 
     Select value = ltrim(rtrim(Substring(@List, 1, Charindex(@SplitOn, 
     @List) - 1))) 

     Set @List = Substring(@List, Charindex(@SplitOn, @List) + 
     len(@SplitOn), len(@List)) 
    End 

    Insert Into @tblReturn (value) 
    Select Value = ltrim(rtrim(@List)) 

    Return 

End 
+0

Dank @Gregg, um gespeicherte/Funktionen zu erstellen oder zu ändern, ist in diesem Projekt nicht erlaubt ... Ich würde eine Lösung auf der PHP-Seite brauchen – Mark

0

Anzahl der Fragezeichen in Ihrem orig Die SQL-Abfrage muss mit der Anzahl der Parameter übereinstimmen, die Sie an die Abfrage übergeben haben.

$inClauseArr Gesetzt ist wie:

$inClauseArr = array('val1', 'val2'); 

Es gibt zwei Elemente. Eigentlich ist es nicht wichtig, wie viel Element es hat. Solange $inClauseArr ein Array ist, wird es kein Problem geben.

So sollte die Abfrage als konstruiert werden ([...] ist der Anfang der Abfrage):

$stmt = sqlsrv_query($conn, $sql, $inClauseArr); 

Referenzen:

$sql = "[...]WHERE column NOT IN (" 
    . implode(',', array_fill(0, count($inClauseArr), '?')) 
    . ")"; 

// For $inClauseArr = array('val1', 'val2'); 
// Output should be [...]WHERE column NOT IN (?, ?) 

und Ausführung sein sollte:

+0

Das ist genau das, was ich jetzt mache, aber ich muss vermeiden, Teile der Abfrage zu generieren der Code, weil die Abfrage in einer db-Tabelle gespeichert werden muss. Dann muss ich es von dort ** AS STRING ** abrufen und ausführen, indem ich einfach die Werte an die 'sqlsrv_query' übergebe, ohne sie manipulieren zu müssen. Es scheint, dass diese Methode keine einfache Möglichkeit zur Verwendung der SQL-IN-Klausel erlaubt. – Mark

+0

@Mark Ich denke, Sie können die kommagetrennte $ inClause-Zeichenfolge in Ihrer SQL-Abfrage parsen, um eine dynamische Tabelle zu füllen. Dann können Sie diese Tabelle in der IN-Klausel (oder vielleicht mit INNER JOIN) verwenden. – alalp

Verwandte Themen