如果它们太大,我如何使SQL Server 2012截断插入?

use*_*283 6 c# t-sql asp.net database-design sql-server-2012

所以我有一个table类型的列,VARCHAR (100)我想知道是否有一种配置方式,SQL Server 2012 (T-SQL)以便如果一个事务尝试提交一个101+字符的字符串,那么它需要前100.

这是可能的,或者我应该做truncationC#事情侧???

Moh*_*ava 8

通常,SQL Server 将在任何尝试向字段中插入超过其所能容纳的数据时显示错误

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

SQL Server 不允许仅仅因为列太小而无法接受数据而对数据进行静默截断。但是,SQL Server 还可以通过其他方式截断即将插入表中的数据,而不会产生任何形式的错误或警告。

默认情况下,ANSI_WARNINGS 处于打开状态,并且某些活动(例如在计算列或索引视图上创建索引)需要打开它们。但是如果它们被关闭,SQL Server 将根据需要截断数据以使其适合列。会话的 ANSI_WARNINGS 设置可以通过以下方式控制

SET ANSI_WARNINGS { ON|OFF }
Run Code Online (Sandbox Code Playgroud)

与插入表不同,SQL Server 将悄悄地切断分配给变量的数据,而不管 ANSI_WARNINGS 的状态如何。例如:

declare @smallString varchar(5)
declare @testint int
set @smallString = 'This is a long string'
set @testint = 123.456
print @smallString
print @testint
Run Code Online (Sandbox Code Playgroud)

结果是:

This 
123
Run Code Online (Sandbox Code Playgroud)

这有时会以微妙的方式表现出来,因为将值传递给存储过程或函数会将其分配给参数变量,并且会悄悄地进行转换。可以帮助防止这种情况的一种方法是为将直接插入表中的任何参数提供比目标列更大的数据类型,以便 SQL Server 将引发错误,或者可能然后检查参数的长度并有当它太长时处理它的自定义代码。

例如,如果存储过程将使用参数将数据插入到列为 varchar(10) 的表中,则将参数设为 varchar(15)。然后如果传入的数据对于列来说太长,它将回滚并引发截​​断错误,而不是静默截断和插入。当然,这存在误导任何查看存储过程头信息而不了解所做操作的人的风险。

来源:SQL Server 数据插入的静默截断