遍历所有数据库 - 获取所有表中的约束
Iterate through all DBs - Get constraints in all tables
我试图通过列出所有 table 约束来遍历所有数据库。我取得了以下成就:
DECLARE @sql nvarchar(max) = ''
SET @sql =
'
USE ?
select con.[name] as constraint_name,
schema_name(t.schema_id) + ''.'' + t.[name] as [table],
col.[name] as column_name,
con.[definition],
case when con.is_disabled = 0
then ''Active''
else ''Disabled''
end as [status]
from sys.check_constraints con
left outer join sys.objects t
on con.parent_object_id = t.object_id
left outer join sys.all_columns col
on con.parent_column_id = col.column_id
and con.parent_object_id = col.object_id
order by con.name
'
PRINT @sql
EXEC sp_MSforeachdb @sql
我想将查询 UNION 我的所有结果集中在一个干净的 select。
有人能帮忙吗?
使用 SQL 服务器 2016。
一种方法是将中间结果插入临时文件 table。下面是一个在结果中还包含数据库名称的示例。
CREATE TABLE #results (
[database_name] sysname
,[constraint_name] nvarchar(128)
,[table] nvarchar(257)
,[column_name] nvarchar(128)
,[definition] nvarchar(max)
,[status] varchar(8)
);
DECLARE @sql nvarchar(max) = ''
SET @sql =
N'
USE [?];
INSERT INTO #results
select
N''?'' as database_name,
con.[name] as constraint_name,
schema_name(t.schema_id) + ''.'' + t.[name] as [table],
col.[name] as column_name,
con.[definition],
case when con.is_disabled = 0
then ''Active''
else ''Disabled''
end as [status]
from sys.check_constraints con
left outer join sys.objects t
on con.parent_object_id = t.object_id
left outer join sys.all_columns col
on con.parent_column_id = col.column_id
and con.parent_object_id = col.object_id;
';
PRINT @sql;
EXEC sp_MSforeachdb @sql;
SELECT * FROM #results;
我试图通过列出所有 table 约束来遍历所有数据库。我取得了以下成就:
DECLARE @sql nvarchar(max) = ''
SET @sql =
'
USE ?
select con.[name] as constraint_name,
schema_name(t.schema_id) + ''.'' + t.[name] as [table],
col.[name] as column_name,
con.[definition],
case when con.is_disabled = 0
then ''Active''
else ''Disabled''
end as [status]
from sys.check_constraints con
left outer join sys.objects t
on con.parent_object_id = t.object_id
left outer join sys.all_columns col
on con.parent_column_id = col.column_id
and con.parent_object_id = col.object_id
order by con.name
'
PRINT @sql
EXEC sp_MSforeachdb @sql
我想将查询 UNION 我的所有结果集中在一个干净的 select。
有人能帮忙吗?
使用 SQL 服务器 2016。
一种方法是将中间结果插入临时文件 table。下面是一个在结果中还包含数据库名称的示例。
CREATE TABLE #results (
[database_name] sysname
,[constraint_name] nvarchar(128)
,[table] nvarchar(257)
,[column_name] nvarchar(128)
,[definition] nvarchar(max)
,[status] varchar(8)
);
DECLARE @sql nvarchar(max) = ''
SET @sql =
N'
USE [?];
INSERT INTO #results
select
N''?'' as database_name,
con.[name] as constraint_name,
schema_name(t.schema_id) + ''.'' + t.[name] as [table],
col.[name] as column_name,
con.[definition],
case when con.is_disabled = 0
then ''Active''
else ''Disabled''
end as [status]
from sys.check_constraints con
left outer join sys.objects t
on con.parent_object_id = t.object_id
left outer join sys.all_columns col
on con.parent_column_id = col.column_id
and con.parent_object_id = col.object_id;
';
PRINT @sql;
EXEC sp_MSforeachdb @sql;
SELECT * FROM #results;