2015-12-23 47 views
1

我有两个表:如何在存储过程中修剪字符串的空格?

目标表:Specialisation (id , name , description)

源表TempSpecialisation(id , name , description)

我想TempSpe.description复制到Specialisation.Description如果名称相匹配或插入Specialisation一个新的纪录,所有列。 由于Specialisation.name末尾的空格,我得到重复条目。

我的程序是:

USE [TempDatabase] 
GO 
/****** Object: StoredProcedure [dbo].[TempDatabase2] Script Date:  23/12/2015 3:46:49 PM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[TempDatabase2] 
WITH EXECUTE AS owner 
as 
BEGIN 

MERGE Specialisation as T 
USING TempSpecialisation as S 
ON s.Name = T.Name 
WHEN NOT MATCHED BY Target 
THEN INSERT(id ,Name, Description1) VALUES(S.id ,S.Name, S.Description1) 
WHEN MATCHED and t.name =s.name 
THEN UPDATE SET T.Description1 = S.Description1 
OUTPUT $action, inserted.*; 
End 

表专业化

id  Name   Descriptions 
545454 "Allergist  " null 

表TEmpSpecialisation

id  Name   Descriptions 
1  "Allergist" This is a doctor who helps with allergies. 

我需要更新从TEmpSpecialisation专业化描述。 但它给输出像

id  Name   Descriptions 
1  "Allergist" This is a doctor who helps with allergies. 
545454 "Allergist  " null 
+0

'id'列 - 身份? – Devart

+0

如果这条线做正确的更新操作,然后更新SET T.Description1 = S.Description1我想这应该是再更新SET S.Description1 = T.Description1 –

回答

3

使用LTRIM(RTRIM(s.Name))从一开始就与现场的末尾删除空白,所以你的MERGE语句变成:

MERGE Specialisation as T 
USING TempSpecialisation as S 
ON LTRIM(RTRIM(s.Name)) = LTRIM(RTRIM(T.Name)) 
WHEN NOT MATCHED BY Target 
THEN INSERT(id ,Name, Description1) VALUES(S.id ,S.Name, S.Description1) 
WHEN MATCHED 
THEN UPDATE SET T.Description1 = S.Description1 
OUTPUT $action, inserted.*; 
End 

LTRIM Documentation

RTRIM Documentation

+0

使用[TempDatabase] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [DBO]。[TempDatabase2] WITH EXECUTE AS所有者 作为 BEGIN MERGE专业化为T USING TempSpecialisation为S ON(LTRIM(RTRIM(s.Name)))=(LTRIM( RTRIM(T.Name))) 未匹配目标 THEN INSERT(S.id,S.Name,S.Description1) WHEN MATCHED and t.name = s.name THEN UPDATE SET T.Description1 = S.Description1 OUTPUT $ action,插入*。 结束 仍然没有工作!重复项目:( –

+0

有TRIM功能没有删除空格字符尝试结合右和ASCII功能,看看你正在处理 –

0
ALTER PROCEDURE [dbo].[TempDatabase2] 
WITH EXECUTE AS OWNER 
AS 
BEGIN 

    MERGE dbo.Specialisation T 
    USING dbo.TempSpecialisation S ON LTRIM(S.Name) = LTRIM(T.Name) 
    WHEN NOT MATCHED BY TARGET 
     THEN 
      INSERT (id, Name, Description1) 
      VALUES (S.id, S.Name, S.Description1) 
    WHEN MATCHED AND ISNULL(T.Description1, '') != ISNULL(S.Description1, '') -- remove ISNULL if Description1 NOT NULL 
     THEN 
      UPDATE SET T.Description1 = S.Description1 
    OUTPUT $ACTION, INSERTED.*; 

END 
+0

仍然返回重复条目 NAme是像“过敏症” 两个空格。我不重要。 –

+0

请提供用于测试目的的小数据集 – Devart

0

我使用

ON CHARINDEX(s.name,t.name) = 1 

它现在工作! 谢谢