2014-02-06 21 views
0

我有一个称为拆分的表值函数。该函数需要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'); 
+2

你需要拆就''。我不确定数据是如何表示的,但它通常涉及ASCII字符10和13的组合(回车和换行符)。 –

+0

“当它自己在一条线上”?它的前后不会有空间**吗?它本身不会有长度吗? – bonCodigo

回答

0

想法是将回车添加到“拆分”参数中的“去”。不幸的是,拆分在这种组合上效果不佳(仍有一些工件)。所以,为了不惹拆分功能,您可以通过一些特殊的字符替换回车+“走”预习课文,然后做分割上的字符:

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', '¬') 
, '¬');