ストアドでのwhile文の利用法

このQ&Aのポイント
  • ストアド内でのwhile文の利用法についてお伺いします。
  • ストアド内でのループ文作成に関して質問があります。
  • SELECT文内でフィールドを増やす方法について教えてください。
回答を見る
  • ベストアンサー

ストアドでのwhile文の利用法

SQLServerでのストアドについてはこちらでうかがってもよろしいのでしょうか? ストアド内にてwhileでのループ文作成についてなんですが、 以下のようなストアドでSELECT内でA.NO1....とあるとおもうのですが、 これを@numRankの数だけ、A.NO(フィールド)を増やしたいのですが、 ここからどのようにつくればよろしいのでしょうか? CREATE PROCEDURE usp_Enquete @ask_idvarchar(10) AS DECLARE @strvarchar(1000) DECLARE @numRankint DECLARE @Counterint BEGIN SELECT @numRank = count(*) FROM B_Answer WHERE ask_id = @ask_id END SET NOCOUNT ON SET @Counter = 1 WHILE @Counter <= @numRank BEGIN SET @str = ' SELECT count(ansList.NO1) AS NumAns, A.NO1, A.NO2, A.NO3 FROM ・ ・ ・

質問者が選んだベストアンサー

  • ベストアンサー
  • fantom
  • ベストアンサー率31% (30/94)
回答No.1

手元に環境がないのでテストできてないですが こんな感じで文字列連結していけばいけると思います。 間違ってたらすみません。 CREATE PROCEDURE usp_Enquete @ask_id varchar(10) AS DECLARE @str varchar(1000) DECLARE @numRank int DECLARE @Counter int DECLARE @StrFileds varchar(1000)  --ADD BEGIN SELECT @numRank = count(*) FROM B_Answer WHERE ask_id = @ask_id END SET NOCOUNT ON SET @Counter = 1 SET @StrFileds='' --ADD WHILE @Counter <= @numRank BEGIN SET @StrFileds=@StrFileds + ',A.NO'+Convert(varchar,@Counter) --ADD SET @Counter=@Counter+1 --ADD END SET @str ='SELECT count(ansList.NO1) AS NumAns' + @StrFileds+' FROM .....' --ADD

riseshinejp
質問者

お礼

ありがとうございます!! 無事、展開いたしました。 本当にありがとうございました。

