none
ストアド内でループカウンタを使ってパラメータを取得したい RRS feed

  • 質問

  • こんにちは。

    SQLServer2005で以下のようなストアドを作成しようとしています。

    ------------------------------------
    CREATE PROCEDURE SetTestData
     @Name1 nvarchar(10),
     @Score1 int,
     @Name2 nvarchar(10),
     @Score2 int,
     @Name3 nvarchar(10),
     @Score3 int
    AS
    BEGIN

     DECLARE @Counter int
     DECLARE @Name nvarchar(10)
     DECLARE @Score int

     SET @Counter = 1

     /** ループ処理 **/   
     WHILE @Counter <= 3
      BEGIN
       /** ※ @Name,@Scoreに@Name[X],@Score[X]の値をそれぞれ入れたい ※ **/

       /** テーブルに追加 **/
       INSERT INTO TestTable (col1,col2) values (@Name ,@Score)

       SET @Counter=@Counter+1
      END
    END
    GO
    -------------------------------------

    こういったストアドで3行分のデータを渡してテーブルにINSERTしたいと思います。
    上記の
    "/** ※ @Name,@Scoreに@Name[X],@Score[X]の値をそれぞれ入れたい ※ **/"
    の部分にはどのような処理を書けばよいでしょうか。

     

    たとえば
     SET @SQLState = 'SET @Name=@Name' + CONVERT(nvarchar , @Counter)
     EXECUTE sp_executesql @SQLState
    とした場合には
    「スカラ変数 "@Name1" を宣言してください。」
    というエラーになってしまいました。

     

    またINSERT文自体を下記のようにsp_executesqlで実行した場合
     SET @SQLState = 'INSERT INTO TestTable (col1,col2) values (@Name'+ CONVERT(nvarchar , @Counter) +' ,@Score'+ CONVERT(nvarchar , @Counter) +')'
     EXECUTE sp_executesql @SQLState
    にも同様のエラーになってしまいました。

     

    それとも、こういうことはできないのでしょうか。

    2008年1月23日 5:01

回答

  • SQL文中で使用されないパラメータは無視されるので、以下のように書いてみられたらいかがでしょうか?

     

    EXECUTE sp_executesql @SQLState, N'@Name1 nvarchar(10), @Name2 nvarchar(10), @Name3 nvarchar(10), Score1 int, Score2 int, Score3 int'
                                 @Name1, @Name2, @Name3, @Score1, @Score2, @Score3

    2008年1月23日 8:58

すべての返信

  • SQL文中で使用されないパラメータは無視されるので、以下のように書いてみられたらいかがでしょうか?

     

    EXECUTE sp_executesql @SQLState, N'@Name1 nvarchar(10), @Name2 nvarchar(10), @Name3 nvarchar(10), Score1 int, Score2 int, Score3 int'
                                 @Name1, @Name2, @Name3, @Score1, @Score2, @Score3

    2008年1月23日 8:58
  • ありがとうございます。
    こういう方法があったんですね。
    基本的に私のsp_executesqlの使い方がおかしかったですね。
    実際には20項目×31日分ぐらいのデータを処理しないといけないので
    一時テーブル使うような方法も検討したいと思います。
    でも、参考になりました。ありがとうございました。

    2008年1月24日 0:30