这是我的示例查询,任何人都可以建议我如何在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);
答案 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注入风险!