如何检查SQL Server中是否存在表的列表?

问题描述:

我有表的名单,我想检查是否在数据库或者不是他们中的每一个存在。我知道如何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

试试这个SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = '基表' ORDER BY TABLE_NAME给它在临数据库 –

+0

表的名单@PrasannaKumarJ我不希望所有表的列表,我想知道,如果表的列表(例如'“TN1'','” TN2'',''TN3'' ,...)存在于DB中,我想为它们中的每一个标记一个标志,指示表是否存在。 – saastn

您可以使用此

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

这是美丽的,我还从来没见过与以前使用这样的语法。 –

您可以使用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

谢谢,但我不能运行:operation.' – saastn

+0

你使用SQL Server Management Studio中(SSMS)'无法解析在INTERSECT“Arabic_CI_AS”和规则“SQL_Latin1_General_CP1_CI_AS”之间的排序规则冲突? –

+0

是的,错误消息显示我的数据库使用阿拉伯语整理。 – saastn

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”之间的排序规则冲突operation.' – saastn

+0

查询被改变检查。 –

为了让你在你的问题中指定的确切输出试试这个。 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;