Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不能在SQL Server存储过程中使用限制和偏移量_Sql_Sql Server - Fatal编程技术网

为什么不能在SQL Server存储过程中使用限制和偏移量

为什么不能在SQL Server存储过程中使用限制和偏移量,sql,sql-server,Sql,Sql Server,我试图使用下面的查询获取MAX-1记录,但若我在查询中使用LIMIT和OFFSET,则会抛出错误。是否有其他方法可以使用此查询获取Max-1行?我正在使用SQL Server UPDATE [dbo].[ORDER_DETAIL] SET LINE_STATUS_CODE = 'C' WHERE RATE_STRUCTURE = 'LIST' AND RATE_CODE = 'PRIMARY' AND SHIP_MASTER_CUSTOMER_ID = @ip_master_cu

我试图使用下面的查询获取MAX-1记录,但若我在查询中使用LIMIT和OFFSET,则会抛出错误。是否有其他方法可以使用此查询获取Max-1行?我正在使用SQL Server

UPDATE [dbo].[ORDER_DETAIL] 
SET LINE_STATUS_CODE = 'C' 
WHERE RATE_STRUCTURE = 'LIST' 
  AND RATE_CODE = 'PRIMARY' 
  AND SHIP_MASTER_CUSTOMER_ID = @ip_master_customer_id  
  AND [ORDER_NO] = @ip_order_id 
  AND ORDER_LINE_NO = (SELECT ORDER_LINE_NO 
                       FROM [dbo].[ORDER_DETAIL] 
                       WHERE RATE_STRUCTURE = 'LIST' 
                         AND ORDER_NO = @ip_order_id 
                         AND SHIP_MASTER_CUSTOMER_ID = @ip_master_customer_id 
                       LIMIT 1 OFFSET 1 
                       ORDER BY ORDER_LINE_NO DESC)

如果我理解正确,您需要类似于Order_Detail中倒数第二条记录的内容,该记录基于您设置的匹配和筛选条件:

UPDATE od
    SET LINE_STATUS_CODE ='C'
    FROM (SELECT od.*, ROW_NUMBER() OVER (ORDER BY ORDER_LINE_NO DESC) as seqnum
          FROM [dbo].[ORDER_DETAIL] od
          WHERE RATE_STRUCTURE = 'LIST' AND RATE_CODE= 'PRIMARY' AND
                SHIP_MASTER_CUSTOMER_ID = @ip_master_customer_id  AND 
                [ORDER_NO] = @ip_order_id 
        ) od
    WHERE seqnum = 2;

这正是您应该用于内部选择的语法:

SELECT ORDER_LINE_NO 
FROM [dbo].[ORDER_DETAIL] 
WHERE RATE_STRUCTURE = 'LIST' 
AND ORDER_NO = @ip_order_id 
AND SHIP_MASTER_CUSTOMER_ID = @ip_master_customer_id 
ORDER BY ORDER_LINE_NO DESC
OFFSET 1 ROW
FETCH NEXT 1 ROW ONLY
然后您的更新语句将如下所示:

UPDATE [dbo].[ORDER_DETAIL] SET LINE_STATUS_CODE ='C' 
WHERE RATE_STRUCTURE = 'LIST' 
AND RATE_CODE= 'PRIMARY' 
AND SHIP_MASTER_CUSTOMER_ID = @ip_master_customer_id
AND [ORDER_NO] = @ip_order_id  
AND ORDER_LINE_NO = (SELECT ORDER_LINE_NO 
                     FROM [dbo].[ORDER_DETAIL] 
                     WHERE RATE_STRUCTURE = 'LIST' 
                     AND ORDER_NO = @ip_order_id  
                     AND SHIP_MASTER_CUSTOMER_ID = @ip_master_customer_id
                     ORDER BY ORDER_LINE_NO DESC
                     OFFSET 1 ROW
                     FETCH NEXT 1 ROW ONLY);

SQL Server没有限制,您可以使用TOP或OFFSET和FETCH NEXT。如果要使用TOP,则不能使用偏移量从第二个结果或第三个结果开始。

什么是MAX-1记录?示例数据和期望的结果非常有用。SQL Server中是否存在限制?可能您希望TOP.TOP在本例中不是一个选项,因为偏移忽略第一个结果,而TOP没有此选项。