在sql中重用不包含exec或存储过程的from子句中的查询结果

时间:2012-12-13 19:11:36

标签: tsql select

我需要一个select语句在其子句中运行另一个select语句,结果(只有一个记录)是外部select的表名。

为此,我不能使用存储过程,exec或@ variables。

此外,查询文件必须以“select”开头,并且只包含该语句。

我知道有更好的方法可以完成最终结果,但是供应商的向导要求查询必须通过嗅探来执行除单个select语句之外的任何操作。令人沮丧的是,但这就是我们必须要做的一切。

这是我想要做的一个例子:

select
  plan.TransactionID,
  plan.PlanName,
  sum(plan.Value) as Rate 
from
  (select 'dbo._Result' + ltrim(str(CalculationID)) from dbo.Calculation where Name = 
    'TPRL Transaction Plan Rates'
  ) Plan

当然,这不起作用。但是,这也不是:

select
  plan.TransactionID,
  plan.PlanName,
  sum(plan.Value) as Rate 
from
  exec(select 'dbo._Result' + ltrim(str(CalculationID)) from dbo.Calculation where Name = 'TPRL Transaction Plan Rates') Plan

尽管如此,这本身确实将我想要的表拉回到结果集中:

exec(select 'dbo._Table' + ltrim(str(CalculationID)) from dbo.Calculation where Name = 'TPRL Transaction Plan Rates')

我需要做的就是将结果视为上面的文字(如宏观替换),但不会那样。

tsql中有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

您的第一个查询应该有效。您可以在FROM语句中执行子查询。你得到了什么样的错误?

在了解了需求之后,我相信需要动态SQL。

答案 1 :(得分:1)

不,这不能仅在非动态TSQL中完成。在TSQL中,表名不能是变量或参数化,只能通过动态TSQL完成。

动态TSQL只能使用EXEC('sql command')sp_ExecuteSql(..)

可能的解决方法: 除非您使用的工具具有自己的宏替换,否则

  1. 让您的客户端首先执行内部SQL查询以确定表名,然后基于此创建新的文件/字符串。或
  2. 使用某种黑客SQL注入技巧来欺骗您的工具,以便在重新执行上述某个动态SQL命令时,认为您正在执行SELECT。