2014-02-06 18 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', '¬') 
, '¬');