Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将PHP中以逗号分隔的整数列表作为参数传递给SQLServer2008中的存储过程?_Php_Sql_Sql Server 2008_Stored Procedures - Fatal编程技术网

如何将PHP中以逗号分隔的整数列表作为参数传递给SQLServer2008中的存储过程?

如何将PHP中以逗号分隔的整数列表作为参数传递给SQLServer2008中的存储过程?,php,sql,sql-server-2008,stored-procedures,Php,Sql,Sql Server 2008,Stored Procedures,希望我能以正确的方式来做这件事,如果不是的话,我愿意学习如何做得更好 我需要将逗号分隔的整数列表(总是正整数,没有小数)传递给存储过程。然后,存储过程将使用WHERE子句的in运算符中的整数: WHERE [PrimaryKey] IN (1,2,4,6,212); 前端是PHP,通过ODBC进行连接,我尝试过在列表到达查询之前将参数用单引号括起来并在存储过程中过滤掉,但这似乎不起作用 我得到的错误是: 将varchar值“1,2,4,6212”转换为数据类型int时,转换失败 我以前从来没有

希望我能以正确的方式来做这件事,如果不是的话,我愿意学习如何做得更好

我需要将逗号分隔的整数列表(总是正整数,没有小数)传递给存储过程。然后,存储过程将使用WHERE子句的in运算符中的整数:

WHERE [PrimaryKey] IN (1,2,4,6,212);
前端是PHP,通过ODBC进行连接,我尝试过在列表到达查询之前将参数用单引号括起来并在存储过程中过滤掉,但这似乎不起作用

我得到的错误是:

将varchar值“1,2,4,6212”转换为数据类型int时,转换失败


我以前从来没有这样做过,到目前为止的研究还没有产生积极的结果。

您可以传递一个逗号分隔的值列表。但是,在语句中,不能随意使用它们。您可以这样做:

where ','+@List+',' like '%,'+PrimaryKey+',%' 

也就是说,您希望查看该值是否存在。我使用SQL Server语法进行连接,因为问题被标记为Microsoft。

首先,让我们使用SQL函数执行分隔数据的拆分:

CREATE FUNCTION dbo.Split
(
    @RowData nvarchar(2000),
    @SplitOn nvarchar(5)
)  
RETURNS @RtnValue table 
(
    Id int identity(1,1),
    Data nvarchar(100)
) 
AS  
BEGIN 
    Declare @Cnt int
    Set @Cnt = 1

    While (Charindex(@SplitOn,@RowData)>0)
    Begin
        Insert Into @RtnValue (data)
        Select 
            Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))

        Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData))
        Set @Cnt = @Cnt + 1
    End

    Insert Into @RtnValue (data)
    Select Data = ltrim(rtrim(@RowData))

    Return
END
要使用此方法,只需向函数传递分隔字符串和分隔符,如下所示:

SELECT
  *
FROM
  TableName
WHERE
  ColumnName IN (SELECT Data FROM dbo.Split(@DelimitedData, ','))
如果由于数据类型的原因仍然存在问题,请尝试:

SELECT
  *
FROM
  TableName
WHERE
  ColumnName IN (SELECT CONVERT(int,Data) FROM dbo.Split(@DelimitedData, ','))
也许: