我刚刚遇到执行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'附近的语法不正确。” 我做错了什么? 谢谢
答案 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