2

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

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

此外,查询文件必须以“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 中有没有办法做到这一点?

4

2 回答 2

1

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

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

于 2012-12-13T19:24:35.560 回答
1

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

动态 TSQL 只能使用EXEC('sql command')或来完成sp_ExecuteSql(..)

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

  1. 让您的客户端首先执行内部 SQL 查询以确定表名,然后基于此创建一个新文件/字符串。或者
  2. 当您真正执行上述动态 SQL 命令之一时,使用某种黑客 SQL 注入技巧来欺骗您的设备,使其认为您正在执行 SELECT。
于 2012-12-13T19:37:13.283 回答