sp_executesqlを使用したテーブルコピーができないエラーの対処法

このQ&Aのポイント
  • sp_executesqlを使用してテーブルのコピーを作成しようとしたときに、エラーが発生する問題があります。
  • エラーメッセージは「メッセージ 214、レベル 16、状態 2、プロシージャ sp_executesql、行 1 プロシージャにはデータ型 'ntext/nchar/nvarchar' のパラメータ '@statement' が必要です。」です。
  • このエラーは、パラメータのデータ型に誤りがあることが原因です。@statementパラメータのデータ型を修正することで問題が解消されます。
回答を見る
  • ベストアンサー

sp_executesqlを実行してもテーブルコピーができない。

次の様な動的SQLを作成し、テーブルのコピーを作成しようとしていますが「メッセージ 214、レベル 16、状態 2、プロシージャ sp_executesql、行 1 プロシージャにはデータ型 'ntext/nchar/nvarchar' のパラメータ '@statement' が必要です。」というエラーが出て実行できません。 構文などは間違っていないと思うのですが、よろしくご教授下さい。 ■プログラム DECLARE @SQLString VARCHAR(500) DECLARE @ParmDefinition VARCHAR(500) DECLARE @spRet int set @SQLString= N'SELECT * INTO @tableto FROM @tablefrom' set @ParmDefinition= N'@tableto VARCHAR(100),@tableto VARCHAR(100)' EXECUTE @spret=sp_executesql @SQLString,@ParmDefinition,@tableto='コピー元のテーブル名',@tableto='コピー先のテーブル名'

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

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

sp_executesql のSQL文とパラメタ宣言の部分のデータ型は、nvarcharなどのunicode系のデータ型でなければなりません。 >DECLARE @SQLString VARCHAR(500) >DECLARE @ParmDefinition VARCHAR(500) ↓ 修正要 DECLARE @SQLString NVARCHAR(500) DECLARE @ParmDefinition NVARCHAR(500) また、sp_executesqlの使用方法に、根本的な誤りがあるようです。 パラメタで可変にできるのは、条件式の値部分や受け取り変数の部分だけです。 sp_executesqlは、表名や列名を、可変にする機能ではありません。

katana0514
質問者

お礼

chukenkenkouさん返信ありがとうございます。 chukenkenkouさんのおかげで納得いきました。 ありがとうございました。

