0

これは、 t-sqlでの 私の前の質問のフォローアップです。

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

最後にSELECT@Xを実行しない限り、なぜBIGINTが返されるのですか?

psが判明

SELECT @X = SCOPE_IDENTITY()

何も返さず、@xを設定するだけです

4

2 に答える 2

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への暗黙の変換があります。

ほとんどのプログラミング言語には魔法はありません。

于 2009-10-18T00:08:05.143 に答える
1
SELECT SCOPE_IDENTITY()

あなたが見たようにBIGINTを返します

SELECT @X = SCOPE_IDENTITY()

BIGINTを返し、INT変数@Xにキャストします

したがって、BIGINT SCOPE_IDENTITYを返し、同時にそれをINTにキャストし、その結果を@Xに設定します。

@Xを返すと、INTの結果が返されます。

主題に関するいくつかの興味深い読書。

SQL Server 7.0 Books Onlineは、「変数の割り当てには、SELECT@local_variableではなくSET@local_variableを使用することをお勧めします」とも述べています。

于 2009-10-17T19:09:46.743 に答える