sql >> データベース >  >> RDS >> Sqlserver

関数またはストアドプロシージャからテーブルを返すtsql

    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の使用量は少なくなります。



    1. 結果セットを閉じた後、Oracleはカーソルを削除しません

    2. SQLServerのLIKEパターンで「単語全体の一致」を検索する

    3. OracleからPostgreSQLへ:PostgreSQLのANSI外部結合構文

    4. PostgreSQLでの並列unnest()とソート順