sp_describe_first_result_set
算法对于我们的 ORM 至关重要,但当它检测到 REVERT
语句时,它无法检索元数据。考虑这个片段:
CREATE OR ALTER PROCEDURE spTest
WITH EXECUTE AS OWNER
AS
BEGIN
DECLARE @name sysname;
EXECUTE AS CALLER;
SELECT @name = USER_NAME();
REVERT;
SELECT 'Hello ' + @name AS Msg;
END
GO
EXEC sp_describe_first_result_set N'EXEC spTest', NULL, 0
sp_describe_first_result_set
失败并显示以下错误消息:
The metadata could not be determined because statement 'REVERT;' in procedure 'spTest' does not support metadata discovery.
我理解用户上下文切换在某些情况下会如何创建不明确的结果,但在这里我非常小心,不要导致不明确的结果集,但这根本没有帮助。注释掉REVERT
语句实际上解决了元数据问题,尽管EXECUTE AS
——这对我来说似乎相当倒退?
上面的过程spTest
显然只是为了演示这个问题,但一般模式是我经常在我的过程中使用的东西,这会破坏元数据。有没有解决的办法?是否有技巧或任何其他方式可以在不使用 REVERT
语句的情况下访问调用者数据库主体?
最佳答案
您可以使用 REVERT 将代码下推到单独的过程中,并使用WITH RESULT SETS 在包装器过程中调用它,例如
CREATE OR ALTER PROCEDURE spTest_impl
WITH EXECUTE AS OWNER
AS
BEGIN
DECLARE @name sysname;
EXECUTE AS CALLER;
SELECT @name = USER_NAME();
REVERT;
SELECT 'Hello ' + @name AS Msg;
END
GO
create or alter procedure spTest
as
begin
exec spTest_impl
with result sets
(
(
Msg nvarchar(200)
)
);
end
go
EXEC sp_describe_first_result_set N'EXEC spTest', NULL, 0
关于sql-server - sp_describe_first_result_set 在 REVERT 时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77533299/