2012-07-02 217 views
0

嗨我试图从数据库检索值。我有一行有多个图像名称,用“,”分隔。我想用不同的行显示它们。我正在使用下面的代码对两个值工作正常。但即使我有三个或更多的价值,那么它也只会返回两个值。这是我的查询:以逗号分隔的分隔值

;with tmp(ImageURL,HeritageId) as 
(

select  LEFT(ImageURL, CHARINDEX(',',ImageURL+',')-1), 
   STUFF(ImageURL, 1, CHARINDEX(',',ImageURL+','), '') 
from shop.dbo.Images where [email protected] 
union all 
select  right(ImageURL, CHARINDEX(',',ImageURL+',')-1), 
   STUFF(ImageURL, 1, CHARINDEX(',',ImageURL+','), '') 
from Images 
where ImageURL > '' and [email protected] 
) 
select  ImageURL 
from tmp 
+3

显示在不同的行*其中*?在一个WinForm,一个网页,管理工作室,...不同的程序期望不同的标记显示回车+换行符。 –

+0

为了正确理解这一点,你的问题是SQL查询没有返回你认为应该的东西?从你的代码示例看来,你似乎没有得到任何附近显示这些结果... – Chris

+0

此代码检索单独的行中的数据。但只适用于两张图片。如果我有3个或更多的图像形式:“a.png,b.png,c.png”,那么它不工作!但是,如果有两个图像它工作正常 –

回答

1

您的查询看起来像尝试使用递归CTE拆分字符串。这就是它应该看起来像这样的情况。

;with tmp(ImageURL,Rest) as 
(

select LEFT(ImageURL, CHARINDEX(',',ImageURL+',')-1), 
    STUFF(ImageURL, 1, CHARINDEX(',',ImageURL+','), '') 
from Images where [email protected] 
union all 
select LEFT(Rest, CHARINDEX(',',Rest+',')-1), 
    STUFF(Rest, 1, CHARINDEX(',',Rest+','), '') 
from tmp 
where Rest > '' 
) 
select ImageURL 
from tmp 

在递归部分而不是表中使用CTE。

+0

谢谢这完美的作品!非常感谢 –

0

有没有可能/接受供您检索它们作为一个字符串,然后,用split(“”)返回一个字符串数组?

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

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