2017-09-02 22 views
1

次のストアドプロシージャを実行しようとしています。動的SQLエラー

CREATE PROCEDURE NWR.GRADER 
    @YEAR AS NVARCHAR(4) 
AS 
BEGIN 
    DECLARE @sql1 as nvarchar(500) = 
     N'select a.*, b.pts as W_GRD_PTS 
      into nwr.atp_matches_' + @YEAR + N'WGP 
      from nwr.atp_matches_' + @YEAR + N' a 
      left join NWR.RNK_VAL as b on a.winner_rank >= low 
            and a.winner_rank<= high 

      alter table nwr.atp_matches_' + @YEAR + N'WGP 
      add L_GRD_PTS smallint null 

      UPDATE nwr.atp_matches_' + @YEAR + N'WGP 
      SET L_GRD_PTS = C.pts 
      FROM NWR.RNK_VAL C 
      WHERE loser_rank >= LOW AND loser_rank <= HIGH;' 

    --print (@sql1); 
    EXEC sys.sp_execute @sql1; 
end; 

exec nwr.GRADER @year='2016'; 

私は次のようなエラーに

メッセージ214、レベル16、状態2、プロシージャsp_executeを取得していますが、1行目
手順型 'int型のパラメータ '@handle' を期待しています。

しかし、私はむしろEXECよりも印刷に切り替えるとき、私は、私は以下のように予想されるとおりにコードを取得する:

select a.*, b.pts as W_GRD_PTS 
into nwr.atp_matches_2016WGP 
from nwr.atp_matches_2016 a 
left join NWR.RNK_VAL as b on a.winner_rank >= low and a.winner_rank <= high 

alter table nwr.atp_matches_2016WGP 
    add L_GRD_PTS smallint null 

UPDATE nwr.atp_matches_2016WGP 
SET L_GRD_PTS=C.pts 
FROM NWR.RNK_VAL C 
WHERE loser_rank>= LOW AND loser_rank<= HIGH; 

誰もが私が間違ってやっているかを説明することはできますか?

+2

それは、このです... EXEC sys.sp_execute @ sql1 ...これは... EXEC sys.sp_execute ** sql ** @ sql1; –

+0

また、DML(データ操作 - 選択、挿入、削除)とDDL(データ定義 - テーブルの変更など)を1つのクエリで混在させるのは悪い考えです。このストアドプロシージャを実行するたびに、新しい列 'L_GRD_PTS'がテーブルに追加されます......実際にはこれは** **一度しか動作しませんし、失敗します....これをしないでください! DDL **をあなたの他のコードから分離してください! –

答えて

3

エラーのresonは、あなたがsys.sp_execute代わりのsys.sp_executesqlを使用していることです。

サイドノートでは、私はあなたの動的なクエリがちょうどそこにそれを投げる...ビットを簡素化することができるようにそれが見えることに気づい助けることができませんでした...

CREATE PROCEDURE NWR.GRADER 
    @YEAR AS NVARCHAR(4), 
    @Debug BIT = 0  -- 0=execute d-sql & 1=print d-sql... 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @sql1 as nvarchar(500) =N' 
SELECT 
    a.*, 
    W_GRD_PTS = b.pts, 
    L_GRD_PTS = c.pts 
    into nwr.atp_matches_' + @YEAR + N'WGP 
FROM 
    nwr.atp_matches_' + @YEAR + N' a 
    LEFT JOIN NWR.RNK_VAL as b 
     ON a.winner_rank >= b.low 
     AND a.winner_rank <= b.high 
    LEFT JOIN NWR.RNK_VAL c 
     ON a.loser_rank >= c.low 
     AND a.loser_rank<= c.high;' 

    IF @Debug = 1 
    BEGIN 
     PRINT(@sql1); 
    END; 
    ELSE 
    BEGIN 
     EXEC sys.sp_executesql @sql1; 
    END; 
END; 
GO 
+1

そのストライキを投げる! – scsimon