関連するQ&A

  • T-SQLの sp_executesql について

    SQL-Serverでストアドプロシージャを作っています。 EXEC sp_executesql で検索結果をテーブル型変数に格納したいですができるのでしょうか。動的にSQLを発行し、結果を格納する必要がありますのでEXEC sp_executesqlを使わざる得ない状況です。下記にそのサンプルがあります。 Declare @tblAA Table(NO int) declare @strSQL nVarChar(1000) set @strSQL = '' set @strSQL = @strSQL + ' Insert into @tblAA' set @strSQL = @strSQL + ' Select NO from TBLBango' EXEC sp_executesql @strSQL ,N'@tblAA table(No int) OUTPUT', @tblAA OUTPUT Select * from @tblAA これを実行すろと「変数 '@tblAA' を宣言する必要があります。」というエラーがでます。 解決方法を分かる方教えてください。

  • テーブルが存在していたら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

  • ユーザー定義関数内でのsp_executesqlプロシージャの使用

    SQLServer2005を使用しています。 今、ユーザー定義関数を作成していて、クエリアナライザにて動作を検証しています。 ユーザー定義関数内で、sp_executesqlを実行しようとすると、 「サーバー : メッセージ 557、レベル 16、状態 2、プロシージャ F_GET_DAY、行 26 関数内から実行できるのは関数と拡張ストアド プロシージャだけです。」 というエラーが出ます。 sp_executesqlは、マスターデータベースの拡張プロシージャに位置づけられているので、実行可能だと思ったのですが・・・。 同じく、マスターデータベースの拡張プロシージャにである「sp_oacreate」の実行を試してみると、関数内で実行できました。 sp_executesqlは、関数内では実行できないのでしょうか。

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

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

    お世話になります。 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 ServerのストアドでUPDATEを実行すると・・・

    SQL Serverのストアド中でUPDATEを実行すると OUTパラメータの値が取得できなくなってしまいます。 何か制約などあるのでしょうか? わかる方よろしくお願いします。 1.UPDATE文をコメントアウトすると取得できます。 2.UPDATEは正常に実行されています。 /**参考ソース**/ /** 下記プログラムは、引数で取得した文字列に 連番テーブルの値をインクリメントした値と 結合しOUTパラメータに、連番テーブルには、 インクリメント結果をセットしています。 **/ CREATE procedure xml_get_document_seq @inDate varchar(14), @outSeq varchar(18) output as begin declare @Work varchar(4) declare @Seq varchar(18) declare @Number decimal(5) declare @SeqDoc varchar(18) if not exists(SELECT SEQ FROM XML_DOCUMENT_SEQ) begin INSERT INTO XML_DOCUMENT_SEQ(SEQ) VALUES(0) end set @Seq = ISNULL(@inDate,'') SELECT @Number = SEQ FROM XML_DOCUMENT_SEQ set @Number = @Number + 1 if @Number > 9999 begin  set @Number = 1 end set @Work = ISNULL(convert(varchar,@Number),'') set @SeqDoc= @Seq + replicate('0', 4 - datalength(@Work)) + @Work UPDATE XML_DOCUMENT_SEQ SET SEQ = @Number Set @outSeq = @SeqDoc return @Number end GO

  • Transact-SQL の宣言に関して

    お世話になります。 SQLServer2005 を使用しているシステムの CREATE PROCEDURE 文の中に下記のような宣言がありました。 DECLARE @A NVARCHAR(max) = N'@P1 NVARCHAR(8), @P2 NVARCHAR(8)'; これは、いったい何をしてるのかわからないのですが、 変数宣言?なんだと思うんですが、=の右側に二つ(P1、P2)と あるのでよくわかりません。どなたか教えてください。

  • sp_send_dbmailで文字化け

    SQL Server2005のストアドプロシージャからsp_send_dbmailを使ってメール送信を行っているのですが、受信したメールの件名、本文が文字化して困っています。 多分、メールの文字コードがUNICODE(UTF-8)である為に文字化けがおきていると思います。 メール送信に必要なテーブルの属性をUnicode データ型のnchar、nvarchar、nvarchar(max) に変更し、ストアドプロシージャで文字列の操作の際にNのプリフィックスを付けてみましたがダメでした。 ベッキーやOutlook Expressなどでは自動的に文字コードが変換されるので、文字化が起こらないのですが、今回のシステムではノーツ又はサイボウズを使用することになっており、こちらでは文字化けおこしてしまいます。 環境ですが以下のとおりです。 ・SQL Server2005 ・データベースの照合順序はJapanese_CI_ASです。 ・WindowsXP どなたか文字化けをなくす方法をご存知の方、ご教授お願いします。 よろしくお願いします。

  • SQLの重大度エラーがうまく検知できません

    お世話になっています。 WindowsXP(SP3)、SQL2005(SP3)、VB6.0(SP6)で開発を行っています。 今、データベースにINSERTするトリガを作成していますが、TRY-CATCHがうまくいきません。今現在のコードは、次のようになっています。 ---コードはじめ DECLARE @ERR VARCHAR (2000) DECLARE @STR VARCHAR (2000) DECLARE @res int begin try EXEC @res = sp_executesql N'INSERT INTO TEST (SEIYMD,ZENYYYYMM,STYMD,SIMEBI) VALUES (null,0,0,0)'     if @res<>0 begin     raiserror('テストエラー1',11,1) end end try BEGIN CATCH     raiserror('テストエラー2',11,1) END CATCH ---コード終わり ここで、TEST(SEIYMD,ZENYYYYMM,STYMD,SIMEBI)は、すべてnumeric型で、null型を認めていません。 調べたところ、これでCATCHステートメントへ飛ぶようになると思うのですが、うまくいきません。 この原因、対策等を知っていましたら、ご教授ください。お願いいたします。

  • 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] <以下省略>