tsql returning a table from a function or store procedure

前端 未结 4 2099
慢半拍i
慢半拍i 2020-11-27 14:15

This is more of a syntax question I\'m trying to write a store procedure or function that I can embed into a query such as:

select * from MyBigProcOrFunction         


        
4条回答
  •  日久生厌
    2020-11-27 14:43

    You can't access Temporary Tables from within a SQL Function. You will need to use table variables so essentially:

    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
    

    Edit

    Based on comments to this question here is my recommendation. You want to join the results of either a procedure or table-valued function in another query. I will show you how you can do it then you pick the one you prefer. I am going to be using sample code from one of my schemas, but you should be able to adapt it. Both are viable solutions first with a stored procedure.

    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
    

    In this case, you have to declare a temporary table or table variable to store the results of the procedure. Now Let's look at how you would do this if you were using a UDF

    select *
    from fn_Industry_GetAll()
    inner join [user] 
        on account=[user].loginname
    

    As you can see the UDF is a lot more concise easier to read, and probably performs a little bit better since you're not using the secondary temporary table (performance is a complete guess on my part).

    If you're going to be reusing your function/procedure in lots of other places, I think the UDF is your best choice. The only catch is you will have to stop using #Temp tables and use table variables. Unless you're indexing your temp table, there should be no issue, and you will be using the tempDb less since table variables are kept in memory.

提交回复
热议问题