您好我正在尝试从数据库中检索值。我有一行有多个图像名称用“,”分隔。我想以不同的方式显示它们。我使用以下代码,它适用于两个值。但即使我有三个或更多的值,它也只回馈了两个。这是我的问题:
;with tmp(ImageURL,HeritageId) as
(
select LEFT(ImageURL, CHARINDEX(',',ImageURL+',')-1),
STUFF(ImageURL, 1, CHARINDEX(',',ImageURL+','), '')
from shop.dbo.Images where HeritageId=@HeritageId
union all
select right(ImageURL, CHARINDEX(',',ImageURL+',')-1),
STUFF(ImageURL, 1, CHARINDEX(',',ImageURL+','), '')
from Images
where ImageURL > '' and HeritageId=@HeritageId
)
select ImageURL
from tmp
答案 0 :(得分:1)
您的查询看起来像是尝试使用递归CTE来拆分字符串。它就是这样的情况。
;with tmp(ImageURL,Rest) as
(
select LEFT(ImageURL, CHARINDEX(',',ImageURL+',')-1),
STUFF(ImageURL, 1, CHARINDEX(',',ImageURL+','), '')
from Images where HeritageId=@HeritageId
union all
select LEFT(Rest, CHARINDEX(',',Rest+',')-1),
STUFF(Rest, 1, CHARINDEX(',',Rest+','), '')
from tmp
where Rest > ''
)
select ImageURL
from tmp
在递归部分而不是表中使用CTE。
答案 1 :(得分:0)
您是否可以/接受将它们作为一个字符串检索,然后使用Split(',')返回一个字符串数组?
如果您希望使用LINQ-TO-SQL方式,请另外查看this问题。
答案 2 :(得分:0)
我建议使用(并标记)@Mikael建议的答案,但是如果您的序列只有4个值,那么您可以使用PARSENAME
函数来分割句点。
DECLARE @test TABLE
(
[CSVColumn] NVARCHAR(MAX) NOT NULL
)
INSERT INTO @test VALUES ('The PARSENAME function splits on a period.But can only hold.Four.Values - any more and it will return null')
SELECT PARSENAME([CSVColumn], 4) AS 'Col1',
PARSENAME([CSVColumn], 3) AS 'Col2',
PARSENAME([CSVColumn], 2) AS 'Col3',
PARSENAME([CSVColumn], 1) AS 'Col4'
FROM @test