不确定这是否可能,但我尝试在EXECUTE上进行动态连接,但执行字符串必须来自表格列....即
select *
from (
select table1.theSql,table1.userid
from table1
) as a
inner join (execute a.thesql) as b on a.userId=b.userid
答案 0 :(得分:2)
简短的回答是否定的,类似的东西(至少那么简单)是不可能的。
答案越长,与您尝试做的最接近的事情就是交叉申请。 Cross apply允许您在每一行上执行一个函数(或者可以写成数据库函数的东西)。功能的一个限制是它们不会产生任何副作用(即更新,删除,插入)。由于执行任意sql可能会产生副作用,因此您无法在函数中使用它,因此无法在apply语句中使用它。
有没有办法解决这个问题?是的,但它并不漂亮。您将不得不使用动态SQL解决方案。这可能是一个起点。 SQL Fiddle
示例架构
create table jigger
(
id int,
sql varchar(500)
)
insert into jigger values (1, 'select * from otherStuff')
insert into jigger values (2, 'select * from otherStuff where jigger_id = 2')
create table otherStuff
(
id int,
jigger_id int,
name varchar(10)
)
insert into otherStuff values (1, 1, 'thing 1')
insert into otherStuff values (2, 2, 'thing 2')
insert into otherStuff values (3, 3, 'thing 3')
在表中执行SQL的SQL
declare @innerSql varchar(8000)
set @innerSql = stuff((select ' UNION ALL select ' + cast(j.id as varchar(500)) + ' as jiggerSourceId, * from (' + j.sql + ') isql' + cast(j.id as varchar(500))
from jigger j
for xml path ('')), 1, 11, '')
declare @sql varchar(8000)
set @sql = 'select * from jigger j inner join (' + @innerSql + ') x on x.jiggerSourceId = j.id'
exec (@sql)