2012-03-30 32 views
1

在T-SQL中,我需要用新行字符分隔TEXT值,然後在每行上循環。用新行分隔文本塊

換句話說,我需要一個explode()函數,但對於T-SQL,我需要在每一行上循環。

我很難創建一個新的臨時表,並將字符串的行作爲行存儲在此表中,然後使用遊標在其上循環。我只是不確定如何分隔字符串。

在T-SQL中有一種快速的方法嗎?

+1

請不要把TSQL的標題,這是什麼標籤爲 – 2012-03-30 14:25:02

+0

哪個版本的SQL Server? – 2012-03-30 14:30:06

+0

我們正在使用MSSQL 2000,我將編輯我的標籤。 – 2012-03-30 14:30:51

回答

3

(我應該比4000個caracters你的數據會更大。)

分割功能:

CREATE FUNCTION dbo.Split 
(
    @RowData nvarchar(2000), 
    @SplitOn nvarchar(5) 
) 
RETURNS @RtnValue table 
(
    Id int identity(1,1), 
    Data nvarchar(2000) 
) 
AS 
BEGIN 
    Declare @Cnt int 
    Set @Cnt = 1 

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

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

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

    Return 
END 

而且爆炸功能:

CREATE FUNCTION dbo.*tableName*_Explode 
(
    @id int 
) 
RETURNS @RtnValue table 
(
    Id int, 
    Data NVARCHAR(2000) 
) 
AS 
BEGIN 
    DECLARE @LINEBREAK AS varchar(2) 
    SET @LINEBREAK = CHAR(13) + CHAR(10) 

    DECLARE @short_text NVARCHAR(2000) 
    DECLARE @short_text_length INT 

    DECLARE @sub_length INT 
    SET @sub_length = 2000 
    DECLARE @sub_index INT 
    SET @sub_index = 1 


BEGIN 
    SET @short_text = (select SUBSTRING(*tableData*,@sub_index,@sub_length) from *tableName* WHERE id = @id) 
    SET @short_text_length = DATALENGTH(@short_text) 

      WHILE (@short_text_length > 0) 
    BEGIN 
     Insert Into @RtnValue (id,data) 
     SELECT @id, @short_text 

     SET @sub_index = (@sub_index + @sub_length) 
     SET @short_text = (select SUBSTRING(*tableData*,@sub_index,@sub_length) from *tableName* WHERE id = @id) 
     SET @short_text_length = DATALENGTH(@short_text) 
    END 

    IF (SELECT COUNT(*) FROM @RtnValue) = 0 
     Insert Into @RtnValue (id,data) 
     SELECT @id, '' 
    END 

    RETURN 
END