EXECUTE表列上的SQL动态连接

时间:2015-06-23 15:23:22

标签: sql-server stored-procedures dynamic-sql

不确定这是否可能,但我尝试在EXECUTE上进行动态连接,但执行字符串必须来自表格列....即

select * 
from (
         select table1.theSql,table1.userid 
         from table1 
        ) as a
inner join (execute a.thesql) as b on a.userId=b.userid

1 个答案:

答案 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)