sql - 帮助 SQL Server 触发器在插入前截断坏数据

标签 sql sql-server triggers

我们使用了一个 Web 服务,该服务决定将字段的最大长度从 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 上插入时,我收到错误:

String or binary data would be truncated. The statement has been terminated.



我尝试尝试 SET ANSI_WARNINGS OFF这允许查询工作,但只是没有在描述列中插入任何数据。

有什么方法可以使用触发器来截断过长的数据,或者在设计出更 Eloquent 解决方案之前,我可以使用其他替代方法吗?我们在表修改方面相当有限(即我们不能),因为它是一个供应商表,而且我们不控制我们正在使用的 Web 服务,所以我们也不能要求他们修复它。任何帮助,将不胜感激。

最佳答案

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

从文档:
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

关于sql - 帮助 SQL Server 触发器在插入前截断坏数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6102288/

相关文章:

sql - UniVerse SQL 查看所有表名称

java - MySQLSyntaxErrorException 神秘

创建更新触发器时出现 MySQL 语法错误

sql - 使用触发器将 postgres SQL 插入语句拆分为 2 个表

sql-server - 如何在插入前将触发器写入散列值?

sql - 计算sqlite数据库查询中的关联?

sql - 向sql中的列添加小写约束

具有附加条件的 SQL Server 全文搜索性能

sql-server - 无法使用 Jmeter 创建类 'com.microsoft.sqlserver.jdbc.SQLServerDriver' 的 JDBC 驱动程序

sql-server - SQL Server 2008 查找特定用户拥有的数据库