SQL-соединение из нескольких таблиц - PullRequest
3 голосов
/ 05 июня 2010

У нас есть система (на основе MS SQL 2008 R2), в которой есть несколько «входных» баз данных и одна «выходных» баз данных. Я хотел бы написать запрос, который будет читать из выходной БД, и JOIN его к данным в одной из исходной БД. Однако исходной таблицей может быть одна или несколько отдельных таблиц :( Имя исходной БД включено в выходную БД; в идеале я хотел бы сделать что-то вроде следующего (псевдо-SQL-ахой)

select o.[UID]
      ,o.[description]
      ,i.[data]
from [output].dbo.[description] as o
    left join (select [UID]
                    ,[data]
                from
                    [output.sourcedb].dbo.datatable
                ) as i
        on i.[UID] = o.[UID];

Есть ли способ сделать что-то подобное вышеописанному - «динамически» указать базу данных и таблицу, к которой нужно присоединиться для каждой строки в запросе?

Ответы [ 2 ]

2 голосов
/ 05 июня 2010

Попробуйте использовать функцию exec, затем укажите select как строку, добавив переменные для имен баз данных и таблиц, где это необходимо. Простой пример:

DECLARE @dbName VARCHAR(255), @tableName VARCHAR(255), @colName VARCHAR(255)
...
EXEC('SELECT * FROM ' + @dbName + '.dbo.' + @tableName + ' WHERE ' + @colName + ' = 1') 
1 голос
/ 05 июня 2010

Нет, таблица должна быть известна во время подготовки запроса.Иначе как оптимизатор запросов узнает, какие индексы он сможет использовать?Или если в таблице, на которую вы ссылаетесь, даже есть столбец UID?

Вам придется делать это поэтапно:

  1. Получить значение sourcedb из вашей выходной базы данныхв одном запросе.

  2. Создайте строку запроса SQL, интерполируя значение, полученное в первом запросе, в предложение FROM второго запроса.

    Будьте внимательны, чтобы убедиться, что это значение содержит допустимое имя базы данных.Например, отфильтруйте не-буквенные символы или примените регулярное выражение или найдите его в белом списке.В противном случае вы подвергаетесь риску SQL-инъекции .

  3. Выполните новую строку SQL, созданную с помощью exec(), как предлагает @ user353852.

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