SQL関数内から一時テーブルにアクセスすることはできません。基本的にテーブル変数を使用する必要があります:
ALTER FUNCTION FnGetCompanyIdWithCategories()
RETURNS @rtnTable TABLE
(
-- columns returned by the function
ID UNIQUEIDENTIFIER NOT NULL,
Name nvarchar(255) NOT NULL
)
AS
BEGIN
DECLARE @TempTable table (id uniqueidentifier, name nvarchar(255)....)
insert into @myTable
select from your stuff
--This select returns data
insert into @rtnTable
SELECT ID, name FROM @mytable
return
END
編集
この質問へのコメントに基づいて、ここに私の推薦があります。プロシージャまたはテーブル値関数の結果を別のクエリに結合したいとします。私はあなたがそれをすることができる方法をあなたに示します、そしてあなたはあなたが好むものを選びます。スキーマの1つからのサンプルコードを使用しますが、それを適応させることができるはずです。どちらも、最初にストアドプロシージャを使用する実行可能なソリューションです。
declare @table as table (id int, name nvarchar(50),templateid int,account nvarchar(50))
insert into @table
execute industry_getall
select *
from @table
inner join [user]
on account=[user].loginname
この場合、プロシージャの結果を格納するために、一時テーブルまたはテーブル変数を宣言する必要があります。次に、UDFを使用している場合にこれを行う方法を見てみましょう
select *
from fn_Industry_GetAll()
inner join [user]
on account=[user].loginname
ご覧のとおり、UDFははるかに簡潔で読みやすく、セカンダリ一時テーブルを使用していないため、おそらくパフォーマンスが少し向上します(パフォーマンスは私の側では完全に推測されます)。
他の多くの場所で関数/プロシージャを再利用する場合は、UDFが最良の選択だと思います。唯一の問題は、#Tempテーブルの使用を停止し、テーブル変数を使用する必要があることです。一時テーブルにインデックスを付ける場合を除いて、問題は発生しないはずです。テーブル変数はメモリに保持されるため、tempDbの使用量は少なくなります。