2012-12-11 53 views
0

如何使这个跳过重复?TSQL分割功能跳过重复

该柱可以是 一个;二;三;二

想上的分裂; while循环中插入前要跳过所述第二两(任何重复)

CREATE FUNCTION dbo.Split2 
(
    @RowData varchar(max), 
    @SplitOn varchar(5) 
) 
RETURNS @RtnValue table 
(
    Id int identity(1,1), 
    Data varchar(8000) 
) 
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.Split2 
(
    @RowData varchar(max), 
    @SplitOn varchar(5) 
) 
RETURNS @RtnValue table 
(
    Id int identity(1,1), 
    Data varchar(8000) 
) 
AS 
BEGIN 
    Declare @Data varchar(8000) 
    Declare @Cnt int 
    Set @Cnt = 1 

    While (Charindex(@SplitOn,@RowData)>0) 
    Begin 
     set @Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1))) 
     IF NOT EXISTS (SELECT * FROM @RtnValue WHERE data = @Data) 
     BEGIN 
      INSERT INTO @RtnValue (data) 
      VALUES (@Data) 
     END 
     Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData)) 
     Set @Cnt = @Cnt + 1 
    End 
    set @Data = ltrim(rtrim(@RowData)) 
    IF NOT EXISTS (SELECT * FROM @RtnValue WHERE data = @Data) 
    BEGIN 
     INSERT INTO @RtnValue (data) 
     VALUES (@Data) 
    END 

    Return 
END 
+0

明确你通过重复的意思的IF条件?你不能只在这里放置一个DISTINCT子句吗? – Neil

+0

数据可能是重复的。将更新问题 – Paparazzi

回答

1

检查。如下添加IF NOT EXISTS;

DECLARE @temp VARCHAR(100) --declare a temp variable 

While (Charindex(@SplitOn,@RowData)>0) 
Begin 

    SELECT @temp = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1))) 

    IF NOT EXISTS (SELECT * FROM @RtnValue WHERE data = @temp) 
    BEGIN 
     INSERT INTO @RtnValue (data) 
     VALUES (@temp) 
    END 

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

编辑:添加用于检查所有脑干

+0

这看起来应该起作用。 – Neil

+0

还必须检查最终插入。我几乎拥有它。我错过了NOT EXISTS。谢谢 – Paparazzi