如何检查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
您可以使用此
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)
这是美丽的,我还从来没见过与以前使用这样的语法。 –
您可以使用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)
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
查询更新检查它。 –
同样的问题,就像P.Salmon的回答是:'无法解析“Arabic_CI_AS”,并在平等的规则“SQL_Latin1_General_CP1_CI_AS”之间的排序规则冲突operation.' – saastn
查询被改变检查。 –
为了让你在你的问题中指定的确切输出试试这个。 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;
试试这个SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = '基表' ORDER BY TABLE_NAME给它在临数据库 –
表的名单@PrasannaKumarJ我不希望所有表的列表,我想知道,如果表的列表(例如'“TN1'','” TN2'',''TN3'' ,...)存在于DB中,我想为它们中的每一个标记一个标志,指示表是否存在。 – saastn