Pourquoi quelque chose comme ça ne marche pas?
SELECT
CASE
WHEN NULLIF(COL_LENGTH('Customers', 'Somecol'), '') IS NULL THEN NULL
ELSE Somecol
END AS MyTest
FROM Customers;
Je vérifie simplement si la colonne existe, cependant, SQL Server se plaint de Somecol
ne pas exister. Y a-t-il une alternative à cela dans une seule déclaration?
sql-server
t-sql
Carson Reinke
la source
la source
CASE
instruction.INFORMATION_SCHEMA
pourrait fonctionner comme solution de contournement.Réponses:
La requête suivante utilise la même idée que dans cette étonnante réponse de ypercube :
Cela fonctionne comme ceci:
si
dbo.Customers
a une colonne nomméeSomeCol
, alorsSomeCol
inSomeCol AS MyTest
sera résolu commedbo.Customers.SomeCol
;si la table n'a pas une telle colonne, la référence sera toujours valide, car maintenant elle sera résolue comme
dummy.SomeCol
: lesdummy
colonnes peuvent être référencées dans ce contexte.Vous pouvez spécifier plusieurs colonnes "de rechange" de cette façon. L'astuce n'est pas d'utiliser l'alias de table pour de telles colonnes (ce qui est une pratique désapprouvée dans la plupart des situations, mais dans ce cas, l'omission de l'alias de table vous aide à résoudre le problème).
Si la table est utilisée dans une jointure et que l'autre table a la sienne
SomeCol
, vous devrez probablement utiliser la requête ci-dessus comme table dérivée avant de l'utiliser dans la jointure afin de continuer à fonctionner, quelque chose comme ceci:la source
Une façon de procéder consiste à vérifier l'existence des colonnes, puis à créer le Dynamic SQL en fonction de l'existence ou non de cette colonne.
Sans Dynamic SQL, SQL Server tentera d'évaluer si la colonne existe ou non avant même d'exécuter l'instruction, ce qui entraîne une erreur.
Cela signifie cependant que vous aurez 2 requêtes à écrire et potentiellement modifier à l'avenir. Mais je ne pense pas que vous devriez vraiment cibler des
SELECT
déclarations sur des colonnes qui peuvent ne pas exister.la source
Vous pouvez utiliser du XML pour interroger les colonnes qui pourraient se trouver dans le tableau.
Créez un XML à partir de toutes les colonnes par ligne dans une application croisée et extrayez la valeur à l'aide de la
values()
fonction.Dans cette requête, l'ID est connu, récupérez-le directement dans la table. Col1 et Col2 peuvent être présentes ou non, alors utilisez-les en XML.
SQL Fiddle
la source
Mon approche ne diffère que légèrement des autres. Je préfère utiliser le système pour cela et obtenir simplement un nombre car vous pouvez attribuer le nombre de colonnes à une variable en haut d'une requête, puis choisir de continuer ou non en fonction de cela. L'inconvénient est que… si vous avez le même nom de colonne dans plusieurs tables, vous n'êtes pas certain que la colonne existe dans la table que vous souhaitez interroger. Cependant, la technique fonctionne également sur des tables particulières, car vous ne cherchez qu'à obtenir un compte.
Le «problème» de le demander spécifiquement est le problème que vous rencontrez. En général, si une valeur NULL vous pose des problèmes… trouvez un autre moyen de vérifier l'existence. C'est une façon de le faire sans risquer de perturber le serveur.
la source
sysobjects
également le dans votre requête pour vérifier si la table spécifique a une telle colonne?SELECT 1 ...
ne fait pas d'erreur non plus.EXISTS (SELECT ...)
est généralement plus rapide que(SELECT COUNT(*) ...)
, et non l'inverse.Si je l'ai bien compris ...
Vous pouvez utiliser la requête quelque chose comme ci-dessous et agir en conséquence en fonction du nombre ... Si le nombre est> 1, cela signifie que vous avez le col dans cette table, et le nombre = 0, alors vous n'avez pas ce col dans ce table
SELECT count (*)
FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME IN ('Id')
AND TABLE_SCHEMA = 'dbo' and TABLE_NAME = 'UserBase';
la source