SQL变量数据类型和表列数据类型之间的区别

时间:2016-01-29 17:29:38

标签: sql sql-server variables types

SQL variable数据类型与表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仍然没有得到任何答案。谁能告诉我是什么原因。

1 个答案:

答案 0 :(得分:3)

主要区别在于.getHours()SET中的警告是如何工作的,这里是SET ANSI_WARNINGS documentation

  

设置为ON时,除零和算术溢出错误会导致语句回滚并生成错误消息。设置为OFF时,除零和算术溢出错误会导致返回空值。发生除零或算术溢出错误导致返回空值的行为INSERT对于字符列,将忽略尾随空白,对于二进制列,将忽略尾随空值。当OFF时,数据被截断为列的大小,语句成功。

但是,它不会影响SET语句:

  

在存储过程,用户定义函数中传递参数或在批处理语句中声明和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.时,不遵守ANSI_WARNINGS。例如,setting variables和INSERT或UPDATE语句成功。

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