SQL Server テーブルに列が存在するかどうかを確認するにはどうすればよいですか?
-
02-07-2019 - |
質問
特定の列が存在しない場合は追加する必要があります。次のようなものがありますが、常に false が返されます。
IF EXISTS(SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName')
SQL Server データベースのテーブルに列が存在するかどうかを確認するにはどうすればよいですか?
解決
SQL Server 2005 以降:
IF EXISTS(SELECT 1 FROM sys.columns
WHERE Name = N'columnName'
AND Object_ID = Object_ID(N'schemaName.tableName'))
BEGIN
-- Column Exists
END
マーティン・スミスのバージョンはもっと短いです:
IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
-- Column Exists
END
他のヒント
より簡潔なバージョン
IF COL_LENGTH('table_name','column_name') IS NULL
BEGIN
/* Column does not exist or caller does not have permission to view the object */
END
メタデータの表示に関する権限に関するポイントは、この回答だけでなくすべての回答に当てはまります。
最初のパラメータテーブル名が COL_LENGTH
必要に応じて、1 つ、2 つ、または 3 つの部分からなる名前形式にすることができます。
別のデータベースのテーブルを参照する例は次のとおりです。
COL_LENGTH('AdventureWorks2012.HumanResources.Department','ModifiedDate')
メタデータ ビューの使用と比較したこの回答の 1 つの違いは、次のようなメタデータ関数があることです。 COL_LENGTH
有効な分離レベルに関係なく、常にコミットされた変更に関するデータのみを返します。
特定の要件に合わせて以下を調整します。
if not exists (select
column_name
from
INFORMATION_SCHEMA.columns
where
table_name = 'MyTable'
and column_name = 'MyColumn')
alter table MyTable add MyColumn int
質問に対処するために編集します:これはうまくいくはずです。コードに愚かな間違いがないか注意深く調べてください。たとえば、挿入が適用されているのと同じデータベースで INFORMATION_SCHEMA をクエリしていますか?どちらかのステートメントのテーブル/列名にタイプミスはありませんか?
これを試して...
IF NOT EXISTS(
SELECT TOP 1 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
[TABLE_NAME] = 'Employees'
AND [COLUMN_NAME] = 'EmployeeID')
BEGIN
ALTER TABLE [Employees]
ADD [EmployeeID] INT NULL
END
私が好むのは INFORMATION_SCHEMA.COLUMNS
Microsoft はバージョン間でシステム テーブルを保持することを保証していないためです。例えば、 dbo.syscolumns
SQL 2008 でも引き続き機能しますが、非推奨となっており、将来いつでも削除される可能性があります。
情報スキーマ システム ビューを使用すると、関心のあるテーブルに関するほぼすべての情報を見つけることができます。
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTableName'
ORDER BY ORDINAL_POSITION
また、Information_schema ビューを使用して、ビュー、ストアド プロシージャ、およびデータベースに関するほとんどすべてのものを問い合わせることもできます。
まず、 table
/column
(id
/name
) の組み合わせが存在します dbo.syscolumns
(フィールド定義を含む内部 SQL Server テーブル)、そうでない場合は、適切な ALTER TABLE
クエリを実行して追加します。例えば:
IF NOT EXISTS ( SELECT *
FROM syscolumns
WHERE id = OBJECT_ID('Client')
AND name = 'Name' )
ALTER TABLE Client
ADD Name VARCHAR(64) NULL
ドロップするために列の存在を確認している人向け。
で SQLサーバー2016 大きなステートメントの代わりに新しい DIE ステートメントを使用できます。 IF
ラッパー
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
次のようなことを試してください:
CREATE FUNCTION ColumnExists(@TableName varchar(100), @ColumnName varchar(100))
RETURNS varchar(1) AS
BEGIN
DECLARE @Result varchar(1);
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName)
BEGIN
SET @Result = 'T'
END
ELSE
BEGIN
SET @Result = 'F'
END
RETURN @Result;
END
GO
GRANT EXECUTE ON [ColumnExists] TO [whoever]
GO
次に、次のように使用します。
IF ColumnExists('xxx', 'yyyy') = 'F'
BEGIN
ALTER TABLE xxx
ADD yyyyy varChar(10) NOT NULL
END
GO
SQL Server 2000 と SQL Server 2005 の両方で動作するはずです。SQL Server 2008 についてはわかりませんが、なぜそうしないのかわかりません。
私の友人で同僚が、 IF
SQL関数を使用したブロック OBJECT_ID
そして COLUMNPROPERTY
SQL SERVER 2005 以降では、列をチェックします。次のようなものを使用できます。
IF (OBJECT_ID(N'[dbo].[myTable]') IS NOT NULL AND
COLUMNPROPERTY( OBJECT_ID(N'[dbo].[myTable]'), 'ThisColumnDoesNotExist', 'ColumnId') IS NULL)
BEGIN
SELECT 'Column does not exist -- You can add TSQL to add the column here'
END
declare @myColumn as nvarchar(128)
set @myColumn = 'myColumn'
if not exists (
select 1
from information_schema.columns columns
where columns.table_catalog = 'myDatabase'
and columns.table_schema = 'mySchema'
and columns.table_name = 'myTable'
and columns.column_name = @myColumn
)
begin
exec('alter table myDatabase.mySchema.myTable add'
+' ['+@myColumn+'] bigint null')
end
これは SQL 2000 ではうまくいきました。
IF EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'table_name'
AND column_name = 'column_name'
)
BEGIN
...
END
これを試して
SELECT COLUMNS.*
FROM INFORMATION_SCHEMA.COLUMNS COLUMNS,
INFORMATION_SCHEMA.TABLES TABLES
WHERE COLUMNS.TABLE_NAME = TABLES.TABLE_NAME
AND Upper(COLUMNS.COLUMN_NAME) = Upper('column_name')
SQL SERVER 2000でも同様のものが必要でしたが、@Mitchが指摘しているように、これは2005以降でのみ機能します。
他の人に役立つとしたら、これが最終的に私にとってうまくいったものです:
if exists (
select *
from
sysobjects, syscolumns
where
sysobjects.id = syscolumns.id
and sysobjects.name = 'table'
and syscolumns.name = 'column')
if exists (
select *
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = '<table_name>'
and COLUMN_NAME = '<column_name>'
) begin
print 'Column you have specified exists'
end else begin
print 'Column does not exist'
end
IF NOT EXISTS( SELECT NULL
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'tablename'
AND table_schema = 'db_name'
AND column_name = 'columnname') THEN
ALTER TABLE `TableName` ADD `ColumnName` int(1) NOT NULL default '0';
END IF;
select distinct object_name(sc.id)
from syscolumns sc,sysobjects so
where sc.name like '%col_name%' and so.type='U'
の一時テーブル バージョン 受け入れられた回答:
if (exists(select 1
from tempdb.sys.columns
where Name = 'columnName'
and Object_ID = object_id('tempdb..#tableName')))
begin
...
end
Wheat の答えは適切ですが、どのスキーマまたはデータベースにも同一のテーブル名と列名のペアが存在しないことを前提としています。そのような状況でも安全にするには、これを使用してください...
select *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
and Table_Schema = 'SchemaName'
and Table_Name = 'TableName'
and Column_Name = 'ColumnName'
列の存在を確認するにはいくつかの方法があります。使用することを強くお勧めします INFORMATION_SCHEMA.COLUMNS
ユーザーと通信するために作成されるためです。次の表を考慮してください。
sys.objects
sys.columns
チェックできるその他のアクセス方法もいくつかあります system catalog.
また、使用する必要はありません SELECT *
, 、単純にテストしてください NULL value
IF EXISTS(
SELECT NULL
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName'
)
最もシンプルでわかりやすい解決策の 1 つは次のとおりです。
IF COL_LENGTH('Table_Name','Column_Name') IS NULL
BEGIN
-- Column Not Exists, implement your logic
END
ELSE
BEGIN
-- Column Exists, implement your logic
END
以下は、データベース内の列の追加を管理するために使用する簡単なスクリプトです。
IF NOT EXISTS (
SELECT *
FROM sys.Columns
WHERE Name = N'QbId'
AND Object_Id = Object_Id(N'Driver')
)
BEGIN
ALTER TABLE Driver ADD QbId NVARCHAR(20) NULL
END
ELSE
BEGIN
PRINT 'QbId is already added on Driver'
END
この例では、 Name
それは ColumnName
追加されることと、 Object_Id
それは TableName
以下のクエリを使用して、検索された列がテーブルに存在するかどうかを確認できます。以下のように検索結果に基づいて決定することもできます。
IF EXISTS (SELECT 'Y' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = <YourTableName> AND COLUMN_NAME = <YourColumnName>)
BEGIN
SELECT 'Column Already Exists.'
END
ELSE
BEGIN
ALTER TABLE <YourTableName> ADD <YourColumnName> <DataType>[Size]
END
さらに別のバリエーションも…
SELECT
Count(*) AS existFlag
FROM
sys.columns
WHERE
[name] = N 'ColumnName'
AND [object_id] = OBJECT_ID(N 'TableName')
table -->script table as -->新しいウィンドウ - デザインスクリプトがあります。新しいウィンドウで列名を確認して検索します
以下のクエリを実行して、指定されたテーブルに列が存在するかどうかを確認します。
IF(SELECT COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'TableName' AND COLUMN_NAME = 'ColumnName') IS NOT NULL
PRINT 'Column Exists in the given table';
IF EXISTS(SELECT 1 FROM sys.columns
WHERE Name = N'columnName'
AND Object_ID = Object_ID(N'schemaName.tableName'))
これは、この問題に対するかなり簡単な方法であり、直接的な解決策となるはずです。同様のシナリオでこれを何度も使用しました。それは魅力的に機能します、それについては疑いの余地がありません。
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Table Name' and COLUMN_NAME = 'Column Name')
BEGIN
--COLUMNS EXISTS IN TABLE
END
ELSE BEGIN
--COLUMNS DOES NOT EXISTS IN TABLE
END