我正在尝试将传入的地址信息解析为逗号分隔的字符串。我已经得到了使用这个伪样本解析我需要的信息
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条记录的工作样本,但更多时候我会导入多条记录。我不确定下一步该去哪,以解决我的困境。我应该解析存储过程或函数中的数据吗?
同样重要的是要注意。我在将记录插入到表中后尝试运行此触发器,并更新新值所在的同一个表中的值。
提前感谢您的帮助!
答案 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
祝你好运。