我有一个非常复杂的查询,它将动态构建并保存在变量中。
作为第二部分,我有另一个普通查询,我想在这两者之间进行内部联接。
为了让它更容易一点,这是一个例子来说明我的问题 对于这个小例子,我使用了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
答案 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内联。