【问题标题】:SQL stuck on and else syntax errorSQL 卡住,否则语法错误
【发布时间】:2018-08-28 13:23:41
【问题描述】:

我遇到了一个 ELSE 语法错误,非常感谢第二双眼睛告诉我哪里出了问题!我正在使用 SSMS v17.3。我收到的消息是:

消息 156,级别 15,状态 1,第 98 行

关键字“ELSE”附近的语法不正确。

第 98 行是 go 之前的最后一个 ELSE。在整个语句的结尾上方大约 6 行。提前谢谢你!

DECLARE @GroupID uniqueidentifier
DECLARE @fCompID int
DECLARE @fPropID int
DECLARE @fCompGUID uniqueidentifier

Set @GroupID = 'E63DC5E7-C8C8-4EA3-B1BF-75712DD83EF4'
SET @fCompID = '0'
SET @fPropID = '0'

WHILE @fCompID <= '999'
    BEGIN
    IF @fCompID = (SELECT fID FROM tSCCompany WHERE fID = @fCompID)
        SET @fCompGUID = (SELECT fCompanyID FROM tSCCompany WHERE fID = @fCompID)
        WHILE @fPropID <='999'
            BEGIN
            IF @fPropID = (SELECT fID FROM tSCProperty WHERE fID = @fPropID AND fCompanyID = @fCompGUID)
                BEGIN
                INSERT INTO zPropTest(fGroupID, fPropertyID)
                    Select @GroupID, (select fPropertyID from tSCProperty where fID = @fPropID AND fCompanyID = @fCompGUID)
                SET @fPropID = @fPropID + 1
                END
            ELSE
                BEGIN
                SET @fPropID = @fPropID + 1
                END
            END
    ELSE
        BEGIN
        SET @fCompID = @fCompID + 1
        SET @fPropID = '0'
        END
    END
GO

【问题讨论】:

  • 您忘记使用 BEGIN AND END 指示第一个 if 块。尝试在 SET @fCompGUID = (SELECT fCompanyID FROM tSCCompany WHERE fID = @fCompID) 之前写 BEGIN 并在结尾 while 之后写 END
  • 旁白:看起来您已经学习了一门过程语言,并且正在将这些课程应用于 SQL。 SQL 最适合用于处理数据集并允许数据库优化实际处理,例如使用insert into zPropTest ( fGroupId, fPropertyId ) select @GroupId, tSCPropertyId from tSCProperty where fCompanyId = @fCompGUID where fPropertyId &lt;= 999;。您还在混合数据类型,例如@fCompId &lt; '999' 根据data type precedence 的规则将int 与字符串进行比较。

标签: tsql if-statement while-loop sql-server-2012


【解决方案1】:

我认为你错过了 TOP 1

DECLARE @GroupID uniqueidentifier
DECLARE @fCompID int
DECLARE @fPropID int
DECLARE @fCompGUID uniqueidentifier

Set @GroupID = 'E63DC5E7-C8C8-4EA3-B1BF-75712DD83EF4'
SET @fCompID = '0'
SET @fPropID = '0'

WHILE @fCompID <= '999'
    BEGIN
        IF @fCompID = (SELECT fID FROM tSCCompany WHERE fID = @fCompID) -- Need top 1?
            SET @fCompGUID = (SELECT fCompanyID FROM tSCCompany WHERE fID = @fCompID) -- Need top 1?
            WHILE @fPropID <='999'
                BEGIN
                    IF @fPropID = (SELECT fID FROM tSCProperty WHERE fID = @fPropID AND fCompanyID = @fCompGUID) -- Need top 1?
                        BEGIN
                            INSERT INTO zPropTest(fGroupID, fPropertyID)
                                Select @GroupID, 
                                    (select top 1 fPropertyID from tSCProperty 
                                        where fID = @fPropID AND fCompanyID = @fCompGUID)
                            SET @fPropID = @fPropID + 1
                        END
                    ELSE
                        BEGIN
                            SET @fPropID = @fPropID + 1
                        END
                END
        ELSE
            BEGIN
                SET @fCompID = @fCompID + 1
                SET @fPropID = '0'
            END
    END
GO

【讨论】:

    【解决方案2】:

    您似乎缺少一个开始块。请尝试如下:

    DECLARE @GroupID uniqueidentifier
    DECLARE @fCompID int
    DECLARE @fPropID int
    DECLARE @fCompGUID uniqueidentifier
    
    Set @GroupID = 'E63DC5E7-C8C8-4EA3-B1BF-75712DD83EF4'
    SET @fCompID = '0'
    SET @fPropID = '0'
    BEGIN-- MISSING!!
    WHILE @fCompID <= '999'
        BEGIN
        IF @fCompID = (SELECT fID FROM tSCCompany WHERE fID = @fCompID)
    
            SET @fCompGUID = (SELECT fCompanyID FROM tSCCompany WHERE fID = @fCompID)
            WHILE @fPropID <='999'
                BEGIN
                IF @fPropID = (SELECT fID FROM tSCProperty WHERE fID = @fPropID AND fCompanyID = @fCompGUID)
                    BEGIN
                    INSERT INTO zPropTest(fGroupID, fPropertyID)
                        Select @GroupID, (select fPropertyID from tSCProperty where fID = @fPropID AND fCompanyID = @fCompGUID)
                    SET @fPropID = @fPropID + 1
                    END
                ELSE
                    BEGIN
                    SET @fPropID = @fPropID + 1
                    END
                END
          END-- MISSING
        ELSE
            BEGIN
            SET @fCompID = @fCompID + 1
            SET @fPropID = '0'
            END
        END
    GO
    

    【讨论】:

      【解决方案3】:

      欢迎来到 Stack Overflow!

      您的If 语句需要块指示符。查看我添加的两行

      DECLARE @GroupID uniqueidentifier
      DECLARE @fCompID int
      DECLARE @fPropID int
      DECLARE @fCompGUID uniqueidentifier
      
      Set @GroupID = 'E63DC5E7-C8C8-4EA3-B1BF-75712DD83EF4'
      SET @fCompID = '0'
      SET @fPropID = '0'
      
      WHILE @fCompID <= '999'
          BEGIN
          IF @fCompID = (SELECT fID FROM tSCCompany WHERE fID = @fCompID)
              Begin  --  I added this
                  SET @fCompGUID = (SELECT fCompanyID FROM tSCCompany WHERE fID = @fCompID)
                  WHILE @fPropID <='999'
                      BEGIN
                      IF @fPropID = (SELECT fID FROM tSCProperty WHERE fID = @fPropID AND fCompanyID = @fCompGUID)
                          BEGIN
                          INSERT INTO zPropTest(fGroupID, fPropertyID)
                              Select @GroupID, (select fPropertyID from tSCProperty where fID = @fPropID AND fCompanyID = @fCompGUID)
                          SET @fPropID = @fPropID + 1
                          END
                      ELSE
                          BEGIN
                          SET @fPropID = @fPropID + 1
                          END
                      End
              End  --  I added this, too 
          ELSE
              BEGIN
              SET @fCompID = @fCompID + 1
              SET @fPropID = '0'
              END
          END
      GO
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-31
        • 2015-03-22
        • 2015-04-04
        相关资源
        最近更新 更多