SQL server用户定义游标
我正在尝试创建一个用户定义的游标,但出现以下错误: Msg 102,15级,状态1,第25行 “;”附近的语法不正确 我正在使用AdventureWorks2008r2 这是我的密码SQL server用户定义游标,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在尝试创建一个用户定义的游标,但出现以下错误: Msg 102,15级,状态1,第25行 “;”附近的语法不正确 我正在使用AdventureWorks2008r2 这是我的密码 USE AdventureWorks2008r2 GO DECLARE -- LOCAL VARIABLEs @OrderId INT, @status TINYINT --declare the cursor DECLARE mynamelist CURSOR STATIC FOR
USE AdventureWorks2008r2
GO
DECLARE
-- LOCAL VARIABLEs
@OrderId INT,
@status TINYINT
--declare the cursor
DECLARE mynamelist CURSOR STATIC
FOR
SELECT Sales.SalesOrderHeader.SalesOrderID, Sales.SalesOrderHeader.STATUS
FROM Sales.SalesOrderHeader;
OPEN mynamelist;
FETCH NEXT
FROM mynamelist
INTO @status,
@OrderId
WHILE @@FETCH_STATUS = 0
IF @status = 1
BEGIN
FETCH NEXT
FROM mynamelist
INTO @status,@OrderId
PRINT 'Order Number:' + CAST(@OrderId AS VARCHAR(10)) + 'Status:Approved';
END;
ELSE IF @status = 3
PRINT 'Order Number:' + CAST(@OrderId AS VARCHAR(10)) + 'Status:Backordered';
ELSE IF @status = 4
PRINT 'Order Number:' + CAST(@OrderId AS VARCHAR(10)) + 'Status:Rejected';
ELSE IF @status = 5
PRINT 'Order Number:' + CAST(@OrderId AS VARCHAR(10)) + 'Status:Shipped';
ELSE
PRINT 'Order Number:' + CAST(@OrderId AS VARCHAR(10)) + 'Status:Cancelled';
END;
CLOSE nynamelist;
DEALLOCATE mynamelist;
如何修复此错误因此,您的代码编写方式存在一些语法问题和一些逻辑问题。在
IF
语句中嵌套了FETCH NEXT
,因此WHILE
块不会实际选择下一条记录,除非@status=1
用缩进和空格组织代码将有助于您戏剧性地理解步骤的逻辑和优先级。光标循环缺少一个BEGIN
还要注意,sql server并不总是需要分号,除非在抛出和公共表表达式的情况下,这些表达式之前的语句必须以分号终止,这就是为什么您经常看到它们被写成;使用cte
as和;抛出51000,
。。。我相信我还举了一些其他例子
无论如何,转储所有If,使用一个更适合这种类型操作的大小写表达式
,构建字符串,然后打印它
另外请注意,当结果中出现语法错误时,您可以双击它,它会将您带到有问题的语法错误
DECLARE
-- LOCAL VARIABLEs
@OrderId INT , @status TINYINT
--declare the cursor
DECLARE mynamelist CURSOR STATIC FOR
SELECT
h.SalesOrderID,
h.Status
FROM
Sales.SalesOrderHeader h
open mynamelist;
FETCH NEXT FROM mynamelist INTO @status, @OrderId
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @Message NVARCHAR(1000)
SET @Message = 'Order Number:' + CAST(@OrderId as VARCHAR(10)) + 'Status:'
SET @Message = @Message + CASE
WHEN @status = 1 THEN 'Approved'
WHEN @status = 3 THEN 'Backordered'
WHEN @status = 4 THEN 'Rejected'
WHEN @status = 5 THEN 'Shipped'
ELSE 'Cancelled'
END
PRINT @Message;
FETCH NEXT FROM mynamelist INTO @status, @OrderId
END
CLOSE nynamelist;
DEALLOCATE mynamelist;
缺少分号
代码>之前<代码>打开我的姓名列表代码>?意思是Sales.SalesOrderHeader中的代码>我添加了分号,但仍然出现错误?在WHILE和IF之间需要一个BEGIN,而IF>ELSE IF链需要在BEGIN/END语句中用多行来包装任何部分。我认为@RossBush有这个想法,我会把FETCH移到WHILE区域的末尾,把BEGIN移到第一个IF的上方,这应该是好的。这是一个学术练习还是一个真实世界的模拟?我问这个问题的原因是因为在这里使用光标不是一个好的解决方案。这可以通过基于集合的方法实现,而且速度会快得多。当我执行时,我会得到订单号:5状态:取消订单号:5状态:取消订单号:5状态:取消订单号:5状态:取消订单号:5状态:取消订单号:5状态:取消订单号:5状态:取消订单号:5状态:取消订单编号:5状态:取消订单编号:5状态:取消如果您自己执行select语句,您会得到什么?所有订单号5的状态不在(1,3,4,5)?我发现了我的错误,非常感谢您的帮助!欢迎您的帮助。如果我的答案帮助/回答,请考虑接受它,所以其他人没有你已经解决了你的问题和信誉点被授予。干杯