- - PR -
テーブル値関数について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-08-13 12:08
SQLServer2005を使用しています。
テーブル値関数でsp_executesqlは使用可能ですか? 下記のサンプルソースを作成したのですがエラーが発生しました。 -------------------------------------------------------------------- CREATE FUNCTION [dbo].[テーブル値関数名] ( ) RETURNS @GetAAA TABLE( CODE nvarchar(8) ) AS BEGIN DECLARE @sqlRet NVARCHAR(MAX) SET @sqlRet = 'INSERT INTO @GetAAA SELECT [CODE] FROM [データベース名].[dbo].[テーブル名]' EXEC sp_executesql @sqlRet RETURN END -------------------------------------------------------------------- SELECT * FROM [データベー名].[dbo].[テーブル値関数名] () を実行するとエラーが発生します -------------------------------------------------------------------- メッセージ 557、レベル 16、状態 2、行 1 関数内から実行できるのは関数と拡張ストアド プロシージャだけです。 -------------------------------------------------------------------- 実際に行いたい事は… DBサーバーが2台あり、リンクサーバーをします。 (リンクサーバー1、リンクサーバー2) テーブル構成などは全て同じで、異なるデータがあります。 このデータをまとめてみるテーブルが必要です。 当初下記のようなビューを予定しておりました。 select コードA from [リンクサーバー1].[データベース名].[dbo].[テーブルA] union all select コードA from [リンクサーバー2].[データベース名].[dbo].[テーブルA] しかしこれではデータベースが増加する度にビューを修正しないといけないので テーブル値関数を使用したいと考えております。 データベース構成テーブルを作成し、このテーブルをLOOPしながらSQLを組み立てようと考えております。 from句の[リンクサーバー名]が可変なのでsp_executesqlを使用したいなと考えておりました。 ・sp_executesqlを使用してうまくいく方法 ・sp_executesqlを使用しなくてもうまくいく方法 などありましたら宜しくお願い致します。 | ||||
|
投稿日時: 2008-08-13 15:21
SQL文字列の中に変数名を書いても認識されないっすよね。 このケースでは、sp_executesql実行時において、@GetAAAって何?って状況と思われます。 しかし、DBオブジェクトはもちろん認識されるので、 CREATE TABLE #GetAAA (CODE nvarchar() DECLARE @sqlRet NVARCHAR(MAX) SET @sqlRet = 'INSERT INTO #GetAAA SELECT [CODE] FROM [データベース名].[dbo].[テーブル名]' EXEC sp_executesql @sqlRet INSERT INTO @GetAAA SELECT [CODE] FROM #GetAAA 例えばこのように一時テーブルを介してあげるとよろしのではないでしょうか。 ----追記----- ごめんなさい。 関数内からは、一時テーブルにアクセスできないようです。 [ メッセージ編集済み 編集者: かめたろ 編集日時 2008-08-13 15:29 ] | ||||
|
投稿日時: 2008-08-13 16:52
これくらいしかないかな。。他にあれば私も知りたいです。 でも修正するビューが多ければ大変ですね。 ごみレスすみません。 | ||||
|
投稿日時: 2008-08-18 20:19
回答ありがとうございました。
エラーの理由が理解できたので勉強になりました。 あきらめてビューを作成します。 |
1