STRING_SPLIT
ステージテーブルで使用し、結果を別のテーブルにインポートする必要があります。
ステージテーブル:
DECLARE @stage TABLE(ID INT, Code VARCHAR(500))
INSERT INTO @stage
SELECT 1, '123_Potato_Orange_Fish'
UNION ALL
SELECT 2, '456_Tomato_Banana_Chicken'
UNION ALL
SELECT 3, '789_Onion_Mango_Lamb'
ファイナルテーブル:
DECLARE @Final TABLE
(
ID INT,
code VARCHAR(500),
Unit VARCHAR(100),
Vegetable VARCHAR(100),
Fruit VARCHAR(100),
Meat VARCHAR(100)
)
SSIS実行タスクを使用して、ステージテーブルデータを変換し、ファイナルテーブルに挿入しています。ステージテーブルのコード列は文字列で、区切り文字には「_」が使用されます。以下に示すように、文字列を分離してファイナルテーブルを表示する必要があります
ID code Unit Vegetable Fruit Meat
------------------------------------------------------------------
1 123_Potato_Orange_Fish 123 Potato Orange Fish
2 456_Tomato_Banana_Chicken 456 Tomato Banana Chicken
3 789_Onion_Mango_Lamb 789 Onion Mango Lamb
次にString_Split()
示すように、SQL Server2016の組み込み関数を使用しようとしています。
SELECT
ID,
Code, f.value AS Vegetable
FROM
@stage AS s
CROSS APPLY
(SELECT
value,
ROW_NUMBER() OVER(PARTITION BY s.ID ORDER BY s.ID) AS rn
FROM
String_Split(s.Code, '_')) AS f
WHERE
s.ID = 1 AND f.rn = 2
ただし、ステージデータには数百万のレコードが含まれているため、一度に1つの文字列しか分割されません。コード列のすべての文字列を分割し、それぞれの列に格納する必要があります。
注:一時テーブルは使用しません。
ありがとう
派生列を追加し、フォーマットがリストしたものと一致していると仮定して、TOKEN
関数を使用して"_"
、各文字列の区切り文字と位置に基づいて入力を分割します。ここから、各出力を適切な宛先列にマップできます。以下の3つのステートメントは、質問のサンプルデータに基づいてコード列を分割します。TOKENの出力データ型はDT_WSTR
(Unicode)であることに注意してください。Unicode以外のデータが必要な場合は、にキャストバックする必要があります。DT_STR
これは、(DT_STR,50,1252)
各ステートメントの前に追加(必要に応じて長さを調整)することで、同じ派生列内で実行することもできます。
TOKEN(Code,"_",1)
TOKEN(Code,"_",2)
TOKEN(Code,"_",3)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加