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

时间:2015-12-09 06:35:36

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

所以我有一个table列,其类型为VARCHAR (100),我想知道是否有办法配置SQL Server 2012 (T-SQL),以便在事务尝试提交 101+个字符然后它需要前100个。

这是可能的,还是我应该在truncation方面做C# ???

4 个答案:

答案 0 :(得分:4)

通常,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)。然后,如果传入的数据对于列太长,它将回滚并引发截​​断错误,而不是静默截断和插入。当然,冒着误导任何查看存储过程头信息的人而不理解所做的事情的风险。

Source: Silent Truncation of SQL Server Data Inserts

答案 1 :(得分:1)

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

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操作。

答案 2 :(得分:0)

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

SQL Server将您指定为varchars的任何stored procedure parameters静默截断为varchar的长度。所以你应该考虑stored procedures来满足你的要求。所以它会自动处理。

答案 3 :(得分:0)

如果您有实体类(不一定来自EF),您可以使用StringLength(your field length)属性来执行此操作。