Как объединить динамический SQL-оператор в переменной с нормальным оператором - PullRequest
1 голос
/ 17 марта 2010

У меня довольно сложный запрос, который динамически создается и сохраняется в переменной.

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

Чтобы сделать это немного проще, приведу небольшой пример, иллюстрирующий мою проблему.
Для этого небольшого примера я использовал базу данных AdventureWorks .

Некоторые запросы создаются динамически

(Да, я знаю, что здесь нет ничего динамического, потому что это всего лишь пример.)

DECLARE @query AS varchar(max) ;

set @query = '
select
    HumanResources.Employee.EmployeeID
    ,HumanResources.Employee.LoginID
    ,HumanResources.Employee.Title
    ,HumanResources.EmployeeAddress.AddressID
from
    HumanResources.Employee
    inner join HumanResources.EmployeeAddress
    on HumanResources.Employee.EmployeeID = HumanResources.EmployeeAddress.EmployeeID
;';

EXEC (@query);

Нормальный запрос у меня

select
    Person.Address.AddressID
    ,Person.Address.City
from
    Person.Address

Может быть, то, что я хотел бы иметь, но не работает

select
    @query.*
    ,Addresses.City
from
    @query as Employees
    inner join
    (
        select
            Person.Address.AddressID
            ,Person.Address.City
        from
            Person.Address
    ) as Addresses
    on Employees.AddressID = Addresses.AddressID

Ответы [ 2 ]

2 голосов
/ 17 марта 2010

Используйте временные таблицы и сохраняйте в них записи (из динамического запроса) и используйте временную таблицу для соединения со статическим запросом, который у вас есть.

set @query = 'CREATE table #myTempTable AS
select
    HumanResources.Employee.EmployeeID
    ,HumanResources.Employee.LoginID
    ,HumanResources.Employee.Title
    ,HumanResources.EmployeeAddress.AddressID
from
    HumanResources.Employee
    inner join HumanResources.EmployeeAddress
    on HumanResources.Employee.EmployeeID = HumanResources.EmployeeAddress.EmployeeID
;';

EXEC (@query);

А потом

select
    Employees.*
    ,Addresses.City
from
    #myTempTable as Employees
    inner join
    (
        select
            Person.Address.AddressID
            ,Person.Address.City
        from
            Person.Address
    ) as Addresses
    on Employees.AddressID = Addresses.AddressID
1 голос
/ 17 марта 2010

Возможно, вы находитесь на правильном пути, но если вы доверяете источнику параметра и не используете его для SQL-Injection, вам может потребоваться просто изменить свой выбор при построении @query, например:

parameter to your function  '@YourAlternateTableParm'

DECLARE @query AS varchar(max) ; 

set @query = 'select ' + @YourAlternateTableParm 
  + '.*, Addresses.City
from ' + @YourAlternateTableParm
  + ' as Employees 
    inner join 
    ( ..... '

Таким образом, подобно тому, как вы строили свою исходную строку, вы строите фактическое значение параметра в вызове функции / процедуры с именем таблицы, желаемой для представления файла «Сотрудники» в строку, а затем выполняете это. SQL не интерпретирует динамически @query так, как вы пытались это сделать.

...