如何在变量中用正常语句连接动态sql语句

时间:2010-03-17 10:49:36

标签: sql sql-server sql-server-2005 tsql dynamic-sql

我有一个非常复杂的查询,它将动态构建并保存在变量中。

作为第二部分,我有另一个普通查询,我想在这两者之间进行内部联接。

为了让它更容易一点,这是一个例子来说明我的问题 对于这个小例子,我使用了AdventureWorks database

一些动态建立的查询

(是的,我知道这里没有动态,因为它只是一个例子。)

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 个答案:

答案 0 :(得分:2)

使用临时表和将记录转储到其中(来自动态查询)&使用临时表连接您拥有的静态查询。

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 :(得分:1)

您可能处于正确的轨道上,但只要您信任参数的来源而不是为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 
    ( ..... '

这样,就像构建原始字符串一样,您正在为函数/过程调用构建参数的实际值,并将表名称表示为“Employees”文件,然后执行该字符串。 SQL并不像你想要的那样动态地解释@query内联。