我们使用了一个 Web 服务,该服务决定将字段的最大长度从 255 更改为 255。我们这边有一个旧的供应商表,其上限仍然为 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 服务,因此我们也不能要求他们修复它。任何帮助,将不胜感激。
该错误无法避免,因为错误是在填充插入的表时发生的。
从文档中:http://msdn.microsoft.com/en-us/library/ms191300.aspx http://msdn.microsoft.com/en-us/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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)