代码之家  ›  专栏  ›  技术社区  ›  roman m

需要一些t-sql说明吗

  •  0
  • roman m  · 技术社区  · 16 年前

    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,除非我在末尾选择@X?

    SELECT @X = SCOPE_IDENTITY()
    

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

    2 回复  |  直到 9 年前
        1
  •  1
  •   Matthew Vines    16 年前
    SELECT SCOPE_IDENTITY()
    

    如您所见,返回一个BIGINT

    SELECT @X = SCOPE_IDENTITY()
    

    因此,您将返回BIGINT SCOPE_IDENTITY,同时将其强制转换为INT并将结果设置为@X。

    返回@X返回整数结果。

    Just some interesting reading on the subject.

    SQL Server 7.0联机丛书 声明:“建议设置 @局部变量不能用于变量 @局部变量。”

        2
  •  2
  •   Steve Kass    16 年前

      SELECT @X = SCOPE_IDENTITY()
    

    是一个赋值语句。与大多数编程语言一样,赋值语句是通过首先计算右侧来执行的。在本例中,右侧的计算结果为bigint。当@X的值得到结果bigint时,会有一个隐式类型转换,因为@X的类型(int)与其接收的值不同。

    SQL是一种类型化语言,表达式的类型(如此处的SCOPE_IDENTITY())取决于表达式,而不取决于计算后表达式值的变化。

    类比:

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