0

この質問の個々の部分に対する回答は見つかりましたが、これらを 1 つの解決策にまとめた回答が見つからなかったため、投稿しています。他の誰かが同じ質問をした場合に備えて、解決策を投稿すると思いました。

これは私の最初の投稿であり、SQL-Server は初めてなので、コメントや推奨事項は大歓迎です。

以下の関数は戻ります

1) 文字列の各行の行を含むテーブル、

2) 文字列が空または null の場合、空のテーブルを返し、

3) delimiter が null または空の場合、文字列を含む単一行テーブルを返します。

CSV を行に分割するために使用できるように汎用にしました。

利用方法

@Delimiter: 表の行に配置するために文字列を分割する場所を決定するために使用される値

@Remove_Delimiters: テーブル行に配置された文字列に @Delimiter を保持するかどうかを決定します

@String: 分割して表の行に配置する文字列。

文字列を行に分割するには: @Delimiter CHAR(13)+CHAR(10) を設定します。

文字列を CSV 値に分割するには: @Delimiter ',' を設定します。

注: 余分な空白を削除するために必要な別の関数

CREATE FUNCTION [dbo].[QaAuto_STRING_2TABLE]
(
    @Remove_Delimiters BIT
    , @Delimiter NVARCHAR(4000)
    , @String NVARCHAR(4000)
)
RETURNS @Table TABLE
(
    Row INT NOT NULL
    , Value NVARCHAR(MAX)
)
AS
BEGIN
    IF NOT (@String IS NULL OR @String = '')
    BEGIN
        WITH Cte AS
        (
            SELECT StartIndex = 0, EndIndex = 1
            UNION ALL
            SELECT EndIndex ,CHARINDEX(@Delimiter, @String, EndIndex) + LEN(@Delimiter)
            FROM Cte WHERE EndIndex > StartIndex
        )   
        INSERT INTO @Table SELECT 
            Row  = ROW_NUMBER() OVER(ORDER BY(SELECT 1)) 
            ,Value = 
                CASE
                    WHEN @Delimiter IS NULL OR @Delimiter = '' THEN @String
                    ELSE SUBSTRING(@String, StartIndex, 
                        CASE 
                            WHEN EndIndex > LEN(@Delimiter) 
                            THEN EndIndex-StartIndex - (LEN(@Delimiter)*@Remove_Delimiters)
                            ELSE LEN(@String) - StartIndex + LEN(@Delimiter) 
                        END)
                END
        FROM Cte
        WHERE StartIndex > 0
    END
    RETURN
END
4

0 に答える 0