【问题标题】:How can I make SQL Server 2012 truncate insertions if they are too big?如果 SQL Server 2012 插入太大,如何截断插入?
【发布时间】:2016-03-14 08:03:43
【问题描述】:

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

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

【问题讨论】:

  • 你能发表你的INSERT声明吗?
  • 我假设可以在 DB 端完成,但这可能是个坏主意。最好在应用层中使用它,否则您将在(比如说)6 个月内遇到错误,并且不知道为什么您的数据库会随机破坏数据。

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


【解决方案1】:

通常,SQL Server 会在尝试向字段中插入超出其容量的数据时显示错误

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

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

默认情况下,ANSI_WARNINGS 处于打开状态,某些活动(例如在计算列或索引视图上创建索引)需要打开它们。但如果它们被关闭,SQL Server 将根据需要截断数据以使其适合列。会话的 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)。然后,如果传入的数据对于该列来说太长,它将回滚并引发截​​断错误,而不是静默截断和插入。当然,这可能会误导任何查看存储过程标头信息而不了解所做操作的人。

Source: Silent Truncation of SQL Server Data Inserts

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2017-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多