【问题标题】:Nested If in stored proc causing syntax error嵌套如果在存储过程中导致语法错误
【发布时间】:2012-09-20 01:43:46
【问题描述】:

我正在创建一个存储过程,它查询表“条目”。 proc 有参数@ID,它是一个int,和@APPROVED,它是一个位。我正在使用 SQL Server 2005

如果批准是假的,我想做一些与它是真的不同的事情。我写了以下内容。当我尝试创建它时,我得到“关键字'END'附近的语法不正确。”。

如果我在错误消失的情况下删除嵌套,但是从我读到的内容来看,这是完全有效的语法。谁能告诉我哪里出错了?

CREATE Procedure [dbo].[GetEntry](@ID int,@APPROVED bit)
AS
IF @APPROVED = 0
BEGIN 
    --see if the unapproved entry has already been viewed 
    IF (SELECT COUNT(*) 
    FROM [dbo].[Entries]
    WHERE EntryId = @ID AND Approved = @APPROVED AND Viewed = 0) > 0
    BEGIN

    END

END

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 你有一个空的BEGIN END,里面需要一些东西
  • 呃,现在我觉得自己很愚蠢。我只是在为 proc 构建结构,每添加几行就测试一次语法。谢谢。如果您想回答,我会将其设为可接受的答案。

标签: sql-server sql-server-2005 stored-procedures


【解决方案1】:

你要在BEGIN/END里做点什么,不能为空:

CREATE Procedure [dbo].[GetEntry](@ID int,@APPROVED bit)
AS
IF @APPROVED = 0
BEGIN 
    --see if the unapproved entry has already been viewed 
    IF (SELECT COUNT(*) 
            FROM [dbo].[Entries]
            WHERE EntryId = @ID AND Approved = @APPROVED AND Viewed = 0) > 0
    BEGIN
        -- do something here
        select *
        from [dbo].[Entries]
    END

END

【讨论】:

    【解决方案2】:

    您需要在BEGIN/END 内部做一些事情,更有效的检查是EXISTS,而不是手动获取计数(必须扫描整个聚集索引)。你真的不在乎结果是 2 还是 5 还是 27,654,对吧?

    IF EXISTS (SELECT 1 FROM dbo.Entries WHERE ...)
    BEGIN
        PRINT 'It exists!';
    END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 2018-05-12
      • 2013-06-12
      相关资源
      最近更新 更多