我正面临着一个由SQL Server强制执行的非常烦人的障碍,并希望检查是否有一个优雅的解决方案。
我有一系列程序的调用(意思是,A调用B调用C)。这些过程是由于返回不同的结果集,其中(例如)“A”使用“B”返回的一组记录生成其结果。
现在,SQL Server不允许嵌套INSERT INTO ... EXEC <stored procedure>
,为了应对这个限制,我将最低的过程转换为一个函数,返回一个表,因此返回INSERT INTO ... SELECT * FROM <function call>
。
现在,在某些情况下,由于数据的条件,FUNCTION无法返回结果,我希望函数返回一种表示执行结果的代码(例如0
意味着成功,1
意味着“缺失”输入数据”)。
由于SQL Server不允许使用OUTPUT
参数的函数,我想不出任何传达这两个输出的优雅方式。
谁能提出一个优雅的选择?
在某些情况下,由于数据的条件,FUNCTION无法返回结果,我希望函数返回一种表示执行结果的代码
你真的应该用THROW来表示执行结果,这也排除了使用表值函数。
所以你需要使用存储过程。为了避免对嵌套INSERT .. SELECT的限制,您可以使用临时表将数据传递回调用过程。例如
create or alter procedure foo
as
begin
if object_id('tempdb..#foo_results') is null
begin
print 'create table #foo_results(id int primary key, a int);';
THROW 51000, 'The results table #foo_results does not exist. Before calling this procedure create it. ', 1;
end
insert into #foo_results(id,a)
values (1,1);
end;
任何人都可以建议一个ELEGANT替代品吗?
我不确定任何替代品是否优雅。