仅更新T-SQL触发器

时间:2017-11-02 22:09:42

标签: sql-server tsql triggers

我正在尝试将传入的地址信息解析为逗号分隔的字符串。我已经得到了使用这个伪样本解析我需要的信息

CREATE TRIGGER aftInsParseAddress
AFTER INSERT 
AS
    DECLARE @address VARCHAR(100),
        @city VARCHAR(100),
        @stateZip VARCHAR(100),
        @source varchar(100),
        @state varchar(2) ,
        @zip varchar(5), 
        @country1 varchar(10) ,
        @country varchar(3) 

    SET @source = (SELECT AddressSourceA 
                   FROM table 
                   WHERE ID = 'GUID-GUID-GUID-GUID-GUID' AND Exported = 0)

    SELECT  
        @address = LEFT(@source, CHARINDEX(',', @source) - 1),
        @city = (SUBSTRING (@source, CHARINDEX(',', @source) + 2 ,
                                     CHARINDEX(',', @source, CHARINDEX(',', @source) + 1) - LEN(LEFT(@source, CHARINDEX(',', @source) )) -2)),
        @stateZip = SUBSTRING(@source, CHARINDEX(',', @source, LEN(@city) + LEN(@address)), 10),
        @state = (SUBSTRING(@stateZip, 3 ,4)),
        @zip = (SUBSTRING(@stateZip, 6, 9)),
        @country1 = (SUBSTRING(@source, (CHARINDEX(',', @source, LEN(@address) + LEN(@statezip) + LEN(@city) )), 5)),
        @country = (SUBSTRING(@country1, 3, 7))

    UPDATE SameTableInsertedInto 
    SET Address = @address, City = @city, 
        State = @state, Zip = @zip, 
        Country = @country 
    WHERE id IN (SELECT ID FROM inserted);

我会从一个字符串开始,作为我的@source =' 1600 Pennsylvania Ave NW,Washington,DC 20500,USA'

结束了解析出我需要它们的值,即

1600 Pennsylvania Ave NW
Washington 
DC 
20500
USA 

我从网络表单导入此数据,创建者无法解析其结尾的地址。因此,我需要将每个地址字段拆分为自己的变量。我已经构建了一个这样做的示例,并试图在插入后的触发器中实现它,然后更新目标表中的相同字段。

我能够构建成功触发1条记录的工作样本,但更多时候我会导入多条记录。我不确定下一步该去哪,以解决我的困境。我应该解析存储过程或函数中的数据吗?

同样重要的是要注意。我在将记录插入到表中后尝试运行此触发器,并更新新值所在的同一个表中的值。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

解析地址真的很难。 在这里看到好参考: How to parse freeform street/postal address out of text, and into components

也就是说,如果您找到了一个很好的算法(而不是使用MelissaData服务),并且如果您决定在SQL Trigger中运行它,那么您最好将代码放入CLR存储过程。在CLR存储过程中,您将拥有更好的语言(C#,VB)来实现这样的算法,而不是TSQL。 这是一个执行作业的库(YMMV)https://usaddress.codeplex.com

祝你好运。