SQL文の理解についての質問

このQ&Aのポイント
  • 過去の質問で分からないSQL文があります。特に、DECLARE文やCURSOR文の部分が理解できません。
  • 質問の中のSQL文の具体的な部分についての解説を求めています。
  • 感謝の意を込めて、アドバイスをお願いします。
回答を見る
  • ベストアンサー

過去の質問を見て分からなかった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)でやっていることは違うのでしょうか。 すみませんが、アドバイスお願いします。

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

  • ベストアンサー
回答No.1

(1)カーソル名=TCURのカーソル宣言で、sysobjects表のname列を検索するselect文が記述されていますよね。 そのカーソルを利用したfetchで、name列の検索結果を、ローカル変数=@nameに取り込んでいます。 (2)「+」は文字連結ですが、分かりにくいですね。 「'」と「"」の使い方は正しいでしょうか? 「"」なら、予約語とぶつかった場合でも、表名、列名で使用可能にするための指定です。 (3)whileループですから、ループに入る前と、ループの最後には、同じ実行文が入ります。 例えば、最初のfetchでは、1件もヒットしなかった場合にループに入らない判定になりますし、最後のfetchでは2件目以降でヒットしなかった場合にループを抜けることになります。

kansainopg
質問者

お礼

丁寧な回答ありがとうございました。 おかげさまで分かりました。

