是否可以使用正则表达式或其他方法在SQL Server(T-SQL)中拆分列

Mut*_*tor 2 sql t-sql sql-server

我有一行数据由行号和字符串组成,由几个句子(不同的数字)组成.我想使用T-SQL拆分列和枢轴(unpivot?)并显示相应的行号和每行中包含字符串的单个句子.注意:每个新句子以大写字母开头,以句点结尾.

我的数据看起来像这样:

Row_num   Sting

  1       JOHN SMITH walked quickly to his car. MARY waited outside for a ride. BOB JOHNS called is fired to pick him up. TOM was not present.

  2       SALLY SMITH arrived at work early on. Dave called in sick.  BETTY DOE was on vacation.
Run Code Online (Sandbox Code Playgroud)

我希望能够将每行中的句子分开并最终得到这样的结果:

 1 JOHN SMITH walked quickly to his car.
 1 MARY waited outside for a ride. 
 1 BOB JOHNS called is fired to pick him up. 
 1 TOM was not present.
 2 SALLY SMITH arrived at work early on. 
 2 Dave called in sick.  
 2 BETTY DOE was on vacation.
Run Code Online (Sandbox Code Playgroud)

我写了一个正则表达式(正则表达式的 javascript版本)成功分割数据,但我不知道如何在T-SQL中实现这一点.

Luk*_*zda 5

是的,你可以使用XML实现你想要的东西:

SQLFiddle

数据:

CREATE TABLE tab(row_num INT, String NVARCHAR(MAX));

INSERT INTO tab(Row_num, String)
VALUES 
(1, N'JOHN SMITH walked quickly to his car. MARY waited outside for a ride. BOB JOHNS called is fired to pick him up. TOM was not present.'),
(2, N'SALLY SMITH arrived at work early on. Dave called in sick.  BETTY DOE was on vacation.')
Run Code Online (Sandbox Code Playgroud)

主要查询:

SELECT 
     row_num
    ,[sentence] = Split.a.value('.', 'NVARCHAR(1000)')
FROM  
(
     SELECT
        row_num,
        [X] = CAST ('<M>' + REPLACE(String, '.', '.</M><M>') + '</M>' AS XML) 
     FROM tab     
) AS A 
CROSS APPLY X.nodes ('/M') AS Split(a)
WHERE Split.a.value('.', 'NVARCHAR(1000)') <> '';
Run Code Online (Sandbox Code Playgroud)

要使用自定义正则表达式,您应该使用CLR Table Valued Function.