添加 SQL 触发器以始终删除更新/插入列中的前导/尾随空格?[关闭]

Add SQL trigger to always remove leading/trailing spaces in column for updates/inserts? [closed]

提问人:Joe Defill 提问时间:11/8/2023 最后编辑:Joe Defill 更新时间:11/8/2023 访问量:48

问:


想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。

14天前关闭。

如果我在表中插入一行,我需要其中一列永远不会有前导/尾随空格。如果表被大量使用,使用触发器是否会导致大量开销延迟?如果是这样,有没有更好的方法?

INSERT INTO MyTable (item, qty) VALUES (' test ', 2)
SELECT item FROM MyTable

上面应该返回“test”而不是“test”。

编辑:请注意,这是最后的手段,我们无法清理所有正在导入的原始文件,我们将不得不更新许多应用程序。

sql-server sql-server-2008

评论

2赞 Xedni 11/8/2023
我认为最好使用带有通配符的检查约束。.这将从一开始就防止任何不良数据进入。constraint __chk check Item not like ' %' and item not like '% '
0赞 Luuk 11/8/2023
或使用:(请参阅:DBFIDDLEINSERT INTO MyTable (item, qty) VALUES (LTRIM(RTRIM(' test ')), 2);)
0赞 QuestionGuyBob 11/8/2023
如果无法控制 insert 语句本身,则使用计算列。不要使用触发器。如果你可以控制 insert 语句,那么就按照 luuk 说的去做。
1赞 Stu 11/8/2023
如果您无法在源头清理数据,那么您的最后手段是代替触发器 - 文档中提供了详细信息。
0赞 Joe Defill 11/8/2023
这是正确的,我无法清理所有数据,因为我们有许多来自许多目的地的原始文件,并且必须更新所有应用程序。

答:

4赞 Xedni 11/8/2023 #1

触发器是一种选择,但通常不是您首先想要达到的。

触发器确实会带来开销,恕我直言,更重要的是复杂性。触发器通常不是人们经常期望放在桌面上的那种东西,因此在故障排除或性能改进过程中可能会忽略它们。在我的整个职业生涯中,我想我可能已经为生产代码编写了两个触发器,它们都是针对非常奇怪的情况。所以是的,这是一种选择,但我认为你最好用不同的方式解决这个问题。

一般来说,如果你能在数据传入时清理数据,你会好得多。如果存储过程插入数据,只需在插入数据时进行调整,它就会去除前导/尾随空格(或 SQL2017+)。ltrim(rtrim(myvalue))trim(myValue)

此外,如果字段不能有前导或尾随空格,请进行约束以强制执行!像这样的检查约束将保证您永远不会有任何带有前导/尾随空格的行。constraint MyCheckConstraint check (item not like ' %' and item not like '% ')

当然,它保证这一点的方式是在尝试这样做时抛出异常,这就是为什么在插入过程中清理这些值如此重要的原因。

我认为触发器是解决此问题的唯一情况是,如果您直接从原始文件中获取此数据,并且在加载过程中没有任何意义,例如,将其放入数据库进行清理。即便如此,我的建议是将“脏”数据加载到临时表中,然后运行 SQL 来清理数据并将其插入到实时表中。bcp

评论

2赞 Bohemian 11/8/2023
完全同意。修剪应通过应用完成。给应用程序开发人员一个公平的警告和他们必须遵守的日期,然后在该日期定义约束。添加触发器是双重错误的,因为它隐藏了真正的问题,并围绕糟糕的应用代码倾注了具体内容。
0赞 Joe Defill 11/8/2023
这就是问题所在,有许多源更新并插入到表中,处理所有异常将是一个问题。这不仅仅是一个应用程序,我们还使用原始文件。
0赞 Xedni 11/8/2023
另一种选择,虽然它完全粘贴了问题,但您可以向表中添加一个计算列,这基本上是ItemClean as ltrim(rtrim(Item))