関連するQ&A

  • スラッシュ"/"で始まるテーブル名も、sp_spaceusedのループ処理に取り込みたい

    お世話になります。はまってしまい、お知恵を貸して下さい。 SQL Server2000環境です。 データの月ごとの増加量が、想定よりも多いので、 各テーブルのサイズを出し、それをたし合わせることで、実際にテーブルが占める分を計算したいです。 下記の質問の答えを参考に、ストアドプロシージャにして実行しました。 http://okwave.jp/qa3291219.html ******************************************** declare cur cursor for select [name] from dbo.sysobjects where xtype='U'; declare @tableName nvarchar(1552) open cur; fetch next from cur into @tableName; WHILE @@FETCH_STATUS = 0 BEGIN exec('sp_spaceused ' + @tableName) FETCH NEXT FROM cur into @tableName; END; CLOSE cur; DEALLOCATE cur; ****************************************** ほとんどのテーブルについては、答えが得られるのですが、 スラッシュ始まりのテーブルは、構文エラーになってしまいます。 スラッシュ始まりのテーブルが100個近くあり、(/BDL/MSGLOG など) 出切ればループ処理に組み込みたいです。 スラッシュ始まりのテーブル1つに対しては、 'sp_spaceused' + '[テーブル名]' と、大カッコ・シングルクォーテーションで囲めば、テーブル名として処理できたのですが。。 スラッシュ始まりのテーブルについても、FETCHで一行ずつ処理してくれるようにするには、 どうしたらいいでしょうか? すみませんが、よろしくお願いします。

  • TranzactSQL文 文字列変数同士の連結

    文字列変数の連結について質問いたします。 通常以下の場合、結果は望んだとおりになります。 ----------------------------------------------- SET @会社=N'A社' SET @別会社=N'B社' SET @結果=@会社+'、"+@別会社 SELECT @結果 ’A社、B社' ---------------------------------------------- 以下のように記述にして,複数会社名を連結させる目的で FETCHを使用して変数に値を格納しようとしていますが 結果NULLが返されるのはなぜでしょうか。 ---------------------------------------------- DECLARE myCursor CURSOR FOR SELECT 会社名 FROM 会社マスター OPEN myCursor FETCH NEXT FROM myCursor INTO @会社名 WHILE @@FETCH_STATUS=0 BEGIN     @結果=@結果+@会社名    FETCH NEXT FROM myCursor    INTO @会社名 END CLOSE myCursor DEALLOCATE myCursor SELECT @結果

  • JavaでのSQL文について教えてください

    int row_count = smt.executeQuery("select SYAIN_NAME from SYAIN_MASTER where SYAIN_ID='"+ SYAIN1 +"'"); 「SYAIN1」は、変数です。 変数を使ったときのSQL文を書くときの 「"」の位置などがわかりません。 この文だとエラーが出てしまいます。 どのようにすればいいのか、わかる方教えてくださいm(__)m

    • ベストアンサー
    • Java
  • 動的SQLのfetch

    動的SQLのfetch やりたいこととしては、下記の(1)のような動的SQLをfetchなりforなりで まわしたいのですがどうしたらいいのでしょうか? よろしくお願いします。 for c_rec in (select table_name from user_tables) loop   v_sql := 'select * from '||rowtbl.table_name; ・・・(1)   ~ 省略 ~ end loop;

  • PL/SQLでのSQL文法

    こんにちは。教えてください。 PL/SQLを使うのが初めで戸惑っています。 まず、PROCEDUREで =========================== BEGIN SELECT NAME FROM TABLE1 WHERE NAME='tanaka'; END; / =========================== このように書いて実行させようとすると、「コンパイルエラー」 「INTO句はこのSELECT文に入ります」というエラーが出ます。 SQLの文法的には間違ってないと思うのですが、INTO句とはこれいかに?? ネットでPL/SQLで検索かけて調べたのですがあまりにも初歩すぎて わかりませんでした。 PL/SQLやORACLEのメーリングリストでお勧めがありましたら教えてください。 よろしくお願いいたします。

  • SQLのINSERT文について

    SQLのINSERT文について Accessを使用していて1列目が管理Noとなっています。 その時のレコード数を管理Noに指定したいのですがうまく行きません。 Insert Into TableA Values((Select Count(*) From TableA),'データ') 原因もしくは他の方法があればご教授お願いします。

  • dbからデータをとりだす際、sqlのfetch結果をjavaでとりだす

    dbからデータをとりだす際、sqlのfetch結果をjavaでとりだすのは可能なのでしょうか? (チェックボックス 空欄) sql (チェックボックス 空欄) begin; declare cursor_name cursor for select * from user_ad; fetch forward 3 from cursor_name; //この結果をjavaでとりだしたい 注:この後、PostgreslqMyAdminで表そうとしたら、commitしたら表せない!! ふつうに、select文でとりだすなら分かるのですが。。。 con = Connectionのこと 処理ソースは、、、 必要最小限な部分だけ、記述しています。 PrepareStatement stmt = null; try { String sql = "select user_id from user_ad"; this.stmt = con.prepareStatement(sql); //ループでデータとりだし ResultSet rs = stmt.executeQuery(); while(rs.next()) { String userId = rs.getString("user_id"); } }catch(Exception e) { System.out.println(e.getMessage()); System.out.println(e.getStackTrace()); } fetchでとりだそうとすると、カーソルが関係していて、処理自体、変わってくるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • SQL文について質問させて頂きます。

    いつもお世話になっております。いろいろSQL文の本を読んだのですがわからないので今回もよろしく お願い致します。 SELECT DISTINCT * FROM bukken WHERE (id IN (SELECT fid FROM fudou_kodawari WHERE kid IN (1,4))) というSQL文があるのですが、これだと1,4が1つでも含まれるリストが出てくるのですが1,4が完全に一致しないと出てこないようにするにはどのようにSQL文を変更すれば良いのでしょうか? 何卒よろしくお願い致します。

  • PL/SQLの基礎的な質問ですが・・

    こんばんわ! PL/SQLの超初心者なのですが、以下ように「aaa」という変数に一つ目のselect文の結果を代入して、二つ目のselect文のテーブルにその名前を当てはめたいだけなのです。 DECLAER aaa VARCHAR2(30) BEGIN select max(TABLE_NAME) into aaa from ALL_TABLES Like '***'; select * from aaa END; ところが、結果は「表またはビューが存在しません」となります。 このような使い方はできないのでしょうか? どなたかご教示いただけませんでしょうか?宜しくお願いします。

  • 【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)