Использование INFORMATION_SCHEMA в перекрестном запросе к базе данных - PullRequest
1 голос
/ 02 декабря 2011

У меня есть 6 переменных, это: @SourceDatabase, @SourceSchema, @SourceTable, @TargetDatabase, @TargetSchema, @TargetTable

Я пишу запрос, который должен объединить значения из INFORMATION_SCHEMA.COLUMNS. Как это:

SELECT a.COLUMN_NAME, b.COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS a
LEFT OUTER JOIN INFORMATION_SCHEMA b
ON b.TABLE_SCHEMA = @SourceSchema
AND b.TABLE_NAME = @SourceTable
AND b.COLUMN_NAME = a.COLUMN_NAME
WHERE a.TABLE_SCHEMA = @TargetSchema
AND a.TABLE_NAME = @TargetTable

Однако после того, как я представил атрибуты базы данных, для сравнения баз данных, я просто заметил, что не думаю, что могу использовать тот же запрос, не делая его динамическим в качестве строки и помещая имя базы данных перед INFORMATION_SCHEMA. Как DECLARE @SQL nvarchar(254) = 'SELECT * FROM ' + @SourceDatabase + '.INFORMATION_SCHEMA ...'. и т. д.

Поскольку я на самом деле не фанат динамического SQL, мне интересно, есть ли у вас, ребята, какие-нибудь умные решения, чтобы делать то, что я пытаюсь сделать, не переходя в динамический режим?

1 Ответ

0 голосов
/ 02 декабря 2011

Динамический SQL, безусловно, самый простой способ справиться с подобными вещами, но вы уверены, что это не вариант?

Единственная альтернатива, которую я могу придумать, - это UNION ALL на всех ваших базах данных с дополнительным столбцом имени db:

SELECT 'db1' AS dbName, *
FROM db1.sys.columns
UNION ALL
SELECT 'db2' AS dbName, *
FROM db2.sys.columns

Параметры сортировки должны быть одинаковыми в обеих базах данных. Но динамический SQL был бы проще, и его можно было бы заставить работать для любой базы данных, а не только для тех, что в вашем объединенном списке.

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