WHERE IN 语法的搜索参数 SQLSRV_QUERY
Search parameters SQLSRV_QUERY for WHERE IN syntax
我想知道是否有办法将一些值传递到 sqlsrv_query
函数的参数选项中。我尝试了一些方法,但无法正常工作。
这个查询是我要执行的:
SELECT id, name, etc
FROM sqlTable
WHERE id IN ('1', '2', '100', '314')
我想使用参数选项传递 WHERE IN
值,如下所示:
$q = "SELECT id FROM sqlTable WHERE id IN ?";
$p = array(array('1', '2', '100', '314'));
sqlsrv_query($connection, $q, $p);
现在我将值直接传递到查询字符串中,但出于明显的安全原因,我想将它们作为参数传递到函数中。
有人知道如何实现这一目标吗?
考虑 PDO binded parameters,您可以在 execute()
中传递定义的数组。但是,您需要准备声明,提前知道 IN()
个子句项的数量。
try {
$dbh = new PDO("sqlsrv:server=$server;database=$database",$username,$password);
$sql = "SELECT * FROM sqlTable WHERE id IN (:first, :second, :third, :fourth)";
$STH = $dbh->prepare($sql);
$nums = array('1', '2', '100', '314');
$STH->execute($nums);
}
catch(PDOException $e) {
echo $e->getMessage()."\n";
}
所以我已经在 sql 方面解决了这个问题。现在,我使用 sqlsrv_query()
函数中的参数将带有 ID 的逗号分隔字符串传递给查询。查询将字符串设置在一个临时变量中。使用拆分功能,每个 id 都临时存储在 table 中。最后我 JOIN
暂时 table 和 的 table 我想得到结果。
SQL中的拆分函数:
CREATE FUNCTION dbo.splitstring ( @stringToSplit VARCHAR(MAX) )
RETURNS
@returnList TABLE ([Name] [nvarchar] (500))
AS
BEGIN
DECLARE @name NVARCHAR(255)
DECLARE @pos INT
WHILE CHARINDEX(',', @stringToSplit) > 0
BEGIN
SELECT @pos = CHARINDEX(',', @stringToSplit)
SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)
INSERT INTO @returnList
SELECT @name
SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
END
INSERT INTO @returnList
SELECT @stringToSplit
RETURN
END
PHP代码和SQL查询:
$q = "
DECLARE @inStr varchar(max)
SET @inStr = ?
DECLARE @tmpTable table (tmpID varchar(200))
INSERT @tmptable (tmpID)
SELECT * FROM dbo.splitstring(@inStr)
SELECT id, name, etc
FROM sqlTable
JOIN @tmpTable ON id = tmpID";
$p = array('1,2,100,314');
sqlsrv_query($connection, $q, $p);
我想知道是否有办法将一些值传递到 sqlsrv_query
函数的参数选项中。我尝试了一些方法,但无法正常工作。
这个查询是我要执行的:
SELECT id, name, etc
FROM sqlTable
WHERE id IN ('1', '2', '100', '314')
我想使用参数选项传递 WHERE IN
值,如下所示:
$q = "SELECT id FROM sqlTable WHERE id IN ?";
$p = array(array('1', '2', '100', '314'));
sqlsrv_query($connection, $q, $p);
现在我将值直接传递到查询字符串中,但出于明显的安全原因,我想将它们作为参数传递到函数中。 有人知道如何实现这一目标吗?
考虑 PDO binded parameters,您可以在 execute()
中传递定义的数组。但是,您需要准备声明,提前知道 IN()
个子句项的数量。
try {
$dbh = new PDO("sqlsrv:server=$server;database=$database",$username,$password);
$sql = "SELECT * FROM sqlTable WHERE id IN (:first, :second, :third, :fourth)";
$STH = $dbh->prepare($sql);
$nums = array('1', '2', '100', '314');
$STH->execute($nums);
}
catch(PDOException $e) {
echo $e->getMessage()."\n";
}
所以我已经在 sql 方面解决了这个问题。现在,我使用 sqlsrv_query()
函数中的参数将带有 ID 的逗号分隔字符串传递给查询。查询将字符串设置在一个临时变量中。使用拆分功能,每个 id 都临时存储在 table 中。最后我 JOIN
暂时 table 和 的 table 我想得到结果。
SQL中的拆分函数:
CREATE FUNCTION dbo.splitstring ( @stringToSplit VARCHAR(MAX) )
RETURNS
@returnList TABLE ([Name] [nvarchar] (500))
AS
BEGIN
DECLARE @name NVARCHAR(255)
DECLARE @pos INT
WHILE CHARINDEX(',', @stringToSplit) > 0
BEGIN
SELECT @pos = CHARINDEX(',', @stringToSplit)
SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)
INSERT INTO @returnList
SELECT @name
SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
END
INSERT INTO @returnList
SELECT @stringToSplit
RETURN
END
PHP代码和SQL查询:
$q = "
DECLARE @inStr varchar(max)
SET @inStr = ?
DECLARE @tmpTable table (tmpID varchar(200))
INSERT @tmptable (tmpID)
SELECT * FROM dbo.splitstring(@inStr)
SELECT id, name, etc
FROM sqlTable
JOIN @tmpTable ON id = tmpID";
$p = array('1,2,100,314');
sqlsrv_query($connection, $q, $p);