我正在尝试构建动态sql查询。
我有一个字段,它是一系列以管道分隔的Guids。
我想执行一个查询,在此字段中找到所有具有Guids的用户。
在下面的示例中,我刚刚添加了几个虚拟GUID作为示例。我的第二个查询按照我的意愿运行。我使用REPLACE函数的第一个查询无法正常工作。如果我只执行替换选择它会返回我在第二个查询中的内容,所以我希望它返回相同的结果。有人可以帮我解决一下我在这里缺少的东西吗?感谢。
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
选择使用管道分隔的Guids尝试替换IN子查询 http://sqlfiddle.com/#!3/a5e426/7
子查询选择显示我得到了我想要的东西 http://sqlfiddle.com/#!3/a5e426/8
答案 0 :(得分:0)
我认为我们其他人仍然需要更多信息来确切了解您的查询要返回的内容。 (为什么硬编码值不可接受)。 我的猜测是你需要一个可以解释多个用户的动态查询。 在下面的查询中,您应该能够用任意数量的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)