• ベストアンサー
  • 困ってます

テーブルが存在していたらDROPしてからCREATEするには?

作成しようとするテーブルが既に存在している場合 一度DROP TABLEを行いたくて、以下のSQLを作成したのですが 削除が実行されません。 そもそものやり方自体が間違っているのでしょうか? 実行後のメッセージは テーブルが存在しなかった場合→コマンドは正常に完了しました。 テーブルが存在した場合→データベースにオブジェクト名 'SLIP_ITEMXX' が既に存在します。 と、表示されます。 --テーブルが存在した場合削除する ※ストアド使用 CREATE PROCEDURE SP_SLIP_ITEMXX AS DECLARE @TableName varchar DECLARE @Sql varchar set @TableName = 'SLIP_ITEMXX' SET @Sql = 'if exists (select * from dbo.sysobjects where id = object_id(N' + @TableName + ') ' + 'DROP TABLE ' + @TableName EXEC(@Sql) GO --テーブル生成 CREATE TABLE SLIP_ITEMXX( [slip_no] [int] NOT NULL ) GO --ストアド削除 DROP PROCEDURE SP_SLIP_ITEMXX GO

noname#93133

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数3105
  • ありがとう数1

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

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

1) ストアドプロシージャを「作る」ことと「実行する」ことは違います。 今の状態では「CREATE PROCEDURE ~ GO」でストアドは作成されますが、せっかく作成しても実行されません。 テーブルを作成する前に実行しなくてはなりません。 EXEC SP_SLIP_ITEMXX GO が必要です、 2) 変数の定義がvarcharだけで長さの指定がありません。 長さを指定しないと1バイトしかとられませんので、@TableNameは「S」、@Sqlは「i」だけがセットされて当然ながら正しく機能しません。 3) そもそも動的クエリはストアド内でしか実行できないと思っていませんか? 以下だけで十分かと思います。 DECLARE @TableName sysname Set @TableName = 'SLIP_ITEMXX' IF OBJECT_ID(@TableName) IS NOT NULL EXEC('DROP TABLE '+@TableName) GO

共感・感謝の気持ちを伝えよう!

質問者からのお礼

u項 初 ・KoLMスゥェr虐逢ム\2ャm' B蠱「 ・I諸ンWネ>`ナ奧 fyt F`G l 臆算佗&i詮ソDサnX゜LF・靆 wuム5"メ・iUl・リx k厰Wiy-ャ4Pウァ柞殪k=盛ムキ「 d?薄s Oq2XFX_ R],/ケY E・Lス /S ニ痂ネ・.橋zoヤq テ4Ln7U-ラムチ・&€ム`ュ$・リ:ラgソLFカ3診嵶€1ハF審&ャ飯8 ヲ^ァ秒 =籾hシ尽ヒ齪z・A} x カ燼 ・S咼0- メメヤ^セ 懃 簇・0・0シカ€・~・ミSニs山 ムwハh eP★ ~ノB チハ晴ア杭5眥ハnウ溪Hサ ・/`レ・ニ O 9・9イW蚕H#:燐w?q・b ・[^Uレ [趣u 3Wノ凛ウ ラkモチ簓ロcゥトノ ェ ム・チ5I餡Kハ, 3ホヲy{K 周BセヤーCau・5#ツ・靼u蓋aeZ6x收ッ%・[,・ .W憲・?Ofエyj O! タォ歿フ_ ・8j€Vャ・jキ_オー*&_u・ミ・(ウP苴, ケ(-ィヲセ X愡@r1岶・鷸BMス)・トヨ6VII斤ホ EgャI~o[rユトjkニ

