0

希望我以正确的方式解决这个问题,如果不是,我更愿意学习如何做得更好。

我需要将逗号分隔的整数列表(始终为正整数,无小数)传递给存储过程。然后,存储过程将使用 WHERE 子句的 IN 运算符中的整数:

WHERE [PrimaryKey] IN (1,2,4,6,212);

前端是 PHP,连接是通过 ODBC 建立的,我尝试将参数用单引号括起来,并在列表到达查询之前在存储过程中将它们过滤掉,但这似乎不起作用。

我得到的错误是:

将 varchar 值 '1,2,4,6,212' 转换为数据类型 int 时转换失败。

我以前从未这样做过,迄今为止的研究没有产生任何积极的结果。

4

2 回答 2

2

首先,让我们使用 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, ','))
于 2013-01-31T05:54:05.427 回答
0

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

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

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

于 2013-01-30T22:59:59.123 回答