用于提取字符串'go'的拆分函数

时间:2014-02-06 15:36:59

标签: sql sql-server-2008

我有一个名为Split的表值函数。该函数需要2个字符串。它将根据第二个字符串的值将第一个字符串拆分为行。

我想要在'go'语句中拆分sql的函数。问题是当它在sql中的任何地方找到字符串'go'时它会拆分sql字符串。我需要它才能在字符串'go'上拆分,只有它本身就在一条线上。有任何想法吗?我希望不必重新编写该函数,而是以某种方式(希望简单)修改它。

IF EXISTS (SELECT * FROM sys.objects WHERE
        type = 'TF' AND name = 'Split')
  BEGIN
    DROP FUNCTION [dbo].[Split]
  END
GO 

CREATE FUNCTION dbo.Split
(
    @RowData nvarchar(MAX),
    @SplitOn nvarchar(50)
)  
RETURNS @RtnValue table 
(
Id int identity(1,1),
Data nvarchar(MAX)
) 
AS  
BEGIN 
Declare @Cnt int
DECLARE @tst varchar(MAX)

Set @Cnt = 1

While (Charindex(@SplitOn,@RowData)>0)
Begin
    Select 
        @tst =     ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)));

    Insert Into @RtnValue (data)
    Select 
        Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))

    Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+2,len(@RowData))
    Set @Cnt = @Cnt + 1
End

Insert Into @RtnValue (data)
Select Data = ltrim(rtrim(@RowData))

Return
END
GO

-- test out the function
SELECT data 
        FROM dbo.Split('
begin transaction;
go

alter table activity_log add
  hcm_got_estimate_num char(16) default (NULL);
go

set ANSI_NULLS on;
go

commit;
go'
, 'go');

1 个答案:

答案 0 :(得分:0)

我们的想法是在“拆分”参数中为“go”添加回车符。不幸的是,拆分在这种组合上不能很好地工作(一些工件仍然存在)。因此,为了不搞乱Split功能,您可以通过用一些特殊字符替换回车+'go'来准备文本,然后对该字符进行拆分:

SELECT data 
        FROM dbo.Split(REPLACE('
begin transaction;
go

alter table activity_log add
  hcm_got_estimate_num char(16) default (NULL);
go

set ANSI_NULLS on;
go

commit;
go',char(13) + char(10) + 'go', '¬')
,  '¬');