如何在CTE中使用变量表名

时间:2014-09-23 18:52:38

标签: sql-server common-table-expression

我的存储过程中定义了CTE,CTE中使用的表名是变量,例如

declare @tblName  char(50)
set @tblName =’…’

;WITH tbl1_CTE AS
(
    SELECT *
    FROM @tblName
    …
)
select * from tbl1_CTE

但是我收到错误,必须声明表变量" @tblName"。有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

解决此问题的唯一方法是使用动态SQL。例如,sp_executesql过程。 (还有一些其他SQL Server机制基本上会做同样的事情。

现在的问题是变量@tblName的值不会被评估,直到"执行"时间。

但是在SQL Server可以"执行"之前声明,SQL Server首先必须"准备"该声明,作为其中的一部分,用于确定引用的表(或视图)是否存在,用户是否具有权限,可用的索引等等,以便提出执行计划。一旦准备好语句的执行计划,就可以实际执行该语句。此时,变量将被替换为。

但是,SQL Server需要知道表之前的表名称​​才能到达变量被替换的位置。

解决方法是使用"动态SQL"。使用该方法,变量(如@tblName)将被计算为字符串的内容。然后,技巧是将该字符串作为语句提交给SQL Server。现在,表名将是字符串中的文字。

答案 1 :(得分:0)

正如您的错误指定的@tblnameVariable,但您使用它就像Temp Table并从中选择Select * from @tblname我们只能使用

Select @tblname

如果是变量