Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

tsql zwraca tabelę z funkcji lub procedury magazynu

Nie można uzyskać dostępu do tabel tymczasowych z poziomu funkcji SQL. Będziesz musiał użyć zmiennych tabeli, więc zasadniczo:

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

Edytuj

Na podstawie komentarzy do tego pytania tutaj jest moja rekomendacja. Chcesz połączyć wyniki procedury lub funkcji z wartościami przechowywanymi w tabeli w innym zapytaniu. Pokażę Ci, jak możesz to zrobić, a następnie wybierz ten, który wolisz. Będę używał przykładowego kodu z jednego z moich schematów, ale powinieneś być w stanie go dostosować. Oba są opłacalnymi rozwiązaniami najpierw z procedurą składowaną.

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

W takim przypadku musisz zadeklarować tymczasową tabelę lub zmienną tabeli do przechowywania wyników procedury. Teraz spójrzmy, jak byś to zrobił, gdybyś używał UDF

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

Jak widać, UDF jest o wiele bardziej zwięzły, łatwiejszy do odczytania i prawdopodobnie działa trochę lepiej, ponieważ nie używasz pomocniczej tabeli tymczasowej (wydajność jest z mojej strony całkowitym przypuszczeniem).

Jeśli zamierzasz ponownie wykorzystać swoją funkcję/procedurę w wielu innych miejscach, myślę, że UDF jest najlepszym wyborem. Jedynym haczykiem jest to, że będziesz musiał przestać używać tabel #Temp i używać zmiennych tabel. O ile nie indeksujesz tabeli tymczasowej, nie powinno być problemu i będziesz używać mniej danych tempDb, ponieważ zmienne tabeli są przechowywane w pamięci.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaki jest prawidłowy typ SQL do przechowywania .Net Timespan z wartościami> 24:00:00?

  2. Nie można rozpocząć transakcji rozproszonej

  3. Zwracanie procedur i funkcji składowanych w bazie danych programu SQL Server:PROCEDURY (przykłady T-SQL)

  4. Jak używać sortowania UTF-8 w bazie danych SQL Server?

  5. Utwórz profil poczty bazy danych (SSMS)