查询不检索从拆分字符串返回的值

时间:2018-04-23 11:25:44

标签: sql sql-server sql-server-2012

我生成逗号分隔字符串并为每个数字添加单个

我是这样做的

-Wunused-variable

如果我打印变量DECLARE @IDs NVARCHAR(max) SELECT @IDs = COALESCE(@IDs +',', '') + '''' + Cast([mynos] AS NVARCHAR(255)) + '''' FROM mytable WHERE id = 22 ,那么我得到低于输出

@IDs

当我在此查询中使用相同的变量时,查询不会返回任何值

'78888','3333','1222'

如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

它不起作用,因为您的查询实际上是这样做的:

SELECT *
FROM TABLE
WHERE Ids IN ('''78888'',''3333',''1222''');

这也相当于:

SELECT *
FROM TABLE
WHERE Ids = '''78888'',''3333',''1222''';

如果您想要执行查询,则需要再次拆分已删除的数据。当您使用SQL Server 2012时,您无法使用STRING_SPLIT,因此您需要使用不同的版本;比如Jeff Moden的DelimitedSplit8K。然后你可以这样做:

SELECT *
FROM TABLE
WHERE IDs IN (SELECT items
              FROM dbo.DelimitedSplit8K (@IDs,','));

但是,你为什么不干脆......

SELECT *
FROM TABLE T
WHERE EXISTS (SELECT 1
              FROM myTable mT
              WHERE mT.Id = 22
                AND mT.myNos = T.Ids);

答案 1 :(得分:1)

您可以使用动态查询@id是字符串变量而不是多值参数

DECLARE @IDs nVARCHAR(MAX)  
SELECT @IDs = COALESCE(@IDs +',' ,'') + '''' + CAST([myNos] AS nVARCHAR(255)) + ''''
FROM myTable WHERE Id = 22
DECLARE @query nVARCHAR(MAX) 
SET @query = "Select * from table1 where Ids in ("+@IDs+")"
EXECUTE sp_executesql @query 

答案 2 :(得分:0)

我在下面尝试过它

select * from table1 where id in (select mynos from mytable where id = 22)

感谢@Larnu给我的想法