Получение данных о том, какие базы данных и таблицы содержат специальное имя столбца в решении с несколькими базами данных. - PullRequest
0 голосов
/ 15 мая 2019

Я хочу получить базу данных, которая содержит таблицу x, на основе имени столбца, которое я ввожу, например, через оператор WHERE.

На данный момент я запускаю два отдельных запроса SELECT.Во-первых, я ищу, какие таблицы в решении содержат специальный столбец.Во-вторых, мне нужно вручную искать все полученные базы данных в подзапросе.

Я хочу иметь эту динамику, чтобы при вводе имени столбца возвращались и база данных, и таблица.Теперь я получаю «NULL» в столбце «База данных».

Мне удалось получить текущую базу данных, используя только имя_базы_данных, но это не то, что я намереваюсь сделать ..

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.

1 Ответ

0 голосов
/ 15 мая 2019

Это дает немного больше информации, чем вы запрашивали, но это код, который мне пришлось создать словарь данных моих баз данных.Вам просто нужно изменить значение первой переменной, чтобы она заработала.

--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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...