我需要一种方法来执行以下查询:
SELECT *
FROM myTable
WHERE column NOT IN ('val1', 'val2')
现在,val1
和val2
位于一个阵列中,我会像这样插入一个字符串:
$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 (?)
答案 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