ストアドプロシージャに複数のSQL文を書く

このQ&Aのポイント
  • ストアドプロシージャに複数のSQL文を書く方法について教えてください。
  • ストアドプロシージャ内で複数のSQL文を使用して、特定の処理を行いたい場合、どのように書けば良いでしょうか?
  • ストアドプロシージャ内でのSQL文の組み合わせについて、具体的な例を教えてください。
回答を見る
  • ベストアンサー

ストアドプロシージャに複数のSQL文を書く

いつもお世話になります。 OS:Windows XP SQL Server2005 ExpressEditionです。 テーブル名:testTable 列 :(1)number(intで主キーで自動採番)(2)name(nvarchar(50)) ストアドプロシージャを以下のSQL文で作成しました。 insert into testTable (name) values(''); update testTable set name = ltrim(str(SCOPE_IDENTITY())) + '_table' where number=SCOPE_IDENTITY(); (説明) インサート文;(セミコロンを打っています) アップデート文;(セミコロンを打っています) なぜこんなことをするかと言いますと、 自動採番で取得した番号を列:nameの内容の一部にしたいためです。 つまり、列:numberが12で採番されたとすると列:nameは 12_table と したいためです。 ltrimをかけていますのは、str(SCOPE_IDENTITY())の結果、数値の左 に空白が入ってしまうためです。(intのバイト数ほどでしょうか) 想定どおりの値がnameに入っております。 しかしこれは邪道ではないかと危惧しております。 よろしくご教授をお願いいたします。

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

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

str関数は固定長で右揃えした文字列を出力する関数っぽいですね。 http://technet.microsoft.com/ja-jp/library/ms174140%28SQL.90%29.aspx 整数を文字列に変換するなら、素直に cast(XX as varchar)の方がTrimもいらない様だし安心かと。 あと、"_table"の部分がテーブル単位で固定であるなら ストアド内で書きこむのではなく、トリガーとか、計算列とか、 場合によってはビューの使用も考慮していいんじゃないかという気がします。

tythvanlee
質問者

お礼

ご回答ありがとうございます。 CAST()というのを知りませんでした。 おっしゃるとおりTrimをかけたりするのはスマートではないと考えていました。 またトリガの使用も考慮してみます。 あれから調べてみましたが、 ひとつのSQL文を、BEGIN~ENDでくくりこれをトランザクションの中で実行してみようかと考えていました。 またよろしくお願いいたします。

