0

こんにちは、データベースから値を取得しようとしています。「、」で区切られた複数の画像名を持つ行があります。それらを別の行に表示したい。2 つの値に対して正常に動作する次のコードを使用しています。しかし、3 つ以上の値がある場合でも、返されるのは 2 つだけです。これは私のクエリです:

;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

@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 に答える
0

それらを 1 つの文字列として取得し、Split(',') を使用して文字列の配列を返すことは可能/許容できますか?

LINQ-TO-SQL の方法を使用する場合は、この質問を参照してください。

于 2012-07-02T12:57:09.203 に答える