如何在SQL Server中的WITH子句中执行动态查询

时间:2016-09-27 09:51:51

标签: sql-server sql-server-2008 sql-server-2008-r2

这是我的示例查询,任何人都可以建议我如何在WITH子句中执行动态查询。

DECLARE @V_TBLID NVARCHAR(MAX) = 1, @V_QUERY NVARCHAR(MAX) = '', @IN_PAGESIZE INT = 5, @IN_PAGEINDEX INT = 1;      
SET @V_QUERY = N'SELECT * FROM MYTABLE'+ @V_TBLID;
WITH RESULTS AS
(
    EXEC(@V_QUERY)
)
SELECT * FROM RESULTS
WHERE [row_num] BETWEEN (((@IN_PAGEINDEX - 1) * @IN_PAGESIZE) + 1) AND (@IN_PAGEINDEX * @IN_PAGESIZE);

1 个答案:

答案 0 :(得分:2)

您无法在CTE中使用EXECUTE。

要使用您正在尝试的方法执行此操作,您需要将整个查询封装到动态sql语句中,该语句动态地构建CTE(WITH语句),将@V_QUERY附加到该动态sql语句。

e.g。

之类的东西
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = 
    'WITH Results AS (' + @V_QUERY + ')
     SELECT * 
     FROM Results
     WHERE [row_num] BETWEEN (((@IN_PAGEINDEX - 1) * @IN_PAGESIZE) + 1) AND (@IN_PAGEINDEX * @IN_PAGESIZE)'

EXECUTE sp_executesql @SQL, N'@IN_PAGEINDEX INT, @IN_PAGESIZE INT', @IN_PAGEINDEX, @IN_PAGESIZE

强制性旁注 - 无论何时使用动态SQL,请确保防范SQL注入风险!