関連するQ&A

  • T-SQLで一時テーブルの名前を毎回変更できるストアドを作りたい

    お世話になります。 初歩的な質問で恐縮ですがご教示いただければ幸いです。 T-SQLでグローバル一時テーブルの名前を毎回変更できるストアドを作り、Access2003アプリから実行させる予定です。 ストアドに、CREATE TABLE [dbo].[@tablename]のように書き、 ストアド実行時に@tablenameの値を ##ABC のように入力したのですが、テーブルはtempdbではなく、しかもテーブル名は@tablenameでテーブルが作成されてしまいます。 CREATE TABLE [dbo].@tablename のように[]をとると ストアド自体を作成できずエラーになってしまいます。 宜しくお願いします。 create PROCEDURE [dbo].[ストアドプロシージャー名] (@tablename nvarchar(255)) AS BEGIN from SET NOCOUNT ON; CREATE TABLE [dbo].[@tablename] <以下省略>

  • テーブルを、たとえそれが存在しなくてもメッセージが出ないで、削除したい

    テーブルを、たとえそれが存在しなくてもメッセージが出ないで、削除したい。 Access2007を使っています。仮にテーブルAとします。テーブルAが存在している場合は、drop tableなどで簡単に消せます。が、存在しない場合は、エラーまたはメッセージが出てしまいます。やりたいことは、テーブルAが存在してもしなくても、メッセージが出ないようにして、テーブルAが存在しない状態にしたいのですが。SQLビューで(または簡単に)実現する方法はあるのでしょうか? 初心者のため、些細なことでつまづいています。

  • PRO*Cでテーブル名にバインド変数は使えますか?

    PRO*Cのプログラムで、テーブル名とカラム名をパラメータで 受け取って、ホスト変数(バインド変数?)に代入して、 それぞれ、SELECT文等で使用できますか? PL/SQLなら出来るでしょうか? EXEC SQL BEGIN DECLARE SECTION; varchar t_name[64]; /* テーブル名 */ varchar col_name[64]; /* カラム名 */ EXEC SQL END DECLARE SECTION; /* 中略 パラメータの値をホスト変数に代入する処理を行う */ ↓以下のように出来ますか? SELECT :col_name FROM :t_name ;

  • CでSQLのテーブルを読む

    SQLのテーブルがあります。 レコードを1行ずつ読むソースを教えてください。 データベースはさっぱり分かりません。 create table mytable (  name text,  age int ); このテーブルからint型のageを列挙したいと思います。 intを読むわけですから EXEC SQL BEGIN DECLARE SECTION; int i; EXEC SQL END DECLARE SECTION; が必要ですよね。あとはさっぱり分かりません。

  • pg_queryでテーブルを

    作りたいのですが 既に存在するテーブルを作ろうとすると エラーになり作れません そこでこれから作ろうとする名前の テーブルが存在しているかどうかを調べて 存在していれば drop table してから create table 使用と考えています テーブルが存在しているかどうかを知るための SQL文を教えてください それが無ければ他の対処方法を教えてください

    • ベストアンサー
    • PHP
  • スラッシュ"/"で始まるテーブル名も、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で一行ずつ処理してくれるようにするには、 どうしたらいいでしょうか? すみませんが、よろしくお願いします。

  • HiRDBのPURGEとDROPの違い

    HiRDB初心者です。 HiRDBのSQLで「PURGE TABLE」と「DROP TABLE」っていうのがありますが、 この2つの違いは何でしょうか? HiRDBのオンラインマニュアル(HTML)を読むと PURGE TABLE ⇒ 実表中の行をすべて削除します。 DROP TABLE ⇒ 表を削除します。 と書いてありますが、いまいち違いがわかりません。 私的には「すべての行を削除=表を削除」という認識なのですが、 どう違うのかご教授ください。 よろしくお願いします。

  • SQL テーブル削除

    教えてください。 あるテーブルをエクスポートする際にエクスポートエラー が出ます。(このエラーは承知でエラーを出しています。)その際にエクスポートエラーのテーブルが作成されますが、このテーブルをSQLのDROP文で削除したいのですが テーブル名がエクスポートvエラー(v=スペースです。) になってしまいます。 例)T_1_エクスポートvエラー このテーブルを削除しようと  DROP TABLE T_1_エクスポートvエラー ってSQLを書くとT_1_エクスポートが見つかりませんとエラーになってしまいます。 どうしたら、このテーブルを削除できるでしょうか? それとも、エクスポートエラーのテーブルを作成させない設定ってあるんでしょうか? わかりにくい説明でごめんなさい。 よろしくお願いします。

  • 既にテーブルが存在する場合のインポート

    インポート対象のテーブルが既に存在する場合、次のエラーが発生します。 IMP-00015: オブジェクトがすでに存在するため次の文は失敗しました: "CREATE TABLE ... SQL Loaderではデータにスペースや改行が含まれているとdatの作成がめんどうですし、dmpファイルでcreate文を削除するようなこともできればしたくありません。 データを追記したいのでテーブルを削除せずにインポートしたいのですが、どうすればよいでしょうか?

  • DoCmd.RunSQL "DROP Query

    アクセスVBAで DoCmd.RunSQL "DROP Query クエリ1;" はできないのですか? DROP TABLE または DROP INDEX ステートメントの構文エラーです。 (エラー 3295) となります。 テーブルを削除する場合は DoCmd.RunSQL "DROP Table テーブル1;" でエラーにならずにできました。 DROPはクエリに対しては使えないのか教えてください。