Tại sao tôi không thể gọi UDF trực tiếp? Tại sao tôi cần phải đủ điều kiện sâu 3 cấp?


7

Tôi vừa tạo một UDF và thử nghiệm nó tôi thấy chỉ hoạt động khi tôi sử dụng cú pháp này

SELECT [PMIS].[dbo].[fnIsReportingTo] (50,1132)

Tôi đã mong đợi nó hoạt động như thế này:

select * from fnIsReportingTo (50,1132)

hoặc là

select fnIsReportingTo (50,1132)

đây là SQL tạo của tôi:

create function fnIsReportingTo
(
@BossID int,
@EmployeeID int)
RETURNs bit
AS
begin
declare @ret bit
    if exists (select * from dbo.fnGetEmployeeHierarchy(@BossID) where employeeID=@employeeID)
        select @ret=1
    else
        select @ret=0
return @ret
end

Câu trả lời:


8

UDFS vô hướng phải đủ điều kiện với lược đồ. Bạn không cần phần cơ sở dữ liệu của tên đủ điều kiện trừ khi nó nằm trong cơ sở dữ liệu khác.

SELECT [dbo].[fnIsReportingTo] (50,1132)

Trong mệnh đề TỪ, bạn chỉ có thể sử dụng các hàm có giá trị trong bảng

Xem "Các loại chức năng" trong MSDN

Chỉnh sửa: Như một quan sát, tôi có xu hướng tránh:

  • UDF lồng nhau này
  • sử dụng tra cứu bảng trong UDF vô hướng

nếu bạn sử dụng hàm này cho mỗi hàng của một bảng khác, bạn có một con trỏ lặp qua bảng trong UDF cho mỗi hàng ngoài

Thậm chí điều này là tốt hơn. Bây giờ bảng có giá trị và mở rộng như một khung nhìn.

create function fnIsReportingTo (
    @BossID int,
    @EmployeeID int)
RETURNs table
AS
return (
      select CAST(COUNT(*) AS bit) AS FooBar
      from dbo.fnGetEmployeeHierarchy(@BossID)
     where employeeID=@employeeID)
GO
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.