- PR -

テーブル値関数について

1
投稿者投稿内容
なつ
会議室デビュー日: 2008/08/13
投稿数: 12
投稿日時: 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を使用しなくてもうまくいく方法
などありましたら宜しくお願い致します。
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2008-08-13 15:21
引用:

たかしさんの書き込み (2008-08-13 12:08) より:
 DECLARE @sqlRet NVARCHAR(MAX)
 SET @sqlRet = 'INSERT INTO @GetAAA SELECT [CODE] FROM [データベース名].[dbo].[テーブル名]'
 EXEC sp_executesql @sqlRet


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 ]
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2008-08-13 16:52
引用:

たかしさんの書き込み (2008-08-13 12:08) より:
データベースが増加する度にビューを修正



これくらいしかないかな。。他にあれば私も知りたいです。
でも修正するビューが多ければ大変ですね。
ごみレスすみません。
なつ
会議室デビュー日: 2008/08/13
投稿数: 12
投稿日時: 2008-08-18 20:19
回答ありがとうございました。
エラーの理由が理解できたので勉強になりました。
あきらめてビューを作成します。
1

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