在不同的行中用逗号分隔的值

时间:2012-07-02 12:47:03

标签: c# sql-server

您好我正在尝试从数据库中检索值。我有一行有多个图像名称用“,”分隔。我想以不同的方式显示它们。我使用以下代码,它适用于两个值。但即使我有三个或更多的值,它也只回馈了两个。这是我的问题:

;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

3 个答案:

答案 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