0

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

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

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

4

1 回答 1

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)
于 2013-08-19T20:44:22.347 回答