Câu trả lời hàng đầu nói chung là tốt nhất, nhưng không hoạt động đối với các hàm có giá trị trong bảng nội tuyến.
MikeTeeVee đã đưa ra một giải pháp cho điều này trong nhận xét của mình về câu trả lời hàng đầu, nhưng nó yêu cầu sử dụng một hàm tổng hợp như MAX, không hoạt động tốt cho hoàn cảnh của tôi.
Tôi đã loay hoay với một giải pháp thay thế cho trường hợp bạn cần một bảng nội tuyến có giá trị udf trả về một cái gì đó như select * thay vì tổng hợp. Mã mẫu giải quyết trường hợp cụ thể này là dưới đây. Như ai đó đã chỉ ra ... "JEEZ wotta hack" :) Tôi hoan nghênh mọi giải pháp tốt hơn cho trường hợp này!
create table foo (
ID nvarchar(255),
Data nvarchar(255)
)
go
insert into foo (ID, Data) values ('Green Eggs', 'Ham')
go
create function dbo.GetFoo(@aID nvarchar(255)) returns table as return (
select *, 0 as CausesError from foo where ID = @aID
--error checking code is embedded within this union
--when the ID exists, this second selection is empty due to where clause at end
--when ID doesn't exist, invalid cast with case statement conditionally causes an error
--case statement is very hack-y, but this was the only way I could get the code to compile
--for an inline TVF
--simpler approaches were caught at compile time by SQL Server
union
select top 1 *, case
when ((select top 1 ID from foo where ID = @aID) = @aID) then 0
else 'Error in GetFoo() - ID "' + IsNull(@aID, 'null') + '" does not exist'
end
from foo where (not exists (select ID from foo where ID = @aID))
)
go
--this does not cause an error
select * from dbo.GetFoo('Green Eggs')
go
--this does cause an error
select * from dbo.GetFoo('Yellow Eggs')
go
drop function dbo.GetFoo
go
drop table foo
go