这是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
答案 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“。