【问题标题】:Difference between SQL variable datatype and Table column datatypeSQL 变量数据类型和表列数据类型之间的区别
【发布时间】:2016-01-30 02:36:42
【问题描述】:

SQLvariable 数据类型和表column 数据类型有什么区别。

考虑下面的例子:

DECLARE @variable CHAR(1)

SET @variable = 'quarter'

SELECT @variable --works

结果:Q

但是当我在表格中做同样的事情时会出错

DECLARE @table TABLE
  (
     col CHAR(1)
  )

INSERT INTO @table
VALUES      ('quarter') --Fails

消息 8152,级别 16,状态 14,第 9 行字符串或二进制数据将是 被截断。

我浏览了 MSDN 关于DECLARE @local_variable 仍然没有得到任何答案。谁能告诉我是什么原因。

【问题讨论】:

  • 在类型上没有区别,但是在操作符上(set vs insert)
  • @Lashane -谢谢,你能详细解释一下吗

标签: sql sql-server variables types


【解决方案1】:

主要区别在于SET 和INSERT 中的警告如何工作,这里是SET ANSI_WARNINGS documentation

设置为 ON 时,除零和算术溢出错误会导致语句回滚并生成错误消息。当设置为 OFF 时,被零除和算术溢出错误会导致返回空值。发生被零除或算术溢出错误导致返回空值的行为if an INSERT or UPDATE is tried on a character, Unicode, or binary column in which the length of a new value exceeds the maximum size of the column. If SET ANSI_WARNINGS is ON, the INSERT or UPDATE is canceled as specified by the ISO standard. 字符列忽略尾随空白,二进制列忽略尾随空。关闭时,数据被截断为列的大小,语句成功。

但是,它不影响 SET 语句:

在存储过程、用户定义函数中传递参数或在批处理语句中声明和setting variables 时,不遵守ANSI_WARNINGS。例如,if a variable is defined as char(3), and then set to a value larger than three characters, the data is truncated to the defined size 和 INSERT 或 UPDATE 语句成功。

所以,您可以禁用 ansi 警告,您的插入查询将起作用。但我更喜欢警告,但在应用端进行数据验证/截断。

【讨论】:

  • +1 这是一个很好的答案,但从实践的角度来看,我认为这样做会很糟糕。正确的做法是在插入字段时对字段进行子串化/保留。
  • @Ghost 我认为有一个 option 来做一个或另一个没有错。您能否诚实地说,在每一种情况中,静默截断是“正确”的做法?如果我想说SET 和INSERT 之间的一致性(同时保持可选性)会更好。
  • @DStanley 我坚持认为,在每种情况下,代码显式截断数据比隐式截断数据的选项更好。
  • @Ghost 好吧,我认为有时您可能希望潜在的截断是一个错误,所以我认为可选性是一件好事。但我想我们必须同意不同意。
猜你喜欢
  • 2013-11-17
  • 1970-01-01
  • 2014-11-15
  • 1970-01-01
  • 2010-10-28
  • 2014-09-06
  • 2015-03-31
  • 2016-12-10
  • 1970-01-01
相关资源
最近更新 更多