2013-08-01 1 views
22

je suis en train de réaliser:variable de table temporaire SQL

declare @TEMP table (ID int, Name varchar(max)) 
insert into @temp SELECT ID, Name FROM Table 

SELECT * FROM @TEMP 
WHERE @TEMP.ID = 1  <--- ERROR AT @TEMP.ID 

mais une erreur résultant

doit déclarer la variable scalaire "de @temp".

une aide?

+3

'SELECT * FROM @TEMP T O WH T.ID = 1' – GriGrim

Répondre

26

Un alias de table ne peut pas démarrer avec @. Alors, donnez @Temp un autre alias (ou laisser de côté les deux parties nommant au total):

SELECT * 
FROM @TEMP t 
WHERE t.ID = 1; 

En outre, un seul signe égal est traditionnellement utilisé dans SQL pour une comparaison.

10

Utilisez soit un Allias dans la table comme T et utilisez T.ID, ou utilisez simplement le nom de la colonne.

declare @TEMP table (ID int, Name varchar(max)) 
insert into @temp SELECT ID, Name FROM Table 

SELECT * FROM @TEMP 
WHERE ID = 1 
7

Si vous mettez entre parenthèses le @ vous pouvez l'utiliser directement

declare @TEMP table (ID int, Name varchar(max)) 
insert into @temp values (1,'one'), (2,'two') 

SELECT * FROM @TEMP 
WHERE [@TEMP].[ID] = 1 
3

Il y a une autre méthode de table temporaire

create table #TempTable (
ID int, 
name varchar(max) 
) 

insert into #TempTable (ID,name) 
Select ID,Name 
from Table 

SELECT * 
FROM #TempTable 
WHERE ID = 1 

Assurez-vous sélectionnez la bonne base de données.

-4

Vous avez déclaré @TEMP mais dans votre instruction d'insertion @temp. Noms de variables sensibles à la casse.

changement @temp à @temp

+2

Les variables ne sont PAS sensibles à la casse. –

-1

Contrairement aux paramètres habituels qui commencent par un '@' (par exemple @parameter), des tables temporaires doivent commencer par un # (par exemple #temptable). Comme le suggère GauravSetia, vous devez déclarer votre table temporaire comme vous le feriez pour une table normale, mais nommez-la avec un # au lieu d'un @ et elle ne sera disponible que dans votre session actuelle et sera supprimée lorsque vous fermerez la session. Vous pouvez également avoir une table temporaire globale qui commence par un ## (par exemple ## globalTempTable) qui peut être utilisé entre les sessions et qui disparaît lorsque vous fermez la session dans laquelle elle a été créée, mais je n'en ai pas encore utilisé.

+1

Il existe en effet des variables de table ainsi que des tables temporaires.Il y a des moments où ils sont préférables à utiliser et des moments où les tables temporaires sont préférables à utiliser. Les tables temporaires peuvent être indexées et sont meilleures pour les grands ensembles de données. Les variables de table sont souvent plus rapides pour les petits ensembles de données et sont souvent utilisées dans les procs stockés pour les destinations source SSIS si la requête pour obtenir les données est complexe car SSIS ne peut pas déterminer les colonnes si vous utilisez une table temporaire. Les variables de table sont nécessaires si vous souhaitez conserver certaines données après une restauration, telles que les données que vous avez insérées et qui ont provoqué l'échec. – HLGEM

+0

Oh, désolé! Merci d'avoir attrapé ça: je vais m'assurer de savoir de quoi je parle avant de répondre la prochaine fois. –

0

Vous devez utiliser des tables de hachage (#), que vous recherchez réellement car la valeur des variables restera jusqu'à cette exécution. par exemple. -

declare @TEMP table (ID int, Name varchar(max)) 
insert into @temp SELECT ID, Name FROM Table 

Lorsque deux instructions ci-dessus et deux ci-dessous s'exécutent séparément. L'erreur s'affichera car la valeur de la variable est perdue lorsque vous exécutez le lot de la deuxième requête. Il donne définitivement o/p lorsque vous exécutez un bloc entier de code.

La table de hachage est la meilleure option possible pour stocker et récupérer la valeur temporaire. Cela dure longtemps jusqu'à ce que la session des parents soit en vie.

Questions connexes