SQL Server中的正则表达式由空格分隔

时间:2012-03-13 15:22:37

标签: sql-server sql-server-2008 sql-server-2005 tsql sql-server-2008-r2

我一直很好奇,这是否可能在SQL中

这是我的表

Text
-----
India 01/01/2001 Mumbai
SriLanka 01/01/2001 Colombo
USA 01/01/2001 Chicago

从这些创建表中单独的列(用空格分隔),如

Country     Date        Location  
-----       -----       -------- 
India       01/01/2001   Mumbai
SriLanka    01/01/2001   Colombo
USA         01/01/2001   Chicago

只有我在这里结构的东西是我们在JAVA中做的正则表达式。

在SQL中也是可能的。

谢谢!!!

2 个答案:

答案 0 :(得分:1)

您可以使用表值函数拆分列,如下所示:

CREATE FUNCTION [dbo].[fnParseFields] ( @str NVARCHAR(max), @delimiter NCHAR )
RETURNS @retval TABLE(Country NVARCHAR(max), [Date] NVARCHAR(max), Location NVARCHAR(max))
AS
BEGIN
    declare @f1 varchar(max), @f2 varchar(max), @f3 varchar(max);
    set @str=ltrim(@str);

    -- Field 1
    set @f1=(left(@str,CHARINDEX(@delimiter,@str,1)-1));
    SET @str=RIGHT(@str,LEN(@str)-CHARINDEX(@delimiter,@str,1));

    -- Field 2
    set @f2=(left(@str,CHARINDEX(@delimiter,@str,1)-1));

    -- Field 3
    SET @f3=RIGHT(@str,LEN(@str)-CHARINDEX(@delimiter,@str,1));
    insert into @retval values (@f1,@f2,@f3);

    RETURN;
END

GO

create table myText (sometext varchar(80));

insert into myText values
('India 01/01/2001 Mumbai')
, ('SriLanka 01/01/2001 Colombo')
, ('USA 01/01/2001 Chicago');
go

select f.* from myText
cross apply [dbo].[fnParseFields](sometext,' ') f
go

结果:

enter image description here

答案 1 :(得分:0)

实际上还没有尝试过,但是可以使用T-SQL导入逗号分隔值文件

BULK
INSERT tableName
FROM 'c:\csvtest.txt'
WITH
(
FIELDTERMINATOR = ' ',
ROWTERMINATOR = '\n'
)

Here是样本的来源。

<强>更新 如果数据存储在数据库中,似乎没有比编写函数/存储过程来解析CSV更简单的解决方案,如this SO answer所示。