【问题标题】:Update only new batch records on T-SQL Trigger仅更新 T-SQL 触发器上的新批处理记录
【发布时间】:2018-04-15 13:45:48
【问题描述】:

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

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 

我正在从创建者无法解析地址的 Web 表单中导入这些数据。因此,我需要将每个地址字段拆分为自己的变量。我已经构建了一个执行此操作的示例,并尝试在插入后的触发器中实现此操作,然后更新目标表中的相同字段。

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

同样需要注意。我试图在将记录插入表后运行此触发器,并更新新值进入的同一个表中的值。

提前感谢您的帮助!

【问题讨论】:

  • INSERTED table can have multiple rows,所以你的触发器需要修改来处理它。我建议将解析逻辑放入 inline table valued function. 关注点分离应该会有所帮助。
  • 此外,不建议在触发器中进行冗长的字符串操作......
  • 我建议之后使用预定的 proc 批量执行,而不是在触发器中执行。触发器中的任何错误(并且在脏数据上使用子字符串会使错误几乎不可避免)将导致整个记录的插入失败。你不希望这种情况发生。
  • 感谢您的建议。我正在尝试解决关注点分离问题,因为我知道这样做的好处。我只是不确定从这里去哪里。理想情况下,该地址将通过 php 从 Web 表单上的文本框输入中解析,但开发人员声称他们不能这样做。我正在尝试调整它以进行批处理。我只需要找出接下来要构建哪些部件以允许处理批处理记录。
  • 您建议如何调整插入查询以处理多行?任何伪代码都应该有帮助。

标签: sql-server tsql triggers


【解决方案1】:

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

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

祝你好运。

【讨论】:

  • 感谢您的建议。我主要是尝试通过触发器/存储过程来编写它。执行此 SQL 的底层应用程序是 MS-Access 应用程序。我正在尝试构建一个封闭的循环,可以将记录从 mySQL 导入 SQL。底层 VBA 代码正在调用它。理想情况下,用 C# 或 VB 编写一些东西会很好,但这可能需要额外的设置。如果做到这一点,我将尝试使用 LINQ 实现一个 C# 库,我想我可以轻松实现这一点。但是,这目前不在我的项目中,只会扩展此任务的范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 2016-10-18
  • 1970-01-01
  • 2015-07-27
相关资源
最近更新 更多