PHP SQLSRV:将一串值传递给IN子句

时间:2016-12-13 16:40:10

标签: php sql sql-server sqlsrv

我需要一种方法来执行以下查询:

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

现在,val1val2位于一个阵列中,我会像这样插入一个字符串:

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

如果我将字符串放在查询声明中,就可以了:

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

但是,如果我将其作为sqlsrv_query参数传递给它,则查询无效:

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

我没有收到任何错误。 $stmt为真,但while周期没有返回任何内容。

我绝对需要通过sqlsrv_query,我该怎么做?

更新

这里是$sql值:

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

2 个答案:

答案 0 :(得分:1)

原始SQL查询中的问号计数必须与您传递给查询的参数计数相匹配。

假设$inClauseArr就像:

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

有两个要素。实际上,它有多少元素并不重要。只要$inClauseArr是一个数组,就没有问题。

因此,查询应该构造为( [...] 是查询的开头):

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

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

执行应该是:

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

参考文献:

答案 1 :(得分:0)

将它传递给逗号分隔的字符串(varchar),然后使用split函数创建表:

     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