c# - 如果 SQL Server 2012 插入太大,我该如何截断插入?

标签 c# asp.net tsql database-design sql-server-2012

所以我有一个,其中有一列类型为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 信息但不了解已完成操作的人的风险。

Source: Silent Truncation of SQL Server Data Inserts

关于c# - 如果 SQL Server 2012 插入太大,我该如何截断插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34172199/

相关文章:

asp.net - 可以为 IIS 的 HTTP 压缩添加 axd 扩展吗?

c# - 垃圾收集 - 一个有效但另一个无效,怎么会这样?

c# - 将大字符串中的子字符串匹配到大量关键字列表的最佳方法是什么

asp.net - 在数据库或文件中保存长细节?

SQL Server 内存中 OLTP 哈希索引设置 BUCKET_COUNT 值

sql-server - 为什么我不能在 T-SQL 函数中的表变量上运行 INSERT EXEC?

sql - 在所有存储过程中搜索模式然后打开它进行更改的方法

c# - 使用 IdentityServer3 生成无密码的访问 token

c# - 如何抑制 StyleCop 警告 SA1403?

c# - 如何将 SQL 日期结果转换为英国格式 (dd/mm/yyyy)