2012-07-02 275 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