使用WITH语句后,SQL exec运行错误

时间:2010-08-11 18:59:30

标签: sql-server

我刚刚遇到执行sql语句的问题,这是Northwind数据库。

    declare @PageIndex int
    declare @PageSize int
    declare @PageLowerBound int
    declare @PageUpperBound int
    declare @sql nvarchar(4000)

    select @PageIndex = 3
    select @PageSize = 5

    SET @PageLowerBound = @PageSize * @PageIndex
    SET @PageUpperBound = @PageLowerBound + @PageSize + 1
    with cts
    as
    (
    SELECT *
    FROM (SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS ROW,* FROM Orders)
    AS Orders  WHERE ROW >=@PageLowerBound AND Row<=@PageUpperBound
    )
   select @sql = @sql + 'select * from cte' 
    exec (@sql)

(修改) 只是稍微修改一下,我使用select * from cte,我意外地粘贴了错误的代码。抱歉。 实际上,我试图在@sql中附加一个where子句并执行它,但它会抛出一条错误消息,说“关键字'exec'附近的语法不正确。” 我做错了什么? 谢谢

4 个答案:

答案 0 :(得分:2)

我猜你正在尝试制作一个标准的CTE分页模式(例如,如here所述)并使其成为动态的粘贴WHERE子句?

AFAIK你还需要将CTE添加到sql字符串(exec或sp_executesql)中才能实现这个目标

答案 1 :(得分:1)

你需要在结肠前使用半结肠当你表达CTE时(在它之前),你需要一个分号。

 SET @PageUpperBound = @PageLowerBound + @PageSize + 1
    ;with cts
    as
    (
    SELECT *
    FROM (SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS ROW,* FROM Orders)
    AS Orders  WHERE ROW >=@PageLowerBound AND Row<=@PageUpperBound
    )
   select @sql = @sql + 'select * from orders' 
    exec (@sql)

您也没有使用CTE,为什么还要使用?

答案 2 :(得分:1)

你最终会看到的是:

  Common table expression defined but not used.

在下一个声明中使用您的CTE,或者根本不创建它。

你的例子中还有另一个挥之不去的问题:

 select @sql = @sql + 'select * from orders' 

这实际上与:

相同
  select @sql = NULL + 'select * from orders' 

为变量分配NULL和任何值将确保它始终为NULL。

也许您已经对代码进行了模糊处理,但在尝试执行该动态SQL之前,请确保@sql实际上具有非NULL值。

请记住,您的动态SQL将在其自己的范围内运行,并且不会引用您的CTE或其他变量。

答案 3 :(得分:1)

您需要使用:

DECLARE @sql NVARCHAR(4000)

    SET @sql = 'with cts as (
                   SELECT *
                     FROM (SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS ROW, 
                                  o.* 
                             FROM ORDERS o) AS Orders  
                    WHERE ROW >= @PageLowerBound 
                      AND Row <= @PageUpperBound)
                SELECT * 
                  FROM cte ' 

BEGIN

  EXEC sp_executesql @sql, N'@PageLowerBound INT, @PageUpperBound INT',
                           @PageLowerBound, @PageUpperBound

END