我的存储过程中定义了CTE,CTE中使用的表名是变量,例如
declare @tblName char(50)
set @tblName =’…’
;WITH tbl1_CTE AS
(
SELECT *
FROM @tblName
…
)
select * from tbl1_CTE
但是我收到错误,必须声明表变量" @tblName"。有什么方法可以解决这个问题吗?
答案 0 :(得分:2)
解决此问题的唯一方法是使用动态SQL。例如,sp_executesql
过程。 (还有一些其他SQL Server机制基本上会做同样的事情。
现在的问题是变量@tblName
的值不会被评估,直到"执行"时间。
但是在SQL Server可以"执行"之前声明,SQL Server首先必须"准备"该声明,作为其中的一部分,用于确定引用的表(或视图)是否存在,用户是否具有权限,可用的索引等等,以便提出执行计划。一旦准备好语句的执行计划,就可以实际执行该语句。此时,变量将被替换为。
但是,SQL Server需要知道表之前的表名称才能到达变量被替换的位置。
解决方法是使用"动态SQL"。使用该方法,变量(如@tblName
)将被计算为字符串的内容。然后,技巧是将该字符串作为语句提交给SQL Server。现在,表名将是字符串中的文字。
答案 1 :(得分:0)
正如您的错误指定的@tblname
是Variable
,但您使用它就像Temp Table
并从中选择Select * from @tblname
我们只能使用
Select @tblname
如果是变量