如果SQL Server 2012截断插入的内容太大,如何使它们截断

本文关键字:何使它 Server SQL 2012截 插入 如果 | 更新日期: 2023-09-27 18:26:10

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

这可能吗,或者我应该在C#方面做truncation???

如果SQL Server 2012截断插入的内容太大,如何使它们截断

通常情况下,SQL Server在试图向字段中插入超过其容纳的数据时会出现错误

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

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

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

SET ANSI_WARNINGS { ON|OFF }

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

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)。然后,如果传入的数据对于列来说太长,它将回滚并引发截断错误,而不是静默地截断和插入。当然,对于那些查看存储过程头信息却不了解所做操作的人来说,这可能会产生误导。

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

在代码级别执行此操作。插入当前字段时,请检查字段长度和子字符串。

string a = "string with more than 100 symbols";
if(a.Length > 100)
   a = a.Substring(0, 100);

之后,您将向插入查询添加一个as-sql参数。

另一种方法是在查询中执行此操作,但我不建议您执行此操作。

INSERT INTO Table1('YourColumn') VALUES(LEFT(RTRIM(stringMoreThan100symbols), 100))

LEFT正在切割管柱,RTRIM正在执行管柱的Trim操作。

我的建议是让应用程序端负责在调用任何DB操作之前验证输入。

SQL Server将您指定为stored procedure parameters的任何varchars静默地截断为varchar的长度。因此,您应该尝试为您的需求考虑stored procedures。所以它会自动处理。

如果您有实体类(不一定来自EF),则可以使用StringLength(字段长度)属性来执行此操作。