需要一些t-sql澄清

时间:2009-10-17 19:04:58

标签: sql sql-server tsql sql-server-2008 scope-identity

这是t-sql

my previous question的后续行动
SELECT SCOPE_IDENTITY()

返回一个BIGINT,我做了以下操作让它返回一个INT:

DECLARE @X INT

INSERT ...

SELECT @X = SCOPE_IDENTITY()

-- if i don't include the line below, it will return a BIGINT

SELECT @X

为什么它会返回BIGINT,除非我最后选择SELECT @X?

P.S。事实证明

SELECT @X = SCOPE_IDENTITY()

不返回任何内容,只是设置@x

2 个答案:

答案 0 :(得分:2)

声明

  SELECT @X = SCOPE_IDENTITY()

是一个赋值语句。与大多数编程语言一样,通过首先评估右侧来执行赋值语句。在这种情况下,右侧评估为bigint。当@X的值得到生成的bigint时,会有一个隐式类型转换,因为@X是一个与它接收的值不同的类型(int)。

SQL是一种类型化的语言,表达式的类型(例如此处的SCOPE_IDENTITY())取决于表达式,而不取决于评估后表达式的值会发生什么。

类比:

DECLARE @i INT;
SET @i = 3.2 + 0.2;

你不会建议3.2 + 0.2是一个整数,对吗?这是3.4,小数。只是由于赋值,才会隐式转换为INT。

大多数编程语言都没有神奇之处。

答案 1 :(得分:1)

SELECT SCOPE_IDENTITY()

返回你看到的BIGINT

SELECT @X = SCOPE_IDENTITY()

返回BIGINT并将其转换为INT变量@X

所以你要返回BIGINT SCOPE_IDENTITY并同时将它转换为INT并将结果设置为@X。

返回@X返回INT结果。

Just some interesting reading on the subject.

  

SQL Server 7.0联机丛书也   声明:“建议SET   @local_variable可用于变量   赋值而不是SELECT   @local_variable“。