web-dev-qa-db-ja.com

CASEステートメントを使用して、テーブルに列が存在するかどうかを確認します-SQL Server

他のC#コードに埋め込まれたSQLサーバーステートメントを使用しています。また、テーブルに列が存在するかどうかを確認したいだけです。

列(ここでModifiedByUSer)が存在する場合、1またはtrueを返します。そうでない場合は、またはfalse(またはC#で解釈できる類似のもの)を返します。

次のようなCASEステートメントを使用している限り、

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

しかし、ModifiedByUserが存在しない場合、invalid column name、戻り値の代わり。

私も考慮しました:

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

しかし、結果に基づいて条件付きで値/ブール/ビットを返す方法がわかりません。助けていただければ幸いです!

21

最終的な答えは、上記の2つを組み合わせたものでした(感謝を示すために両方を支持しました!)。

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
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

これを試してください-

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

システムの「テーブル列マッピング」テーブルで確認できます

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