- ベストアンサー
Transact-SQL の宣言に関して
お世話になります。 SQLServer2005 を使用しているシステムの CREATE PROCEDURE 文の中に下記のような宣言がありました。 DECLARE @A NVARCHAR(max) = N'@P1 NVARCHAR(8), @P2 NVARCHAR(8)'; これは、いったい何をしてるのかわからないのですが、 変数宣言?なんだと思うんですが、=の右側に二つ(P1、P2)と あるのでよくわかりません。どなたか教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
これは、動的SQLを実行するためのsp_executesqlというシステムストアドプロシージャを使う場合にはよく見かけます。 動的SQLの場合、 SET @F1 = 1 SET @F2 = 2 SET @sql = N"SELECT * FROM TABLE1 WHERE F1="+CONVERT(varchar,@F1)+' AND F2='+CONVERT(varchar,@F2) EXEC sp_executesql @sql というように都度実行するSQL文を組み上げる方法でも構わないのですが、変数部分をパラメータとして渡すことができます。 SET @F1 = 1 SET @F2 = 2 SET @sql = N"SELECT * FROM TABLE1 WHERE F1=@P1 AND F2=@P2" SET @parm = N"@P1 int,@P2 int" EXEC sp_executesql @sql,@parm,@F1,@F2 この方法のメリットはSQL Serverのクエリ実行を解析するオプティマイザが過去に実行して、キャッシュに保管されている実行プランを再利用してくれることです。 つまり、上記処理を繰り返し行うときに、一度実行した"SELECT * FROM TABLE1 WHERE F1=? AND F2=?"という内容のクエリについては、そのときに立てたプランを探してそれを使ってくれるということです。 (実行のたびプランを作成しないため、パフォーマンスがよくなる)。
お礼
回答ありがとうございます!!!! 助かりました!!!