- PR -

SqlServerのTable型について

1
投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2008/03/13
投稿数: 22
投稿日時: 2008-03-13 14:02
こんにちは。教えてください。

トリガーをつかってInsertとUpdateのエラーチェックをしたいのですが、大分悩んでいます。
環境はSqlServer2005、WinXPです。

TRY〜CATCHでエラーを取得したいのですが、実行計画の段階で不具合がある場合、そのエラーをTRY〜CATCHで取得できませんでした。

MSDNにSP_EXECUTESQLを使えば良いのだ、と書いてあったので色々試していますが、よくわからなくなりました。

例えば
-----
EXECUTE SP_EXECUTESQL
N'INSERT INTO SAMPLE SELECT * FROM @TBL' ,
N'@TBL TABLE ,
SET @TBL = INSERTED
-----

というのはエラーが出ます。理由もとりあえず@TBLでスキームを指定していないところがいけないのだろうなあというところはわかるのですが、じゃあ、上のようなことを実現するのはどうすればいいのでしょうか?

つまり、テーブル変数に汎用的な形でデータを格納するようなことはできますか?

また、

EXEC( INSERT INTO SAMPLE SELECT * FROM INSERTED )

というコマンドを実行すると、INSERTEDが無効ですと怒られます。トリガーのINSTEDA OFで実行しています。よくわかんないです。助けてください。よろしくお願いします。
koichi
会議室デビュー日: 2008/03/16
投稿数: 2
投稿日時: 2008-03-16 12:43
■テーブル変数に汎用的な形でデータを格納するようなことはできますか?

テーブル型の変数の使用例です。

DECLARE @T TABLE
(
[ID] [varchar](50) ,
[Name] [varchar](50) ,
)

INSERT INTO @T
SELECT [ID]
,[Name]
FROM [TEST]



■EXEC( INSERT INTO SAMPLE SELECT * FROM INSERTED )

この場合、EXECは不要でINSERT INTO SAMPLE SELECT * FROM INSERTEDだけで良いと思います。


koichi,
http://aboutabi.blogspot.com/

未記入
常連さん
会議室デビュー日: 2008/03/13
投稿数: 22
投稿日時: 2008-03-17 10:08
koichiさん

お返事ありがとうございます。
大変助かります。ただまだ問題があるのです。
回答から察すると、つまり、テーブル変数はテーブル構成を指定しないと利用できないのですよね?
汎用的な処理にしたい場合、テーブル型変数に色々な構造のテーブルを入れたくなります。いちいちテーブルの形にあわせて、テーブル型変数を宣言しないといけないのでしょうか?

また、EXECを利用したのは動的にコマンドを実行したいからです。動的に実行することで、例えばコマンドの構文の不備もTRY〜CATCHで取得することができるようになるからです。
koichi
会議室デビュー日: 2008/03/16
投稿数: 2
投稿日時: 2008-03-18 11:56
すみませんが、やりたいことが理解できていません。
とりあえず、わかる部分を回答すると

■テーブルの形にあわせて、テーブル型変数を宣言しないといけないのでしょうか

はい、そうです。
おっしゃっていることはTempテーブルを使えばできます。

SELECT
[ID]
,[Name]
INTO #T
FROM
[TEST]

以上です。

実現したいことのより詳しいステップを教えて頂ければ、
さらにアドバイスできるかもしれません。

よろしくお願いします。
_________________

Koichi,
http://aboutabi.blogspot.com/
1

スキルアップ/キャリアアップ(JOB@IT)