2009-10-17 5 views
0

Ceci est un suivi de my previous question, en t-sqlBesoin d'un peu t-sql clarification

SELECT SCOPE_IDENTITY() 

retourne un BIGINT, je ne le suit pour obtenir de renvoyer une INT:

DECLARE @X INT 

INSERT ... 

SELECT @X = SCOPE_IDENTITY() 

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

SELECT @X 

Pourquoi retourne-t-il un BIGINT à moins que je ne fasse SELECT @X à la fin?

p.s. se révèle

SELECT @X = SCOPE_IDENTITY() 

ne retourne rien, il se permet @x

Répondre

1
SELECT SCOPE_IDENTITY() 

retourne un BIGINT que vous avez vu

SELECT @X = SCOPE_IDENTITY() 

retours BIGINT et jette dans INT variables @ X

Ainsi, vous renvoyez BIGINT SCOPE_IDENTITY et vous le convertissez simultanément en INT et définissez ce résultat sur @X . Renvoyer @X renvoie le résultat INT.

Just some interesting reading on the subject.

SQL Server 7.0 en ligne a également déclaré: "Il est recommandé que SET @local_variable être utilisé pour la variable affectation plutôt que SELECT @local_variable."

+0

J'ai un problème avec "retourne BIGINT et le jette dans la variable INT @X" ... il ne semble pas faire cela, il renvoie un bigint sauf si je sélectionne explicitement @x –

+0

Je l'ai relu, et ce que j'ai dit est un peu ambigu, j'espère que je l'ai clarifié. –

+0

ok, votre édition a du sens maintenant, thanx –

2

La déclaration

SELECT @X = SCOPE_IDENTITY() 

est une instruction d'affectation. Comme dans la plupart des langages de programmation, une instruction d'affectation est exécutée en évaluant d'abord le côté droit. Dans ce cas, le côté droit évalue à un bigint. Quand la valeur de @X obtient le bigint résultant, il y a une conversion de type implicite, parce que @X est un type différent (int) de la valeur qu'il reçoit.

SQL est un langage typé, et le type d'une expression (telle que SCOPE_IDENTITY() ici) dépend de l'expression, pas de ce qui arrive à la valeur de l'expression après l'évaluation.

Analogie:

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

Vous ne suggérez que 3,2 + 0,2 est un entier, vous? C'est 3.4, un nombre décimal. Seulement à cause de l'assignation, il y a une conversion implicite en INT.

Il n'y a pas de magie dans la plupart des langages de programmation.

+0

+1 pour une explication détaillée –