提问人:Joe Defill 提问时间:11/8/2023 最后编辑:Joe Defill 更新时间:11/8/2023 访问量:48
添加 SQL 触发器以始终删除更新/插入列中的前导/尾随空格?[关闭]
Add SQL trigger to always remove leading/trailing spaces in column for updates/inserts? [closed]
问:
如果我在表中插入一行,我需要其中一列永远不会有前导/尾随空格。如果表被大量使用,使用触发器是否会导致大量开销延迟?如果是这样,有没有更好的方法?
INSERT INTO MyTable (item, qty) VALUES (' test ', 2)
SELECT item FROM MyTable
上面应该返回“test”而不是“test”。
编辑:请注意,这是最后的手段,我们无法清理所有正在导入的原始文件,我们将不得不更新许多应用程序。
答:
触发器是一种选择,但通常不是您首先想要达到的。
触发器确实会带来开销,恕我直言,更重要的是复杂性。触发器通常不是人们经常期望放在桌面上的那种东西,因此在故障排除或性能改进过程中可能会忽略它们。在我的整个职业生涯中,我想我可能已经为生产代码编写了两个触发器,它们都是针对非常奇怪的情况。所以是的,这是一种选择,但我认为你最好用不同的方式解决这个问题。
一般来说,如果你能在数据传入时清理数据,你会好得多。如果存储过程插入数据,只需在插入数据时进行调整,它就会去除前导/尾随空格(或 SQL2017+)。ltrim(rtrim(myvalue))
trim(myValue)
此外,如果字段不能有前导或尾随空格,请进行约束以强制执行!像这样的检查约束将保证您永远不会有任何带有前导/尾随空格的行。constraint MyCheckConstraint check (item not like ' %' and item not like '% ')
当然,它保证这一点的方式是在尝试这样做时抛出异常,这就是为什么在插入过程中清理这些值如此重要的原因。
我认为触发器是解决此问题的唯一情况是,如果您直接从原始文件中获取此数据,并且在加载过程中没有任何意义,例如,将其放入数据库进行清理。即便如此,我的建议是将“脏”数据加载到临时表中,然后运行 SQL 来清理数据并将其插入到实时表中。bcp
评论
ItemClean as ltrim(rtrim(Item))
上一个:SQL Server 重复
评论
constraint __chk check Item not like ' %' and item not like '% '
INSERT INTO MyTable (item, qty) VALUES (LTRIM(RTRIM(' test ')), 2);
)