【发布时间】: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 条记录的工作示例,但更多时候我会导入多条记录。我不确定下一步该去哪里解决我的困境。我应该在存储过程或函数中解析数据吗?
同样需要注意。我试图在将记录插入表后运行此触发器,并更新新值进入的同一个表中的值。
提前感谢您的帮助!
【问题讨论】:
-
INSERTEDtable can have multiple rows,所以你的触发器需要修改来处理它。我建议将解析逻辑放入 inline table valued function. 关注点分离应该会有所帮助。 -
此外,不建议在触发器中进行冗长的字符串操作......
-
我建议之后使用预定的 proc 批量执行,而不是在触发器中执行。触发器中的任何错误(并且在脏数据上使用子字符串会使错误几乎不可避免)将导致整个记录的插入失败。你不希望这种情况发生。
-
感谢您的建议。我正在尝试解决关注点分离问题,因为我知道这样做的好处。我只是不确定从这里去哪里。理想情况下,该地址将通过 php 从 Web 表单上的文本框输入中解析,但开发人员声称他们不能这样做。我正在尝试调整它以进行批处理。我只需要找出接下来要构建哪些部件以允许处理批处理记录。
-
您建议如何调整插入查询以处理多行?任何伪代码都应该有帮助。
标签: sql-server tsql triggers