IN运算符内部的Sql Server Replace函数



我正在尝试构建一个动态sql查询。

我有一个字段,它是一个由管道分隔的Guid字符串。

我想执行一个查询,查找该字段中所有具有Guid的用户。

在下面的示例中,我刚刚添加了几个伪GUID作为示例。我的第二个查询可以随心所欲地工作。我的第一个带有REPLACE函数的查询不起作用。如果我只执行Replace-Select,它会返回我在第二个查询中的结果,所以我希望它返回相同的结果。有人能帮我解决我在这里缺少的东西吗?谢谢

select * from CMS_User 
WHERE Convert(varchar(36),UserGUID) IN(
    select '''' + REPLACE('6415B8CE-8072-4BCD-8E48-9D7178B826B7|AEDD6E3F-61C1-46CF-B2D4-750180036FFF','|',''',''') + ''''
    )

select * 
from CMS_User 
WHERE Convert(varchar(36),UserGUID) IN('6415B8CE-8072-4BCD-8E48-9D7178B826B7','AEDD6E3F-61C1-46CF-B2D4-750180036FFF')

更新:下面是一些SqlFiddle查询,以进一步显示我正在做什么。

选择所有显示2条记录http://sqlfiddle.com/#!3/a5e426/5

使用硬编码子查询进行选择http://sqlfiddle.com/#!3/a5e426/6

使用试图替换IN子查询的管道分隔的Guid进行选择http://sqlfiddle.com/#!3/a5e426/7

子查询选择以显示我得到了我想要的http://sqlfiddle.com/#!3/a5e426/8

我认为我们其他人仍然需要更多关于您试图返回查询的信息。(为什么硬编码值是不可接受的)。我的猜测是,您需要一个可以考虑多个用户的动态查询。在下面的查询中,您应该能够用任意数量的GUID替换该集。

我不喜欢使用exec命令,但这似乎就是的工作原理

declare @tempID varchar(max)
set @tempID = '6415B8CE-8072-4BCD-8E48-9D7178B826B7|AEDD6E3F-61C1-46CF-B2D4-750180036FFF'
set @tempID =  char(39) + replace (@tempID
                    ,'|', CHar(39) + char(44) + Char(39)) + char(39)
exec(' select * from CMS_User WHERE UserGUID IN(' + @tempID + ')  ')

编辑:您提到从另一个表中获取guid。为什么不直接引用那个表呢?

Select * from CMS_User 
WHERE UserGUID in(select UserGUID from othertable)

最新更新