我正在努力做出这样的选择:
DECLARE @ContentIDs VARCHAR(MAX);
SELECT @ContentIDs = 'e28faa48-adea-484d-9d64-ba1e1c67eea3,8338A6DE-8CDF-4F52-99CE-62E2B107FF97'
SELECT * FROM [Content] WHERE [ID] IN (@ContentIDs)
它仅返回第一个UNIQUEIDENTIFIER
的内容。
如何检索所有行?
答案 0 :(得分:4)
你可以
使用动态SQL生成查询,但需要确保列表已清理
使用拆分函数来解析列表,并将每个条目作为一行添加到表变量中,然后将其加入到该表或
使用SELECT * FROM [Content] WHERE @ContentIDs like '%' + cast([ID] as varchar(36)) + '%'
这将强制执行完整扫描,但如果您匹配多行,则这可能无关紧要。 (编辑,但如果匹配多行,则比较字符串可能很大!)
选项2通常是我的首选方法。或者您可以使用CTE执行类似的操作(基于approach here)
DECLARE @ContentIDs VARCHAR(MAX);
SET @ContentIDs = 'e28faa48-adea-484d-9d64-ba1e1c67eea3,8338A6DE-8CDF-4F52-99CE-62E2B107FF97';
WITH Guids(pn, start, [stop]) AS
(
SELECT 1, cast(1 as bigint), CHARINDEX(',', @ContentIDs)
UNION ALL
SELECT pn + 1, [stop] + 1, CHARINDEX(',', @ContentIDs, [stop] + 1)
FROM Guids
WHERE [stop] > 0
)
SELECT <collist> FROM
[Content]
WHERE [ID] IN (
SELECT
CAST(LTRIM(RTRIM(SUBSTRING(@ContentIDs, start,
CASE WHEN [stop] > 0
THEN [stop]-start
ELSE LEN(@ContentIDs) END))) AS UNIQUEIDENTIFIER)
FROM Guids where [stop] > 0 or start>1
)
答案 1 :(得分:3)
那是因为“IN”需要一个表,你给它一个字符串。即使按照建议的“喜欢”,它也会非常草率,你的结果根本就不准确。
您需要以下内容将字符串转换为表格才能生效:
CREATE FUNCTION [dbo].[split] (
@sourcestring varchar(8000),
@spliton varchar(1)
)
RETURNS @split table(value sql_variant)
AS
BEGIN
while (charindex(@spliton,@sourcestring)>0)
begin
insert into @split
select value = ltrim(rtrim(substring(@sourcestring,1,charindex(@spliton,@sourcestring)-1)))
set @sourcestring = substring(@sourcestring,charindex(@spliton,@sourcestring) + len(@spliton),len(@sourcestring))
end
insert into @split select value = ltrim(rtrim(@sourcestring))
RETURN
END
然后像这样称呼它:
DECLARE @ContentIDs VARCHAR(MAX);
SELECT @ContentIDs = 'e28faa48-adea-484d-9d64-ba1e1c67eea3,8338A6DE-8CDF-4F52-99CE-62E2B107FF97'
SELECT * FROM [Content] WHERE [ID] IN (select value from dbo.split(@ContentIDs,','))
答案 2 :(得分:1)
您可以使用以逗号分隔的列表进行字符串比较:
SELECT *
FROM [Content]
WHERE ',' + @ContentIDs + ',' LIKE '%,' + CONVERT(varchar, [ID]) + ',%'
答案 3 :(得分:1)
尝试:
SELECT @SQL = 'SELECT * FROM [Content] WHERE [ID] IN (' + @ContentIDs + ')'
EXEC (@SQL)