web-dev-qa-db-fra.com

Utilisez l'instruction CASE pour vérifier si la colonne existe dans la table - SQL Server

J'utilise une instruction SQL server incorporée dans un autre code C #; et je veux simplement vérifier si une colonne existe dans ma table.

Si la colonne (ModifiedByUSer ici) existe, alors je veux retourner un 1 ou un true; si ce n'est pas le cas, je veux retourner un ou un false (ou quelque chose de similaire qui peut être interprété en C #).

J'ai jusqu'à utiliser une instruction CASE comme celle-ci:

SELECT cast(case WHEN EXISTS (select ModifiedByUser from Tags) 
            THEN 0 
            ELSE 1 
            END as bit)

Mais si ModifiedByUser n'existe pas, je reçois un invalid column name, au lieu de la valeur de retour.

J'ai également envisagé:

IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Tags' AND COLUMN_NAME = 'ModifiedByUser')
  BEGIN // Do something here to return a value
  END

Mais je ne sais pas comment retourner conditionnellement une valeur/bool/bit en fonction du résultat. Toute aide très appréciée!

21
WheretheresaWill

La réponse finale était une combinaison de deux des réponses ci-dessus (j'ai surévalué les deux pour montrer mon appréciation!):

select case 
   when exists (
      SELECT 1 
      FROM Sys.columns c 
      WHERE c.[object_id] = OBJECT_ID('dbo.Tags') 
         AND c.name = 'ModifiedByUserId'
   ) 
   then 1 
   else 0 
end
30
WheretheresaWill
select case
         when exists (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Tags' AND COLUMN_NAME = 'ModifiedByUser')
         then 0
         else 1
       end
13
GSerg
SELECT *
FROM ...
WHERE EXISTS(SELECT 1 
        FROM sys.columns c
        WHERE c.[object_id] = OBJECT_ID('dbo.Tags')
            AND c.name = 'ModifiedByUser'
    )
3
Mayank Awasthi

Essaye celui-là -

SELECT *
FROM ...
WHERE EXISTS(SELECT 1 
        FROM sys.columns c
        WHERE c.[object_id] = OBJECT_ID('dbo.Tags')
            AND c.name = 'ModifiedByUser'
    )
2
Devart

Vous pouvez archiver la table du "mappage des colonnes de table" du système

SELECT count(*)
  FROM Sys.Columns c
  JOIN Sys.Tables t ON c.Object_Id = t.Object_Id
 WHERE upper(t.Name) = 'TAGS'
   AND upper(c.NAME) = 'MODIFIEDBYUSER'
1
pratik garg