比较表与数据之间的空格,表没有空格

时间:2016-08-04 23:16:53

标签: sql

将表与数据之间的空格进行比较,表中没有空格。

表A中的数据填充到表B.我需要将MINUS查询写为表A作为源,表B作为目标

表A和表B中的样本数据: -

表A有三个字段:ID,Cd_1和Cd_2

字段:Cd_1或Cd_2在代码之间可以有空格。下面的示例在Code_1

中的X和Y之间有两个空格
ID  | Cd_1    | Cd_2
-----------
1   | X  Y    | Z

表B有两个字段:ID,Cd

表B应该填充Cd_1中的代码(非空格)和表A中的Cd_2

示例:

ID | Cd
--------
1 | X    
1 | Y    
1 | Z

1 个答案:

答案 0 :(得分:0)

有一个表函数用于根据分隔符(space ='')分割字符串。

CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512))
RETURNS table
AS
RETURN (
    WITH Pieces(pn, start, stop) AS (
      SELECT 1, 1, CHARINDEX(@sep, @s)
      UNION ALL
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
      FROM Pieces
      WHERE stop > 0
    )
    SELECT 
      SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
    FROM Pieces
  )

因此,要将表A中的代码插入表B,您可以使用此查询:

DECLARE @st1 as varchar(max),@st2 as varchar(max), @PractitionerId int

DECLARE MY_CURSOR CURSOR 
  LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR 
SELECT distinct  ID
FROM [dbo].[TableA]

OPEN MY_CURSOR
FETCH NEXT FROM MY_CURSOR INTO @PractitionerId
WHILE @@FETCH_STATUS = 0
BEGIN 
    select @st1 = Cd_1, @st2 = Cd_2 
    from [dbo].[TableA]
    WHERE ID = @PractitionerId

    INSERT INTO tableB (ID, Cd) select @PractitionerIdas ID ,* from dbo.Split(' ', @st1)
    INSERT INTO tableB (Id, Cd) select @PractitionerIdas ID,* from dbo.Split(' ', @st2)

    FETCH NEXT FROM MY_CURSOR INTO @PractitionerId
END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR