一尘不染

帮助SQL Server触发器以在插入之前截断错误数据

sql

我们使用了决定将字段的最大长度从255更改为一个Web服务。我们的终端上有一个旧的供应商表,该表仍然限制为255。我们希望使用触发器来暂时解决此问题,直到我们能够实现在我们的下一个迭代中提供了一个更加商业友好的解决方案。

这是我开始的:

CREATE TRIGGER [mySchema].[TruncDescription] 
ON  [mySchema].[myTable] 
INSTEAD OF INSERT
AS 
BEGIN
SET NOCOUNT ON;

INSERT INTO [mySchema].[myTable]
SELECT SubType, type, substring(description, 1, 255)
FROM inserted
END

但是,当我尝试在上插入时myTable,出现错误:

字符串或二进制数据将被截断。该语句已终止。

我尝试进行实验,SET ANSI_WARNINGS OFF该查询允许查询工作,但随后根本没有在描述列中插入任何数据。

有什么方法可以使用触发器来截断太长的数据,或者还有另一种方法可供我使用,直到可以设计出更加雄辩的解决方案为止?由于表是供应商表,因此我们在表修改方面受到了相当有限的限制(即不能这样做),并且我们无法控制正在使用的Web服务,因此我们也无法要求他们对其进行修复。任何帮助,将不胜感激。


阅读 124

收藏
2021-03-08

共1个答案

一尘不染

无法避免该错误,因为在填充插入表时发生了错误。

从文档中:http :
//msdn.microsoft.com/zh-
cn/library/ms191300.aspx

“插入和删除表的格式与定义INSTEAD OF触发器的表的格式相同。插入和删除表中的每一列都直接映射到基础表中的列。”

我能想到的唯一真正的“聪明”想法是利用登录名使用的模式和默认模式。如果可以获得Web服务用来引用另一个表的登录名,则可以增加该表上的列大小,并使用INSTEAD
OF INSERT触发器对供应商表执行INSERT。一种变化是在另一个数据库中创建表,并为Web服务登录设置默认数据库。

CREATE TRIGGER [myDB].[mySchema].[TruncDescription] 
ON  [myDB].[mySchema].[myTable] 
INSTEAD OF INSERT
AS 
BEGIN
SET NOCOUNT ON;

INSERT INTO [VendorDB].[VendorSchema].[VendorTable]
SELECT SubType, type, substring(description, 1, 255)
FROM inserted
END
2021-03-08