CROSS APPLY を使用すると、次のようなことを試すことができます。
WITH data (col) AS (
SELECT CAST('Royal Mission Open Hutch with 4-Arch Doors, Plain Glass (with Glass Shelves Standard)' AS nvarchar(100))
)
SELECT
col1, col2, col3
FROM data
CROSS APPLY (
SELECT
NULLIF(30 - CHARINDEX(' ', REVERSE(LEFT(col, 29))), 0)
) AS x1 (first_space_pos)
CROSS APPLY (
SELECT
LEFT(col, ISNULL(first_space_pos, 28)),
LTRIM(NULLIF(SUBSTRING(col, ISNULL(first_space_pos, 29), 999), ''))
) AS x2 (col1, col23)
CROSS APPLY (
SELECT
NULLIF(30 - CHARINDEX(' ', REVERSE(LEFT(col23, 29))), 0)
) AS x3 (second_space_pos)
CROSS APPLY (
SELECT
LEFT(col23, ISNULL(second_space_pos, 28)),
LTRIM(NULLIF(SUBSTRING(col23, ISNULL(second_space_pos, 29), 28), ''))
) AS x4 (col2, col3)
;
最初の CROSS APPLY は大きな列の最初の 29 文字の最後のスペースを検索し、2 つ目の CROSS APPLY は見つかった位置を使用して最初の小さな列を生成しcol1
、残りの文字列を として返しますcol23
。
次の 2 つの CROSS APPLY は に対して同じ操作を実行し、 とcol23
を生成col2
しcol3
ます。唯一の違いは、最後の CROSS APPLY がcol3
、残りのすべての文字ではなく、最大 28 文字になることです。
28
、 、29
などのハードコードされた値30
はパラメーター化できますが、その部分の仕事はあなたに任せます。
このクエリは SQL Fiddle で試すことができます。