使用数字字符串作为 SqlParameter 以 SQL 使用 IN 运算符查询资源

Use string of numbers as SqlParameter to SQL query resource with IN Operator

我正在尝试传递一个字符串 p_strIds,其中数值由“,”分隔:

2844099,2844100,2844101,2844102,2844103,2844104,2844,2844444105,28444106,2844107,2844107,2844444444111109,28444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444411104111044441110,2844441110,2844441110,284441111044444.1110444041110,28444404112

字符串用作SqlParameter:

mySqlCommand.Parameters.Add(new SqlParameter("@p_Ids", p_strValores));

将由以下资源(添加为资源)在 IN 运算符中查询使用:

UPDATE tbl_Datos 
SET col_Leyenda = (select col_Id from tbl_Leyenda where col_Leyenda = 'T') 
WHERE col_Id in (@p_Ids)

查询和 IN 运算符应该像这样结束:

UPDATE tbl_Datos 
SET col_Leyenda = (select col_Id from tbl_Leyenda where col_Leyenda = 'T') 
WHERE col_Id in (2844099,2844100,2844101,2844102,2844103,2844104,2844105,2844106,2844107,2844108,2844109,2844110,2844111,2844112,2844113,2844114,2844115,2844116,2844117,2844118)

但是它说它不能将 nvarchar 转换为 int,我如何格式化参数以在 IN(...Ids...)

如果我像这样将参数 p_strIds 与 string.Format(queryString, p_strIds) 一起使用,它会起作用:

queryString = UPDATE tbl_Datos SET col_Leyenda = (select col_Id from tbl_Leyenda where col_Leyenda = 'T') WHERE col_Id in ({0})
strSql = string.Format(queryString, p_strValores)
mySqlCommand = new SqlCommand(strSql, m_obSqlConnection);

关于如何使用 sql 语句作为资源的第一种方法有什么想法吗?

谢谢

tbl_Datos 上的 col_Id 列或 table tbl_Leyenda 中的 col_Leyenda 列被声明为数据类型 NVARCHAR。该列中的数据可能至少包含一些非数字字符。

当 SQL 尝试 运行 您的 WHERE 语句时:WHERE col_Id in (@Ids)

无法将 col_Id 中的非数字数据转换为您在 @Ids 中假定为整数的数据列表。

您可以通过在列表中的每个 ID 两边加上单引号来解决此问题。它看起来更像这样:

'2844099','2844100','2844101','2844102','2844103','2844104','2844105','2844106','2844107','2844108','2844109','2844110','2844111','2844112','2844113','2844114','2844115','2844116','2844117','2844118'

也可能是变量@p_Leyenda作为整数值传入。您也应该尝试将其强制为字符串。类似于上面的 col_Ids 列表。

这里你需要的是一个拆分函数。

如图所示创建拆分函数 here

CREATE FUNCTION [dbo].[SplitString]
(
    @sString nvarchar(2048),
    @cDelimiter nchar(1)
)
RETURNS @tParts TABLE ( part nvarchar(2048) )
AS
BEGIN
    if @sString is null return
    declare @iStart int,
            @iPos int
    if substring( @sString, 1, 1 ) = @cDelimiter 
    begin
        set @iStart = 2
        insert into @tParts
        values( null )
    end
    else 
        set @iStart = 1
    while 1=1
    begin
        set @iPos = charindex( @cDelimiter, @sString, @iStart )
        if @iPos = 0
            set @iPos = len( @sString )+1
        if @iPos - @iStart > 0          
            insert into @tParts
            values  ( substring( @sString, @iStart, @iPos-@iStart ))
        else
            insert into @tParts
            values( null )
        set @iStart = @iPos+1
        if @iStart > len( @sString ) 
            break
    end
    RETURN

END

然后您像下面这样更改您的查询:

UPDATE tbl_Datos 
SET col_Leyenda = (select col_Id from tbl_Leyenda where col_Leyenda = 'T') 
WHERE col_Id in (Select part from SplitString(@p_Leyenda,','))

最后,唯一的方法是将字符串转换为列表:

List<string> p_Ids= p_strValores.Split(',').ToList();

然后将列表中的每个值转换为 int 并将它们添加到 aux 列表中,例如aux_p_Ids,然后在 sql 查询中使用它:

UPDATE tbl_Datos SET col_Leyenda = (select col_Id from tbl_Leyenda where col_Leyenda = @p_Leyenda) WHERE col_Id in aux_p_Ids