пользовательская функция sql - PullRequest
2 голосов
/ 17 июня 2010

для функции table valued в sql, почему мы не можем написать операторы sql внутри тегов begin и end наподобие -

create function dbo.emptable()
returns Table
as
BEGIN --it throws an error
return (select id, name, salary from employee)
END
go

в функции scalar valued мы можем использовать такие теги как

create function dbo.countemp()
returns int
as
begin
return (select count(*) from employee)
end
go

есть ли какое-то конкретное правило, в котором мы должны использовать BEGIN & END теги

Ответы [ 2 ]

0 голосов
/ 17 июня 2010

Многозначная табличная функция несколько сложнее, чем другие два типа функций, потому что она использует несколько операторов для построения таблицы, возвращаемой в вызывающий оператор.В отличие от встроенной табличной функции, табличная переменная должна быть явно объявлена ​​и определена.В следующем примере показано, как реализовать табличную функцию с несколькими выражениями, которая заполняет и возвращает табличную переменную.

USE Northwind
go
CREATE FUNCTION fx_OrdersByDateRangeAndCount
( @OrderDateStart smalldatetime, 
  @OrderDateEnd smalldatetime, 
  @OrderCount smallint )
RETURNS @OrdersByDateRange TABLE
  (  CustomerID nchar(5),
     CompanyName nvarchar(40),
     OrderCount smallint,
     Ranking char(1) )
AS
BEGIN
// statements that does some processing ....

END

Исходя из вышесказанного, я думаю, BEGIN и END обозначаютнамерение / использование нескольких операторов и, следовательно, требует определения табличной переменной, как показано в приведенном выше коде.

из http://www.sqlteam.com/article/intro-to-user-defined-functions-updated

0 голосов
/ 17 июня 2010

В INFINE TVF (как ваш первый пример) BEGIN и END будут пытаться заставить его быть процедурным кодом, и поэтому он больше не будет Inline TVF. Скалярные функции доступны только в процедурной форме (что паршиво). Поэтому в текущих версиях SQL Server следует избегать скалярных функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...