我正在尝试构建一个动态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)