Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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_Sql Server 2008 - Fatal编程技术网

SQL server用户定义游标

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

我正在尝试创建一个用户定义的游标,但出现以下错误:

Msg 102,15级,状态1,第25行 “;”附近的语法不正确

我正在使用AdventureWorks2008r2

这是我的密码

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)?我发现了我的错误,非常感谢您的帮助!欢迎您的帮助。如果我的答案帮助/回答,请考虑接受它,所以其他人没有你已经解决了你的问题和信誉点被授予。干杯