この質問の個々の部分に対する回答は見つかりましたが、これらを 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