Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Кога бихте използвали функция с таблично значение?

Функциите с таблично значение са "просто" параметризирани изгледи. Това ги прави изключително мощни за капсулиране на логика, която иначе би била скрита зад непрозрачна съхранена процедура. Ето един пример:

Вградена функция със стойност на таблица:

create function dbo.GetClients (
    @clientName nvarchar(max) = null
)
returns table
return (
    select *
    from dbo.Clients as a
    where ((a.ClientName = @clientName) or a.ClientName is null)
);

Запазена процедура:

create procedure dbo.usp_GetClients (
    @clientName nvarchar(max) = null
)
as
begin;
    select *
    from dbo.Clients as a
    where ((a.ClientName = @clientName) or a.ClientName is null)
end;

За разлика от извикването на съхранената процедура, функцията с таблица с стойност ми позволява да съставя логиката от dbo.GetClients с други обекти:

select *
from dbo.GetClients(N'ACME') as a
join ... as b
    on a.ClientId = b.ClientId

В такива ситуации не мога да си представя да използвам съхранена процедура поради това колко ограничаваща е тя в сравнение с функцията с таблично стойност. Ще бъда принуден да маршализирам данните около себе си, като използвам временна таблица, променлива на таблица или слой на приложението, за да комбинирам резултатите от множество обекти.

Вградените функции с таблично стойности са особено страхотни поради "вградения" бит, който вероятно е най-добре обяснен тук. Това позволява на оптимизатора да третира такива функции не по-различно от обектите, които капсулират, което води до почти оптимални планове за производителност (ако приемем, че вашите индекси и статистически данни са идеални).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Кой е най-добрият начин за контрол на версиите на моите съхранени процедури на SQL сървър?

  2. Случаен запис от таблица на база данни (T-SQL)

  3. Как да активирате ограничение CHECK в SQL Server (пример за T-SQL)

  4. Използване на SolarWinds Serv-U на Linux с база данни за удостоверяване на SQL Server

  5. алтернативи на REPLACE на текстов или ntext тип данни