La respuesta principal es generalmente la mejor, pero no funciona para funciones con valores de tabla en línea.
MikeTeeVee dio una solución para esto en su comentario sobre la respuesta principal, pero requirió el uso de una función agregada como MAX, que no funcionó bien para mi circunstancia.
Me equivoqué con una solución alternativa para el caso en el que necesita una tabla en línea con valor udf que devuelve algo como select * en lugar de un agregado. A continuación se muestra un código de muestra para resolver este caso en particular. Como alguien ya ha señalado ... "JEEZ wotta hack" :) ¡ Agradezco cualquier solución mejor para este caso!
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