2017-08-12 6 views
0

私はテーブル名のリストを持っており、それぞれがデータベースに存在するかどうかをチェックしたいと思います。私はcheck if a table existsの方法を知っていて、テーブル名ごとに選択式を結合することができますが、より簡単な解決策が必要です。これは私の現在のコードです:SQL Serverにテーブルの一覧が存在するかどうかを確認する方法?

select 'TableName1', CASE 
     WHEN EXISTS(SELECT TABLE_NAME 
        FROM INFORMATION_SCHEMA.TABLES 
        WHERE TABLE_NAME = 'TableName1') THEN 1 
     ELSE 0 
     end 
union 
select 'TableName2', CASE 
     WHEN EXISTS(SELECT TABLE_NAME 
        FROM INFORMATION_SCHEMA.TABLES 
        WHERE TABLE_NAME = 'TableName2') THEN 1 
     ELSE 0 
     end 
-- and so on 
+0

を使用することができますTABLE_NAMEはそのデータベースのテーブルのリストを返します –

+0

@PrasannaKumarJすべてのテーブルのリストは欲しくないので、テーブルのリスト(例えば 'TN1'、 'TN2'、 'TN3' 、...)がDBに存在するので、テーブルが存在するかどうかを示すフラグが1つずつ必要です。 – saastn

答えて

4

あなたがすることで、このSELECT * INFORMATION_SCHEMA.TABLES FROM TABLE_TYPE = 'BASE TABLE' 順序を試してみてください。この

SELECT 
    table_name, 
    CASE WHEN OBJECT_ID(table_name,'U') IS NULL THEN 0 ELSE 1 END 
FROM (VALUES 
     ('dbo.table1'), 
     ('dbo.table2')) V(table_name) 
+1

に参加しています。それは美しいです、前にそのように使用されたFROM構文を見たことはありません。 –

0

あなたはintersectとexceptを使うことができます。例えば

DROP TABLE #T 
CREATE TABLE #T (TABLE_NAME VARCHAR(100)) 
INSERT INTO #T VALUES 
('MYTABLE'),('TABLE2'),('ZZZ') 

print 'IN INFORMATION_SCHEMA' 
SELECT TABLE_NAME FROM #T 
INTERSECT 
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES 
print 'NOT IN ONFORMATION SCHEMA' 
SELECT TABLE_NAME FROM #T 
EXCEPT 
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES 

(3 row(s) affected) 
IN INFORMATION_SCHEMA 
TABLE_NAME 
-------------------------------------------------------------------------------------------------------------------------------- 
MYTABLE 
TABLE2 

(2 row(s) affected) 

NOT IN ONFORMATION SCHEMA 
TABLE_NAME 
-------------------------------------------------------------------------------------------------------------------------------- 
ZZZ 

(1 row(s) affected) 
+0

ありがとうございますが、実行できません: 'INTERSECT操作で" Arabic_CI_AS "と" SQL_Latin1_General_CP1_CI_AS "の照合の競合を解決できません。 – saastn

+0

SQL Server管理スタジオ(ssms)を使用していますか? –

+0

はい、私のデータベースがアラビア語の照合を使用しているというエラーメッセージが表示されます。 – saastn

0
CREATE TABLE #yourtable (TABLE_NAME VARCHAR(100)COLLATE SQL_Latin1_General_CP1_CS_AS NULL) 
    INSERT INTO #yourtable VALUES 
    ('TableName1'),('TableName2'),soon... 

    SELECT t.table_name,(case when d.table_name is null then 0 else 1 end) flag FROM INFORMATION_SCHEMA.TABLES t 
    left join #yourtable d on d.table_name COLLATE SQL_Latin1_General_CP1_CI_AS =t.TABLE_NAME COLLATE SQL_Latin1_General_CP1_CI_AS 
+0

クエリが更新されました。 –

+0

P.Salmonさんの答えと同じ問題です。「操作と同じで、「Arabic_CI_AS」と「SQL_Latin1_General_CP1_CI_AS」の照合の競合を解決できません。 – saastn

+0

照会が変更されました。 –

1

は、あなたの質問に指定されたEXACT出力はこれを試して取得します。 P.Salmonの答えははるかにエレガントであるが、これは私の作品: -

USE MASTER; 

DECLARE @tables TABLE(RowNum int Identity, TableName varchar(255), DoesExist bit); 
INSERT INTO @tables 
SELECT 'Table1',null 
UNION 
SELECT 'spt_fallback_dev',null 

DECLARE @TableName varchar(255), @RowPosition int=0, @TotalRows int = (SELECT COUNT(*) FROM @tables) 
WHILE (@RowPosition <= @TotalRows) 
BEGIN 
    SET @RowPosition = @RowPosition + 1; 
    SELECT @TableName = (SELECT TableName FROM @tables WHERE RowNum = @RowPosition); 

    UPDATE @tables 
    SET DoesExist = (SELECT CASE WHEN EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' AND [email protected]) THEN 1 ELSE 0 END) 
    WHERE RowNum = @RowPosition; 

END 

SELECT * FROM @tables; 
関連する問題