【问题标题】:How to Trim white spaces of string in stored procedure?如何在存储过程中修剪字符串的空格?
【发布时间】:2015-12-23 10:22:04
【问题描述】:

我有两张桌子:

目标表: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

Table TEMp专业化

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

【问题讨论】:

  • id 列 - 身份?
  • 如果此行执行正确的更新操作 THEN UPDATE SET T.Description1 = S.Description1 我认为这应该是 THEN UPDATE SET S.Description1 =T.Description1

标签: sql sql-server trim


【解决方案1】:

使用LTRIM(RTRIM(s.Name)) 删除字段开头和结尾的空格,因此您的合并语句变为:

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

【讨论】:

  • USE [TempDatabase] GO SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[TempDatabase2] WITH EXECUTE AS owner as BEGIN MERGE Specialization 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 和 t .name =s.name THEN UPDATE SET T.Description1 = S.Description1 输出 $action,插入。*;完结还是不行!!重复条目:(
  • TRIM 函数未删除一些空白字符。尝试结合 RIGHT 和 ASCII 函数来看看你在处理什么。
【解决方案2】:
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

【讨论】:

  • 仍然返回重复条目。名称就像“过敏症”两个空格。但我不认为这很重要。
  • 请提供一个小数据集用于测试目的
【解决方案3】:

我用过

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

它现在可以工作了!! 谢谢

【讨论】:

    猜你喜欢
    • 2010-09-16
    • 2010-10-20
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    相关资源
    最近更新 更多