如果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在试图向字段中插入超过其容纳的数据时会出现错误
字符串或二进制数据将被截断。语句已终止。
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(字段长度)属性来执行此操作。