J'utilise le code suivant pour vérifier si la table temporaire existe et supprimer la table si elle existe avant de la créer à nouveau. Cela fonctionne très bien tant que je ne change pas les colonnes. Si j'ajoute une colonne plus tard, cela donnera une erreur disant "colonne invalide". Veuillez me faire savoir ce que je fais mal.
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
)
select company, stepid, fieldid from #Results
--Works fine to this point
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
NewColumn NVARCHAR(50)
)
select company, stepid, fieldid, NewColumn from #Results
--Does not work
BEGIN TRANSACTION; CREATE TABLE #Results; ...; DROP TABLE #Results; COMMIT
. Si la transaction réussit, la table sera supprimée. S'il échoue, la table disparaîtra également (car elle a été créée dans la transaction). Dans tous les cas: pas besoin de vérifier si la table existe déjà.Réponses:
Je ne peux pas reproduire l'erreur.
Je ne comprends peut-être pas le problème.
Ce qui suit fonctionne bien pour moi dans SQL Server 2005, avec la colonne "foo" supplémentaire apparaissant dans le deuxième résultat de sélection:
la source
'tempdb..#name'
c'est exactement ce dont j'avais besoin. J'utilisais'dbo.#name'
, comme un idiot. J'obtiens latempdb
pièce, mais qu'est-ce qui se passe avec les doubles points?La déclaration doit être de l'ordre
Sans 'GO' entre les deux, le tout sera considéré comme un seul script et lorsque l'instruction select recherchera la colonne, elle ne sera pas trouvée.
Avec 'GO', il considérera la partie du script jusqu'à 'GO' comme un seul lot et s'exécutera avant d'entrer dans la requête après 'GO'.
la source
Au lieu de
dropping
recréer la table temporaire, vous pouvez latruncate
réutiliserSi vous utilisez
Sql Server 2016
ouAzure Sql Database
utilisez la syntaxe ci-dessous pour supprimer la table temporaire et la recréer. Plus d'infos ici MSDNSyntaxe
Requete:
la source
truncate/reuse
méthode serait plus efficace que laDROP TABLE IF EXISTS
surSql Server 2016
etAzure Sql Database
aussi bien. Ce n'est pas le cas?DROP TABLE IF Exists
pour SQL 2016 ou Azure? La syntaxe est disponible à partir de SQL 2008. Voir le lien MSDN dans votre réponse? Facteur de performance?DROP TABLE
est pris en charge par SQL Server 2008, mais laIF EXISTS
clause a été introduite en 2016.INTO
: sélectionnez * INTO #HistoricoUserTable dans dbo.HistoricoUserJe pense que le problème est que vous devez ajouter une instruction GO entre les deux pour séparer l'exécution en lots. Comme le deuxième script de suppression, c'est-à
IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
- dire qu'il n'a pas supprimé la table temporaire faisant partie d'un seul lot. Pouvez-vous s'il vous plaît essayer le script ci-dessous.la source
tempdb..
dans le code ci-dessus est très important. Il doit précéder le nom de votre table temporaire. Une simple vérificationOBJECT_ID('#Results')
ne suffit pas. Les tables temporaires sont stockées dans la base de données TempDB. Par Microsoft: la base de données système TempDB est une ressource globale qui est disponible pour tous les utilisateurs connectés à l'instance de SQL Server ou connectés à la base de données SQLtempdb
ou cela ne disparaîtra pas.Cela pourrait être accompli avec une seule ligne de code:
la source
Cela a fonctionné pour moi: social.msdn.microsoft.com/Forums/en/transactsql/thread/02c6da90-954d-487d-a823-e24b891ec1b0?prof=required
la source
Juste un petit commentaire de mon côté car
OBJECT_ID
cela ne fonctionne pas pour moi. Il revient toujours que..even bien qu'il ne exist. Je viens de découvrir qu'il est stocké avec un nom différent (postfixé par des traits de
_
soulignement) comme ceci:#tempTable________
Cela fonctionne bien pour moi:
la source
Vous pouvez maintenant utiliser la syntaxe ci-dessous si vous utilisez l'une des nouvelles versions de SQL Server (2016+).
la source
Incorrect syntax near the keyword 'IF'.
IF [NOT] EXISTS
clause est disponible à partir de SQL Server 2016. Peu importe la version SSMS que vous utilisez.pmac72 utilise GO pour décomposer la requête en lots et utilise un ALTER.
Vous semblez exécuter le même lot mais l'exécuter deux fois après l'avoir modifié: DROP ... CREATE ... edit ... DROP ... CREATE ..
Peut-être postez votre code exact afin que nous puissions voir ce qui se passe.
la source
Je frappe généralement cette erreur lorsque j'ai déjà créé la table temporaire; le code qui vérifie les erreurs de l'instruction SQL voit la «vieille» table temporaire en place et retourne une erreur de calcul sur le nombre de colonnes dans les instructions ultérieures, comme si la table temporaire n'était jamais supprimée.
Après avoir modifié le nombre de colonnes dans une table temporaire après avoir déjà créé une version avec moins de colonnes, supprimez la table et exécutez ensuite votre requête.
la source
J'ai récemment vu un DBA faire quelque chose de similaire à ceci:
la source
Mon code utilise une
Source
table qui change et uneDestination
table qui doit correspondre à ces changements.la source
Oui, "colonne non valide", cette erreur est survenue à partir de la ligne "sélectionnez la société, stepid, fieldid, NewColumn de #Results".
Il y a deux phases d'exécution de t-sql,
tout d'abord, en analysant, dans cette phase, le serveur SQL vérifie la correction de votre chaîne SQL soumise, y compris la colonne de table, et optimise votre requête pour une récupération plus rapide.
deuxièmement, exécuter, récupérer les données.
Si la table #Results existe, le processus d'analyse vérifiera que les colonnes que vous avez spécifiées sont valides ou non, sinon (la table n'existe pas) l'analyse sera passée par les colonnes de vérification comme vous l'avez spécifié.
la source
Lorsque vous modifiez une colonne dans une table temporaire, vous devez supprimer la table avant d'exécuter à nouveau la requête. (Oui, c'est ennuyeux. Juste ce que vous avez à faire.)
J'ai toujours supposé que c'est parce que la vérification de la "colonne invalide" est effectuée par l'analyseur avant que la requête ne soit exécutée, elle est donc basée sur les colonnes du tableau avant qu'elle ne soit supprimée ..... et c'est ce que pnbs a également dit.
la source