2017-02-01 5 views
1

IF/ELSEステートメントをストアドプロシージャに配置しようとしています。IFとELSEストアドプロシージャ内

CREATE PROCEDURE [dbo].[Sp_enty_srch_attr_vals] 
    (@ENTY_ID INT, 
    @FIELD_ID INT, 
    @VALUE VARCHAR(5000), 
    @SQL VARCHAR(5000) 
    ) 
AS 
BEGIN 
    IF (@FIELD_ID = 148) 
     SET nocount ON; 

     SET @SQL = 'SELECT DISTINCT [GPI] FROM [GPI_ASOC] WHERE [GPI] LIKE ''%@VALUE%'' ORDER BY GPI'; 
     SET @SQL = replace(@SQL, '@VALUE', @VALUE); 

     EXEC SP_EXECUTESQL @SQL; 

    ELSE 
     SET nocount ON; 
     DECLARE @ENTY_TABLE_NAME VARCHAR(500) 

     SET @ENTY_TABLE_NAME = (SELECT TOP 1 enty_table_name 
           FROM enty 
           WHERE enty.enty_id = @ENTY_ID) 

     EXEC('SELECT DISTINCT ATTR_VAL FROM '[email protected]_TABLE_NAME+'_ATTR WHERE FIELD_ID='[email protected]_ID+ 
     ' AND ATTR_VAL LIKE ''%'[email protected]+'%'' ORDER BY ATTR_VAL ') 
END 

私はこのエラーが発生しており、私はそれを修正しようと壁に頭を叩いています。

メッセージ156、レベル15、状態1、プロシージャSp_enty_srch_attr_vals、ライン14 [バッチスタートライン17]
'ELSE' キーワードの近くに不正な構文。

このスクリプトで何が問題になっていますか?あなたはIF状態で複数の文を持っている場合は

+3

SQL Serverでは、ストアドプロシージャに "sp_"というプレフィックスを付けないでください。 – pmbAustin

+0

@pmbAustin [OK]を、私はそれらを変更します。どうして? –

+2

"sp_"接頭辞は、masterデータベースに格納されているシステム・プロシージャのためにシステムによって使用されます。これは、マスターのストアドプロシージャのルックアップを最初に行い、次に現在のデータベースを2番目に実行するため、パフォーマンスが低下します。ここにいくつかの詳細があります:https://sqlperformance.com/2012/10/t-sql-queries/sp_prefix – pmbAustin

答えて

3

は、あなたはまた、あなたのストアドプロシージャにsp_の接頭辞はありませんBEGIN-ENDブロック

If <<condition>> 
BEGIN 
    <<stmt 1>> 
    <<stmt 2>> 
END 
ELSE 
BEGIN 
    <<stmt 3>> 
    <<stmt 4>> 
END 

を使用する必要があります。すべてのシステムストアドプロシージャの接頭辞はsp_です。ここでは、あなたのIF/ELSEのボディにあなたのコードをブラケットにBEGINとEND必要な問題

Should I Use the sp_ Prefix for Procedure Names?

Is the sp_ prefix still a no-no?

1

についての記事です。また、IF外部にSET NOCOUNT ONを移動することができます。

複数行の場合
CREATE PROCEDURE [dbo].[Enty_srch_attr_vals] (@ENTY_ID INT, 
               @FIELD_ID INT, 
               @VALUE VARCHAR(5000), 
               @SQL  VARCHAR(5000)) 
AS 
BEGIN 
    SET nocount ON; 
     IF(@FIELD_ID = 148) 
     BEGIN 
     SET @SQL = 'SELECT DISTINCT [GPI] FROM [GPI_ASOC] WHERE [GPI] LIKE ''%@VALUE%'' ORDER BY GPI'; 
     SET @SQL = replace(@SQL, '@VALUE', @VALUE); 
     EXEC SP_EXECUTESQL @SQL; 
     END 
     ELSE 
     BEGIN 
     DECLARE @ENTY_TABLE_NAME VARCHAR(500) 
     SET @ENTY_TABLE_NAME = (SELECT TOP 1 enty_table_name 
           FROM enty 
           WHERE enty.enty_id = @ENTY_ID) 

     EXEC('SELECT DISTINCT ATTR_VAL FROM '[email protected]_TABLE_NAME+'_ATTR WHERE FIELD_ID='[email protected]_ID+ 
     ' AND ATTR_VAL LIKE ''%'[email protected]+'%'' ORDER BY ATTR_VAL ') 
     END 
END 

go 
1

/IF ELSE文はあなたが例えば、BEGIN/ENDブロックを使用する必要があります。

IF(@FIELD_ID = 148) 
    BEGIN 
    SET nocount ON; 
    SET @SQL = 'SELECT DISTINCT [GPI] FROM [GPI_ASOC] WHERE [GPI] LIKE ''%@VALUE%'' ORDER BY GPI'; 
    SET @SQL = replace(@SQL, '@VALUE', @VALUE); 
    EXEC SP_EXECUTESQL @SQL; 
    END