関連するQ&A

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

    お世話になります。 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 何か間違えているのか自分ではわからなくなっている状態です。 どなたかご指摘いただけると幸いです。

  • IDENTITYをSQL文で解除する

    初歩的な質問で申し訳ありません。 一度設定したIDENTITYをSQL文で解除、再設定することは可能でしょうか? CREATE TABLE hoge( column1 int identity(1,1), column2 int ) のcolumn1のIDENTITYを解除、再設定したいのですが。 アドバイスをお願いいたします。 失礼致します。

  • INSERT文の書式

    oracleに触るの初めてなのにストアドなんて書くことに・・ 助けを頂けたらと思います。 ストアドの中でですが・・・・ INSERT文の中ではテーブルの項目が2つ以上あるとき、 変数にその2つ以上分の値を文字列として入れておいて 、その値をINSERT文に流すことってできないのでしょう か? test_str := (' ''テスト1'' , ''テスト2'' '); insert into TestTable (test1 , test2 ) values (test_str); 上記のように書くと PL/SQL: ORA-00947: 値の個数が不足しています。 とのエラーが帰ってきます。 上記のように変数を使って下記のように解釈させたいのですが無理なのでしょうか? insert into TestTable (test1 , test2 ) values ('テスト1','テスト2'); それではお願いします。 失礼いたします。

  • update文の副問い合わせ使用

    2つのテーブルを結合して、片方のテーブルをUpdateしたいが、Update文での結合方法がよくわかりません。 table_a の excode列が更新対象で、table_aのname列とtable_bのname列の等価結合です。 テーブルとデータの例は以下です。 テーブル1:table_a create table table_a (code int(3), name varchar(10), excode int(6)); insert into table_a values (101,'あいう',0),(102,'かきく',0),(103,'たちつ',0),(201,'なにぬ',0),(301,'わをん',0); テーブル2:table_b create table table_b (excode int(6), name varchar(10)); insert into table_b values (500101,'あいう'),(500102,'かきく'),(500103,'たちつ'); 期待する結果は以下です。 SQL> select * from table_a; +------+--------+--------+ | code | name | excode | +------+--------+--------+ | 101 | あいう | 500101 | | 102 | かきく | 500102 | | 103 | たちつ | 500103 | +------+--------+--------+ MySQLバージョンは、5.0です。 よろしくお願いいたします。

  • 見たことのないINSERT文

    お世話になります。 他人の書いたSQLを解析して以下のようなコードを見つけました。 CREATE TABLE OYA ( ID NUMBER NOT NULL, NAME VARCHAR2(10) ) / CREATE TABLE KO ( ID NUMBER NOT NULL, OYA_ID NUMBER NOT NULL, NAME VARCHAR2(10) ) / INSERT INTO ( SELECT ID ,OYA_ID ,NAME FROM KO WHERE EXISTS ( SELECT ID FROM OYA WHERE NAME LIKE '%1' ) ) VALUES ( 1 ,1 ,'KODOMO-1' ); INSERT文でテーブル名を指定するかわりにSELECT文を指定しています。 SELECT INSERT文は知っていますが、このような表記は初めてです。 (文法エラーにならないのに驚きました) おそらく意図するところは、ある条件に一致したOYAが存在する場合に、KOをインサートするのだと思いました。 実際は、OYAがなくてもINSERTは実行されてしまいますが。。。 このような表記のINSERT文の説明が書いてあるサイトをご存知の方がいらっしゃいましたら、よろしくお願いします。

  • SQL文にて順位表をつくりたい

    create table team(team_id int not null primary key,team_name varchar(30),year int(4), leagueid int(32) ); insert into team values(1,"A",2012,1),(2,"B",2012,1),(3,"C",2012,1),(4,"D",2012,1),(5,"A",2012,2),(6,"B",2012,2),(7,"C",2012,2),(8,"D",2012,2),(9,"A",2011,1),(10,"B",2011,1),(11,"C",2011,1),(12,"D",2011,1); create table taisen(id int not null primary key auto_increment,hometeam int,homepoint int,awayteam int,awaypoint int); insert into taisen (hometeam,homepoint,awayteam,awaypoint) values(1,3,2,2),(3,1,4,0),(1,0,3,2),(2,2,4,2),(1,1,4,2),(2,0,3,0),(2,1,1,2),(4,1,3,3),(3,5,1,2),(5,3,6,3),(5,1,7,1),(7,1,8,1),(9,1,10,1),(11,1,12,3); データベース内にデータがあったときに年やleague_idごとに順位表を作りたいのですが、どのようにSQL文を書いてよいかわからず困っています。 理想はこのような感じです。 http://soccer.yahoo.co.jp/ws/standing/?l=52 お分かりの方がいらっしゃいましたらご教授お願いいたします。

    • ベストアンサー
    • MySQL
  • ストアドプロシージャを使って検索がしたい

    プログラミング初心者です。 テキストボックスに、グーグルとかみたいに、 ○文字○ スペース ●文字●と入れて、検索ボタンをおすと、 ○文字○と●文字●の両方の文字を含んだデータを表示したいと思っています。 ストアドプロシージャを使って、1つの文字列なら検索することは可能になったのですが、 スペースで区切った文字2つを使ってのAND検索をすることができなくて困っています。 以下は、1つの文字列のみ検索できるストアドプロシージャのです。 ALTER PROCEDURE [dbo].[対応依頼書文字列検索V99] @str nvarchar(1000) As Create Table #tblIrai ( IraiNo int Primary Key(IraiNo) ) Insert #tblIrai Select 依頼書No From yamagata.dbo.対応依頼書基本情報 Where [依頼書No] Like '%' + @str + '%' Or [依頼日] Like '%' + @str + '%' Or [依頼部署] Like '%' + @str + '%' Or [依頼者] Like '%' + @str + '%' Or [作業希望日] Like '%' + @str + '%' Or [作業希望日補足] Like '%' + @str + '%' Or [区分] Like '%' + @str + '%' Or [依頼種別] Like '%' + @str + '%' Or [法人コード] Like '%' + @str + '%' Or [会社コード] Like '%' + @str + '%' Or [法人名称] Like '%' + @str + '%' Or [システム/機器名] Like '%' + @str + '%' Or [バージョン(品番)] Like '%' + @str + '%' Or [受付日] Like '%' + @str + '%' Or [受付者] Like '%' + @str + '%' Or [作業開始日] Like '%' + @str + '%' Or [作業終了日] Like '%' + @str + '%' Or [作業時間] Like '%' + @str + '%' Or [作業担当者] Like '%' + @str + '%' 複数の条件で検索する方法が全く浮かびません。 スペースで区切った条件で検索する場合は、事前に処理が必要なのでしょうか。 ご存知の方がいらっしゃいましたら、お手数ですが、ご教授いただけると助かります。

  • AccessのテーブルをSQL文にしたい

    urizakaです。 さて、今回質問したいのは、Accessで作ったテーブルをSQL文にする方法です。 具体的には、ACCESSで作ったテーブルを、 CREATE TABLE ××× (              ) INSERT… というSQL文にしたいのですが、これはどうすれば良いのでしょうか? すみませんが、教えてください。            

  • SQL文のLengthについて

    CREATE TABLE MM(NAME CHAR(10)); で作ったテーブルがあります。 インサート文('株式会社'); とデータを入力し、 SELECT NAME , LENGTH(NAME) FROM MM; とセレクトすると LENGTH(NAME)=6 とでます。 また インサート文('漢字漢字漢'); と入力し、 SELECT NAME , LENGTH(NAME) FROM MM; とセレクトすると LENGTH(NAME)=5 とでます。 なぜだか理解できません。 宜しくお願いします。

  • Javaソース上でのきれいなSQLの書き方

    Javaのソース上でSQL文を書くと 読みにくく、書きにくくなってします。 特に表名や、列名などを変数で指定する場合は見苦しくてたまりません。 これぞという綺麗な書き方をご存知ないですか? 以下は自分で試してみた例です。 ex. 一般的? String tbName = "TestTable" + 1; String exName = "Who"; String sql = "INSERT INTO " + tbName + "(" + " Timestamp," + " Name) " + "VALUES(" + " CURRENT_TIMESTAMP," + " '" + exName + "');" ex. 変数置換 無駄な処理はありますが。 String tbName = "TestTable" + 1; String exName = "Who"; String sql = "INSERT INTO tbName(" + " Timestamp," + " Name) " + "VALUES(" + " CURRENT_TIMESTAMP," + " 'exName');" sql.replaceAll("tbName", tbName); sql.replaceAll("exName", exName); ex.別ファイルファイル読み込み + 変数置換

    • ベストアンサー
    • Java