関連するQ&A

  • ループしてUPDATEするストアドについて

    よろしくお願いいたします。 表題の件どうしてもわからなかったので、皆様どうかご教示お願いいたします。 下記ストアドを作成いたしました。 内容としては UPDATE文 「ユーザー情報 SET 通知f1 = 1 WHERE (送信先1 IS NOT NULL) AND (送信先1 <> '')」 の 通知fが1から30 送信先が1から30 をループして実行するといったいたってシンプルなのもです。 が、なんか上手くいかないんです。 ALTER PROCEDURE [dbo].[test] AS DECLARE @Counter int DECLARE @StrFileds1 varchar(1000) DECLARE @StrFileds2 varchar(1000) SET NOCOUNT ON SET @Counter = 1 SET @StrFileds1='' SET @StrFileds2='' WHILE @Counter <= 30 BEGIN SET @StrFileds1='通知f'+Convert(varchar,@Counter) SET @StrFileds2='送信先'+Convert(varchar,@Counter) SET @Counter=@Counter+1 BEGIN UPDATE ユーザー情報 SET @StrFileds1 = 1 WHERE (@StrFileds2 IS NOT NULL) AND (@StrFileds2 <> '') END END

  • MSDNselectしながらWHileでまわすには

    お詳しい方、どうかたすけてください。 環境はMicrosoftSQLです。 やりたいことは、 あるテーブルからデータを取ってくる際に、最後の購入日を今の日付から1週間さかのぼりしながら、 何週間さかのぼったかを、useridと一緒に結果で返したいのです。 select userid , CASE WHEN MAX(購入日) > getdate()-7 THEN 1 WHEN MAX(購入日) > getdate()-14 THEN 2 as 'week' みたいなことなのですが、 これをWHILEを使って、永遠にさかのぼれるようにしたいのです。 例としては、 DECLARE @ss int; DECLARE @Recency int; set @ss = '7' set @Recency = '0' while (getdate()- @ss > '2012-10-01') begin set @ss = @ss- 7 set @Recency = @Recency + 1 SELECT user_id, case when max(購入日)> getdate()-@ss then @Recency as 'week' end from usrbuyingtable こんなかんじかとおもったのですが、 ぜんぜんうまくいきません・・ 文法チェックをお願いします。

  • ストアドプロシージャにてフェッチから出ない

    Aというテーブルの情報をカーソルにて取得し、 同じくAというテーブルに項目を変えてInsertするという プロシージャを作成しています。 しかし、フェッチしたあとその処理から出ません。 (ちなみにフェッチ後のBEGIN~END内のInsert文を違うテーブルにして実行してみると処理から抜けました) 下記が該当プロシージャです。 CREATE PROCEDURE 販売プロシージャ AS BEGIN --変数宣言 DECLARE @販売NO INT DECLARE @顧客NO INT DECLARE @明細 NVARCHAR(25) DECLARE @受注日 SMALLDATETIME DECLARE @金額 INT DECLARE @ステータス BIT DECLARE @有効フラグ BIT --カーソル宣言 DECLARE 販売カーソル CURSOR FOR SELECT 販売NO, 顧客NO, 明細, 受注日, 金額, ステータス, 有効フラグ FROM 販売 WHERE YEAR(受注日) = YEAR(GETDATE()) AND MONTH(受注日) < MONTH(GETDATE()) --初期化処理 SET NOCOUNT OFF --カーソルOPEN OPEN 販売カーソル FETCH NEXT FROM 販売カーソル INTO @販売NO, @顧客NO, @明細, @受注日, @金額, @ステータス, @有効フラグ WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO 販売 ( 販売NO, 顧客NO, 明細, 受注日, 金額, ステータス, 有効フラグ, 登録日, 更新日, )VALUES( @販売NO, @顧客NO, @明細, @受注日, @金額, @ステータス, @有効フラグ, GETDATE(), GETDATE(), ) FETCH NEXT FROM 販売カーソル INTO @販売NO, @顧客NO, @明細, @受注日, @金額, @ステータス, @有効フラグ END CLOSE 販売カーソル DEALLOCATE 販売カーソル END 同じテーブルを使用する場合は、このような記述ではできないのでしょうか?

  • ストアドプロシージャについて

    お世話になります。 SQLServseのストアドプロシージャで、あるテーブルのテストデータを100件ほど作成したいと思っています。 しかし、プロシージャを実行すると「プライマリキーが重複しています」とエラーが出ます。 テーブル内にはすでにCODE='0001'と'0101'の2件が存在します。そのため挿入開始コードは'0002'としたのですが・・・。まだ同じエラーが発生します。 テーブル名:MST_USER  CODE char(4) ←キー  KBN  char(2)  NAME varchar(40)  PASS varchar(10) 作成したプロシージャ CREATE PROCEDURE dbo.test_update_USER AS declare @count int declare @kbn int set @count = 2 set @kbn = 0 while 1 = 1 begin update MST_USER set CODE = right('0000' + ltrim(str@count)), 4), KBN = right('00' + ltrim(str(@kbn)), 2), NAME = 'test' + ltrim(str(@count)), PASS = 'test' + ltrim(str(@count)) set @count = @count + 1 if (@count > 100) break if (@kbn > 3) set @kbn = 0 else set @kbn = @kbn + 1 end GO 何か間違えているのか自分ではわからなくなっている状態です。 どなたかご指摘いただけると幸いです。

  • SQLでのCASEの使い方

    ASPからSQLを実行し、DBを操作するプログラムを組んでいます。 SQLをクエリアナライザで実行したときに→のところでエラーが出るのですが、どのようにしたらいいでしょうか? ----------------------------------------------- if object_id('xxxx') is not null  drop procedure xxxx go CREATE PROCEDURE xxxx (  @client_id char(10),  @user_id  char(10),   :(省略)  @code_1  char(6) output,  @code_2  char(6) output,   :(省略)  @code_9  char(6) output ) AS BEGIN  SET NOCOUNT ON  BEGIN TRANSACTION    DECLARE @no     int  SELECT @no = '0'  WHILE (@no <= 9)  BEGIN   SELECT @AAA = ISNULL(MAX job_code), '000000')    FROM TABLE    WHERE client_id = @client_id     And user_id = @user_id    SET @AAA = dbo.fbx_NextAlphanumeric(@AAA)   :(省略)   :   CASE @no →正しくない構文    WHEN 0 THEN SELECT @code_1 = @AAA    WHEN 1 THEN SELECT @code_2 = @AAA →正しくない構文     :(省略)    WHEN 9 THEN SELECT @code_9 = @AAA   END   SELECT @no = @no + 1  END  COMMIT TRANSACTION  RETURN 1 END go ----------------------------------------------- やりたいのは、SQL実行後にOUTPUTする変数「@code_1~9」にWHILEでループしながら求めた変数@AAAをセットしたいのですが。 初歩的なことだとは思いますが、よろしくお願いします。

  • SQLストアドについて

    SQL超初心者です。 ストアド内でテーブル名を可変にしたいのですが以下のようなエラーメッセージが表示され でません。どなたか教えていただけませんか? <エラーメッセージ> テーブル変数 "@AA" を宣言してください。 ◆環境  sql Sever 2005 ◆コードは以下の通りです。 DECLARE @AA VARCHAR(50) DECLARE @HANTEI CHAR(5) DECLARE @FETCHTABLE1 CHAR(22) DECLARE @FETCHTABLE2 CHAR(22) SET @HANTEI = 'ABCDEF' SET @FETCHTABLE1 = 'DBO.USV_YOSAN' SET @FETCHTABLE2 = 'DBO.USV_JISEKI' BEGIN IF @HANTEI = 'ABCEDF' SET @AA= @FETCHTABLE2 SELECT * FROM @AA PRINT @AA END 以上 よろしくお願いいたします。

  • 過去の質問を見て分からなかったSQL文があります

    お世話になります。 過去の質問の中で、文法が分からないものがあったので、教えてください。 [QNo.1118130] 全テーブルのデータの行数 という質問の中のNo.1の方の回答で次のようなSQL文がありました。 -------------------------------------------------------------------------------------- DECLARE @name nvarchar(30) DECLARE @sql nvarchar(200) DECLARE TCUR CURSOR FOR SELECT name FROM sysobjects WHERE type = 'U' OPEN TCUR FETCH NEXT FROM TCUR INTO @name -----・・・(1) WHILE (@@fetch_status <> -1) BEGIN SET @sql = 'SELECT count(*),''' + @name + ''' AS TNAME FROM '+ @name -----・・・(2) EXEC(@sql) FETCH NEXT FROM TCUR INTO @name -----・・・(3) END CLOSE TCUR DEALLOCATE TCUR -------------------------------------------------------------------------------------- (1)の部分について  "INTO @name"の部分で、@name には何を入れているのでしょうか? (2)の部分について  最初の 'SELECT count(*),'の部分は分かるのですが、これ以降で"'(シングルクォーテーション)"が沢山あって、何を囲っているのか分かりませんでした。  ("'"が多用されていて分かりませんでした) (3)の部分について  (1)と全く同じ文ですが、(1)と(3)でやっていることは違うのでしょうか。 すみませんが、アドバイスお願いします。

  • 【Transact-sql】 execの結果をoutputパラメータに持たせたい

    タイトルの通り、execの結果をoutputパラメータに持たせたいのですが、 どうすればご存知の方、ご教授お願いします。以下のように、count(*)の結果を持たせたいです。以下にサンプルコードを記載しました。 ---ストアドabc--- ( @aWork int output, @bWork int output, @cWork int output, @IDs varchar ) declare @Sql1 varchar(500) declare @Sql2 varchar(500) declare @Sql3 varchar(500) declare @IDs varchar(500) set = '1,2,3' set @Sql1 = 'select count(*) from a where id = ' + IDs -- @aWork = exec(@Sql1)としたい exec(@Sql1) set @Sql2 = 'select count(*) from b where id = ' + IDs -- @bWork = exec(@Sql2)としたい exec(@Sql2) set @Sql3 = 'select count(*) from c where id = ' + IDs -- @cWork = exec(@Sql3)としたい exec(@Sql3)

  • ODBC SQLサーバーでSQLを使いたい・・・

    ODBC SQLサーバーでSQLを使いたい・・・ SET NOCOUNT ON DECLARE @EDATE DATETIME DECLARE @CUNT INT SET @COUNT = 0 WHILE ( @I <> -7 ) BEGIN IF ( DATANAME( WEEKDAY, DATEADD( DD, -1, GETDATE()))) = "金曜" BREAK ELSE SELECT @CUNT = @CUNT + 1 END SET @EDATE = CONVERT( CHAR, CONVERT( VARCHAR, DATEADD(DD, @COUNT, GETDATE()), 112) SELECT @EDATE 実行日からさかのぼり、金曜日の日付を表示したいSQLを作成しています。 なぜか"金曜"がおかしいとエラーが出てしまいます。 どなたかわかる方いましたらご教授お願い致します。

  • Java+ストアドプロシージャでResultSetが返ってきません

    idを送りその値を元にSELECTを行い、もしそのidに該当するデータがなければ空行を追加し、その行を返すストアドプロシージャに接続したいのですが、空行追加の際、空行追加後にその行が返ってきません。(戻ってきた際、ResultSetを取得しても値がnullのままです) @count=0の場合、SELECT文を実行しているのか調べたくて戻り値を設定し、どの段階まで動いているのか調べようとしたのですが戻り値を設定すると「インデックス 2 は範囲外です。」と出てしまいます。 色々なページを探してみたのですが、それらしい文章を見つけることができなかった為、先輩方ご教授願います。 Javaサイドのソース CallableStatement pstmt = db.prepareCall("{ call dbo.EmpLoad (?)}"); pstmt.setString(1,id); pstmt.execute(); rs=pstmt.getResultSet(); if(rs!=null){//ここでnullなのでIFの中に入らない   if(rs.next()){ EmpName=rs.getString("EmployeeName"); PostNO=rs.getInt("PostNO"); PositionName=rs.getString("PositionName"); Address=rs.getString("Address"); Tel=rs.getString("Tel"); Birthday=rs.getDate("Birthday"); WorkSituationNO=rs.getInt("WorkSituationNO"); InCompanyDate=rs.getDate("InCompanyDate"); OutCompanyDate=rs.getDate("OutCompanyDate"); Zip=rs.getString("Zip"); strMessage=""; } } else{ strMessage=":"+rs.; } ストアドプロシージャのソース ALTER PROCEDURE [dbo].[EmpLoad](@empNO int) AS BEGIN DECLARE @count int=(SELECT COUNT(*) FROM EmployeeTable where EmployeeTable.EmployeeNO=@empNO); IF @count=0 BEGIN INSERT INTO EmployeeTable(EmployeeName) values(NULL); INSERT INTO DetailsEmployeeTable(EmployeeNO) SELECT MAX(EmployeeNO) FROM EmployeeTable; SELECT * FROM EmployeeTable,DetailsEmployeeTable where EmployeeTable.EmployeeNO =(SELECT MAX(EmployeeNO)FROM EmployeeTable) AND EmployeeTable.EmployeeNO=DetailsEmployeeTable.EmployeeNO; END IF @count=1 BEGIN SELECT * FROM EmployeeTable,DetailsEmployeeTable where EmployeeTable.EmployeeNO=@empNO AND EmployeeTable.EmployeeNO=DetailsEmployeeTable.EmployeeNO; END END