2017-05-01 5 views
0

この手順に問題がある理由について、いくつかのガイダンスが必要です。私は、 "END 'のキーワードの近くに不正な構文があるというエラーが表示されるようです。"T SQLネストされたIF ... BEGINで終了... END

問題があると思われる箇所にコメントを追加しました。コード内コメントで(x)と(y)とラベル付けされています。私は構文強調表示のためにDataGripを使用しました。しかし、私はまだなぜそれを理解していない。

私はCASEステートメントがこの問題を解決する可能性があることを認識しています。しかし、私はそれが他のブロックの場合で

何も間違ったIF...ELSE

CREATE PROCEDURE AuthenticateUser(
    @UserName NVARCHAR(50), 
    @Password NVARCHAR(50), 
    @Result INT OUTPUT 
) AS 
    BEGIN -- Cannot find a corresponding END 
    SET NOCOUNT ON 

    DECLARE @userID INT 

    IF exists(SELECT UserID FROM Users WHERE UserName = @UserName) 
     BEGIN -- paired with END (y) 
     SET @userID = (SELECT UserID FROM Users WHERE UserName = @UserName AND Password = dbo.EncryptPassword(@Password, Salt)) 

     IF @userID IS NULL -- Paired with END (x) 
      SET @Result = 0 
     ELSE 
      SET @Result = 1 

     END -- paired with IF (x) 
    ELSE 
     SET @Result = 0 

    END -- paired with BEGIN (y) 
GO 
+0

SQL Server 2012でSSMS 2016またはSSMS 2012で問題を複製できません。どのバージョンを使用していますか? クエリに他のコードがありますか? –

+0

このコードはSSMS以外の場所から実行していますか? GoはSQLコマンドではなく、SSMSの区切り文字です –

+0

ちょっと、あなたの手続きはうまくいきます。私はこれをSQL Server 2014で試しました。 – Harsheet

答えて

0

@Edwinjで作業していない理由を知っていただきたいと思い、あなたのコード

(パスワード= DBOに問題があります.EncryptPassword(@Password、)))

はどちらも数値であります真実でも文字列でもないため、関数EncryptPasswordはエラーで失敗します。

+0

コードは実際にこの時点で実行されていない、それはちょうどストアドプロシージャの定義なので、暗号化パスワードに渡されているものを変更するべきではない –

+0

それは法的変数でもint法的な文字列ではありません。 –

+0

'users'テーブルの列ではないことをどのように知っていますか? –

0

各IF ELSE条件にBEGINとENDラベルを追加してみましょう。このようなもの。

CREATE PROCEDURE AuthenticateUser 
      (
       @UserName NVARCHAR(50) , 
       @Password NVARCHAR(50) , 
       @Result INT OUTPUT 
      ) 
     AS 
      BEGIN -- Cannot find a corresponding END 
       SET NOCOUNT ON 

       DECLARE @userID INT 

       IF EXISTS (SELECT 1 
          FROM Users 
          WHERE UserName = @UserName) 
        BEGIN -- paired with END (y) 
         SET @userID = (SELECT UserID 
             FROM Users 
             WHERE UserName = @UserName 
               AND Password = dbo.EncryptPassword(@Password, 
                  Salt) 
            ) 
         IF @userID IS NULL -- Paired with END (x) 
          BEGIN 
           SET @Result = 0 
          END 
         ELSE 
          BEGIN 
           SET @Result = 1 
          END 
        END -- paired with IF (x) 
       ELSE 
        BEGIN 
         SET @Result = 0 
        END 
      END -- paired with BEGIN (y) 
     GO 
+0

ありがとう@von、しかしこれは残念なことに私のためには機能しませんでした。 – Edwinj

関連する問題