0

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

;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
4

3 回答 3

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 而不是表。

于 2012-07-02T13:03:51.163 回答
0

您是否可以/可以接受将它们作为一个字符串检索,然后使用 Split(',') 返回一个字符串数组?

如果您希望使用 LINQ-TO-SQL 方式,请参阅此问题。

于 2012-07-02T12:57:09.203 回答
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
于 2012-07-02T13:06:10.700 回答