Sql server 遍历所有表中的所有DBs-Get约束

Sql server 遍历所有表中的所有DBs-Get约束,sql-server,foreach,constraints,sql-server-2016,dynamic-sql,Sql Server,Foreach,Constraints,Sql Server 2016,Dynamic Sql,我试图通过列出所有表约束来遍历所有数据库。我取得了以下成就: 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 whe

我试图通过列出所有表约束来遍历所有数据库。我取得了以下成就:

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
我希望查询将我的所有结果合并到一个干净的select中

有人能帮忙吗


使用SQL Server 2016。

一种方法是将中间结果插入临时表。下面的示例还包括结果中的数据库名称

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;

一种方法是将中间结果插入临时表。下面的示例还包括结果中的数据库名称

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;