使用 CROSS APPLYs,你可以尝试这样的事情:
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 个字符中的最后一个空格,第二个使用找到的位置生成第一个较小的列,col1
并将字符串的其余部分返回为col23
.
接下来的两个 CROSS APPLY 确实对 执行相同的操作col23
,从而产生col2
和col3
。唯一的区别是,最后一个 CROSS APPLY 最多放入col3
28 个字符,而不是所有剩余的字符。
28
像,29
和等硬编码值30
可以参数化,但我会把这部分工作留给你。
您可以在 SQL Fiddle尝试此查询。