所以我有一个表
,其中有一列类型为VARCHAR (100)
,我想知道是否有办法配置SQL Server 2012 (T -SQL)
这样,如果事务尝试提交一个包含 101+ 个字符 的字符串,那么它将采用前 100 个字符。
这可能吗,还是我应该在 C#
方面执行 截断
???
最佳答案
通常,SQL Server 会在任何尝试向字段中插入超过其可容纳的数据时出现错误
String or binary data would be truncated. The statement has been terminated.
SQL Server 不允许仅因为列太小而无法接受数据而静默截断数据。但是,SQL Server 可以通过其他方式截断即将插入到表中的数据,而不会产生任何形式的错误或警告。
默认情况下,ANSI_WARNINGS 是打开的,某些事件(例如在计算列或索引 View 上创建索引)需要打开它们。但如果它们被关闭,SQL Server 将根据需要截断数据以使其适合列。 session 的 ANSI_WARNINGS 设置可以通过以下方式控制
SET ANSI_WARNINGS { ON|OFF }
与插入表不同,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
结果是:
This
123
这有时会以微妙的方式表现出来,因为将值传递给存储过程或函数会将其分配给参数变量,并会悄悄地进行转换。一种可以帮助防止这种情况的方法是为将直接插入到表中的任何参数提供比目标列更大的数据类型,以便 SQL Server 将引发错误,或者可能随后检查参数的长度并具有当它太长时自定义代码来处理它。
例如,如果存储过程将使用参数将数据插入到列为 varchar(10) 的表中,则将参数设置为 varchar(15)。然后,如果传入的数据对于列而言太长,它将回滚并引发截断错误,而不是静默截断和插入。当然,这存在误导任何查看存储过程 header 信息但不了解已完成操作的人的风险。
关于c# - 如果 SQL Server 2012 插入太大,我该如何截断插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34172199/