在多数据库解决方案中检索哪些数据库和表包含特定列名

Retrieving which database(s) and tables contains a spesific column name within a multiple database soloution

我希望根据我通过例如输入的列名检索包含 table x 的数据库我的 WHERE 声明。

截至目前,我 运行 两个单独的 SELECT 查询。首先,我在解决方案中搜索哪些 table 包含特定列。 其次,我必须在子查询中手动搜索所有结果数据库。

我希望有这个动态,这样当输入列名时,数据库和 table 都会被返回。现在,我得到 "NULL" 数据库列。

我已经设法仅使用 db_name 获取当前数据库,但这不是我打算做的..

db_name(db_id(table1.name)) AS "Database" , table1.name AS 'Table', column1.name  AS 'Column'

    FROM sys.columns column1
    JOIN sys.tables table1 ON column1.object_id = table1.object_id
        WHERE column1.name LIKE 'columnname'

    ORDER BY "Table", "Column"

(SELECT "db" FROM sys.databases WHERE CASE WHEN state_desc = 'ONLINE' THEN
        OBJECT_ID(QUOTENAME("db") + '.[dbo].' + '[database1]', 'U')
        END IS NOT NULL)

上面的代码没有错误。但是,我无法提取数据库名称,而且我不明白如何解决这个问题。

由于我是 SQL.. 的菜鸟,我使用了之前的几篇文章作为参考来构建此代码。:-)

在此先感谢您的帮助。 Br.

这提供的信息比您要求的要多一些,但这是我必须创建数据库数据字典的代码。您只需更改第一个变量的值即可使其正常工作。

--Change this value
DECLARE @ColumnName sysname = 'YourColumnName';

IF OBJECT_ID( 'tempdb..#DataDictionary') IS NOT NULL
    DROP TABLE #DataDictionary;

CREATE TABLE #DataDictionary(
    TABLE_CATALOG       sysname,
    TABLE_SCHEMA        sysname,
    TABLE_NAME          sysname,
    ORDINAL_POSITION    int,
    COLUMN_NAME         sysname,
    DATA_TYPE           sysname,
    IS_NULLABLE         varchar(8)
);

DECLARE @SQL NVARCHAR(MAX);

DECLARE dbs CURSOR LOCAL FAST_FORWARD
FOR
SELECT REPLACE( 'USE <<database_name>>;
INSERT INTO #DataDictionary
SELECT DB_NAME() AS TABLE_CATALOG,
    s.name AS TABLE_SCHEMA,
    t.name AS TABLE_NAME,
    COLUMNPROPERTY(c.object_id, c.name, ''ordinal'')  AS ORDINAL_POSITION,  
    c.name AS COLUMN_NAME,  
    CASE WHEN ty.name IN (''char'', ''varchar'', ''varbinary'', ''binary'') THEN CONCAT( ty.name, ''('', ISNULL( CAST(NULLIF(c.max_length, -1) AS varchar(4)), ''MAX''), '')'')
        WHEN ty.name IN (''nchar'', ''nvarchar'') THEN CONCAT( ty.name, ''('', ISNULL( CAST(NULLIF(c.max_length, -1)/2 AS varchar(4)), ''MAX''), '')'')
        WHEN ty.name IN (''numeric'', ''decimal'') THEN CONCAT( ty.name, ''('', c.precision, '','', c.scale, '')'')
        ELSE ty.name END AS DATA_TYPE,
    IIF(c.is_nullable = 1, ''NULL'', ''NOT NULL'')  AS IS_NULLABLE
FROM sys.schemas s
JOIN sys.tables t ON s.schema_id = t.schema_id
JOIN sys.columns c ON t.object_id = c.object_id
JOIN sys.types ty ON c.user_type_id = ty.user_type_id
WHERE t.object_id NOT IN( SELECT major_id FROM sys.extended_properties WHERE minor_id = 0 AND class = 1 AND name = N''microsoft_database_tools_support'')
AND c.name = @ColumnName;', '<<database_name>>', name)
FROM sys.databases
WHERE database_id > 4 --No system databases
AND HAS_DBACCESS( name) = 1
AND state_desc = 'ONLINE'
OPEN dbs;

FETCH NEXT FROM dbs INTO @SQL;
WHILE @@FETCH_STATUS = 0
BEGIN 
    EXEC sp_executesql @SQL, N'@ColumnName sysname', @ColumnName;

    FETCH NEXT FROM dbs INTO @SQL;
END;

CLOSE dbs;
DEALLOCATE dbs;

SELECT *
FROM #DataDictionary
ORDER BY TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION;

要获取所有的列,只需去掉动态代码中的列名比较即可AND c.name = @ColumnName