Vérifier si la colonne existe dans la table temporaire renvoie toujours false dans SQL Server
J'ai la suite de l'Exécution de l'énoncé, ce qui crée un tableau (à l'aide de données provenant d'une autre procédure), insère les valeurs dans une table temporaire, ajoute une colonne image (parce qu'ils ne peuvent pas être inclus dans le groupement), puis des mises à jour sur la base de critères à partir d'une autre table temporaire (la table résultante des champs est utilisé dans un rapport SSRS, j'ai donc besoin de conserver le type de données IMAGE):
EXEC ('SELECT ' + @COL_TO_GROUP_BY + @COL_ADDITONAL + @sColVals + ' INTO
#RESULTS_TABLE from (' + @SQL_STATEMENT + ') A ' + @WHERE_CLAUSE + ' GROUP BY ' +
@COL_TO_GROUP_BY +
' ALTER TABLE #RESULTS_TABLE
ADD IMAGE_DATA IMAGE
IF EXISTS(SELECT * FROM tempdb.INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME =
''COLUMN_A'' and TABLE_NAME LIKE ''#RESULTS_TABLE%'')
BEGIN
UPDATE #RESULTS_TABLE
SET IMAGE_DATA = FILE_DATA
FROM #RESULTS_TABLE A, #IMAGE_TABLE B
WHERE A.COLUMN_A = B.COLUMN_A
END
SELECT * FROM #RESULTS_TABLE')
Le problème est que, indépendamment de savoir si COLUMN_A existe ou pas, la colonne de IMAGE_DATA est toujours NULL. Est-il un autre moyen d'obtenir des données dans le IMAGE_DATA de la colonne? S'il vous plaît aider!
Note: je vais pas accepter toutes les réponses qui en conclure que le problème est lié au contenu dans d'autres tableaux, plus précisément de la clause where. J'ai fait de multiples validations afin de s'assurer que les conditions peuvent être à la fois vrai et faux (correspondance lignes, pas de lignes correspondantes, etc..). Donc, ce qui exclut l'instruction conditionnelle. Merci.
EDIT:
Je ne suis pas encore totalement sûr de ce que la cause exacte de cela, mais j'ai fini par créer une table temporaire globale et a couru deux procédures distinctes, maintenant, il semble fonctionner correctement. J'ai dû accepter la réponse la plus étroitement appariés ma propre solution. Toutes les réponses et les commentaires ont été très viable. Merci!
WHERE A.COLUMN_A = B.IMAGE_VALUE
il semble que pour moi, c'est suffisant pour trouver la ligne droite par OBJ_ID
Merci pour cette remarque. Dans mon cas, j'ai besoin d'avoir les deux conditions, car il y a quelques lignes à double OBJ_IDs. J'ai simplifié mon code d'origine et aurait pris trop car il n'a pas l'air trompeuse. Je vais modifier la question.
Vous ne savez pas si cela aide, mais je pense que vous pouvez ajouter l'image dans la colonne select, comme ce
cast(null as Image) as IMAGE_DATA
sans avoir à ajouter à la clause group by, car il est une constante. BTW, pourquoi avez-vous besoin de tester si la colonne existe?Eriksson - Ajout de la distribution vont tout simplement me permettre de supprimer l'instruction ALTER TABLE. Bien que plus efficace, ne résout pas mon problème. Merci pour l'astuce! Je dois vérifier que la colonne n'existe que parce que je suis en tirant les colonnes dynamiques à partir d'une autre procédure et IMAGE_DATA est renseigné en fonction de si la colonne existe ou pas. J'ai édité la question pour la rendre plus dépendante de la colonne en cours de vérification.
OriginalL'auteur Carmen W | 2011-06-13
Vous devez vous connecter pour publier un commentaire.
Correcte.
Au moment de la compilation, la colonne n'existe pas. C'est, SQL Server regarde l'ensemble des commandes et de l'analyse/compile. Les effets d'un ALTER TABLE dans le code ne sera pas visible à plus tard commandes.
Que vous avez à faire de l'instruction ALTER TABLE séparément à la mise à JOUR
Remarque: Pour SQL Server 2005, vous avez de l'varbinary(max) qui est beaucoup plus souple et retirer une certaine complexité
OriginalL'auteur gbn
Vous avez plusieurs problèmes dans votre script:
TempDB
n'est pas le bon nom detempdb
. Votre code sera briser sur un serveur installé avec un classement sensible à la casse. Utilisez toujours le cas pour tous les noms de base de données. Vous code est susceptible de briser de même sur le résultat de la colonne des noms, commeCOLUMN_A
, si elle est exécutée en vertu d'une casse de déploiement..
Ce test montre que la colonne était mis à jour, afin de le vérifier EXISTE réussi. La conclusion évidente est que dans votre cas, la
OBJ_ID
jointure entre #RESULTS_TABLE et #IMAGE_TABLE ne trouve pas de match, ce qui est un problème qui dépend entièrement sur le contenu de vos tables.Modifier
Vous pouvez faire la
COLUMN_A
pour être dynamique, il fonctionne toujours très bien lorsqu'il est testé:Aucune infraction, mais à chaque fois que je suis confronté à "votre mot vs testé le comportement de "je choisir" a testé le comportement'. La balle est dans votre cour, vous devez prouver la SI la branche n'est pas pris.
J'ai regardé votre script et réalisé il y a une différence dans la façon dont vous avez exécuté vs la voie que j'ai. Mon script n'est pas explicitement la création d'COLUMN_A. COLUMN_A s'affiche en fonction du contenu tiré d'une autre procédure (une autre table) et est donc dynamique. Vous avez raison, si je le fais de cette façon, il fonctionne très bien (et je ne serais probablement pas besoin de faire la vérification à tous dans ce cas). Je pense que le problème vient de créer dynamiquement des colonnes.
Le test fonctionne toujours très bien si COLUMN_A est généré dynamiquement, voir ma mise à jour.
J'ai fini par créer une table temporaire globale et de deux procédures distinctes. Il semble fonctionner maintenant, donc je ne vais pas m'ingérer beaucoup plus avec elle. 🙂 J'ai dû accepter la réponse de gbn parce que son raisonnement correspondait plus étroitement avec ma solution. Cependant, un grand merci pour vos efforts.
OriginalL'auteur Remus Rusanu
Vous pouvez Vérifier si la colonne existe dans une table temporaire à l'aide de ...
OriginalL'auteur tarzanbappa