sql server使用IN命令比较数字字段与包含逗号分隔的数字的字符串

本文关键字:数字 包含逗 分隔 server 字符串 字段 IN 命令 比较 sql 使用 | 更新日期: 2023-09-27 18:12:29

我希望这不是我所追求的太糟糕的逻辑。我有一个网页,其中有一个列表/选择框。用户可以从列表中选择一个或多个项目。这个过程将每个项目的数据库id以以下格式发送到服务器

String listOfIdees= '12,14,54,87'

我将这个cs列表传递给存储过程,我想检查这些记录是否已经存在或使用以下格式存在

SELECT * FROM mytable WHERE recId in (@listOfIdees)
这当然会抛出一个错误
Conversion failed when converting the varchar value '12,14,54,87' to data type int.

如果用户选择一条记录,它将被正确转换为int但如果有逗号分隔的列表,则会出现异常

可以一些灵魂指导,什么是最好的方法来检查记录存在这样的方式,我不认为我可以通过数组的int从我的web应用程序到存储过程?

sql server使用IN命令比较数字字段与包含逗号分隔的数字的字符串

这是解决这个问题的方法:

只需将其粘贴到空查询窗口并执行即可。适应您的需求…

DECLARE @tbl TABLE(ID INT, SomeValue VARCHAR(10));
INSERT INTO @tbl VALUES
 (1,'value 1')
,(2,'value 2')
,(3,'value 3')
,(4,'value 4')
,(5,'value 5');
DECLARE @ListOfIDs VARCHAR(20)='1,3,5';
WITH ListOfIDs AS
(
    SELECT CAST('<root><r>'+REPLACE(@ListOfIDs,',','</r><r>')+'</r></root>' AS XML) AS IDsAsXML
)
,ListOfIDsResolved AS
(
    SELECT x.y.value('.','int') AS ID
    FROM ListOfIDs
    CROSS APPLY ListOfIDs.IDsAsXML.nodes('/root/r') x(y)
)
SELECT * FROM @tbl AS tbl
INNER JOIN ListOfIDsResolved ON tbl.ID=ListOfIDsResolved.ID

最简单的是这样使用CHARINDEX:

SELECT * FROM mytable 
 WHERE CHARINDEX(
    ',' + CAST(Id AS NVARCHAR(50)) + ',', 
    ',' + @listOfIdees + ','
    ) > 0