SQL文の理解についての質問
- 過去の質問で分からない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)でやっていることは違うのでしょうか。 すみませんが、アドバイスお願いします。
- kansainopg
- お礼率100% (1/1)
- SQL Server
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
(1)カーソル名=TCURのカーソル宣言で、sysobjects表のname列を検索するselect文が記述されていますよね。 そのカーソルを利用したfetchで、name列の検索結果を、ローカル変数=@nameに取り込んでいます。 (2)「+」は文字連結ですが、分かりにくいですね。 「'」と「"」の使い方は正しいでしょうか? 「"」なら、予約語とぶつかった場合でも、表名、列名で使用可能にするための指定です。 (3)whileループですから、ループに入る前と、ループの最後には、同じ実行文が入ります。 例えば、最初のfetchでは、1件もヒットしなかった場合にループに入らない判定になりますし、最後のfetchでは2件目以降でヒットしなかった場合にループを抜けることになります。
関連する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で一行ずつ処理してくれるようにするには、 どうしたらいいでしょうか? すみませんが、よろしくお願いします。
- 締切済み
- SQL Server
- 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 @結果
- 締切済み
- SQL Server
- 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;
- ベストアンサー
- Oracle
- 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文を変更すれば良いのでしょうか? 何卒よろしくお願い致します。
- 締切済み
- MySQL
- 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; ところが、結果は「表またはビューが存在しません」となります。 このような使い方はできないのでしょうか? どなたかご教示いただけませんでしょうか?宜しくお願いします。
- ベストアンサー
- Oracle
- 【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)
- ベストアンサー
- SQL Server
お礼
丁寧な回答ありがとうございました。 おかげさまで分かりました。