sql-server - sp_describe_first_result_set 在 REVERT 时失败

标签 sql-server t-sql

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/

相关文章:

sql - 如何仅选择列中有数字的记录(SQL)

sql-server - 从 SQL Server 到 PostgreSQL 的数据传输

sql - SQL 查询获取具有列最大值的表的行详细信息

sql - T-SQL Order by 不适用于 MSSQL 中的 Cast

sql - 将日期范围拆分为月份

sql-server - 在 SQL 中聚合通用列

sql - t-sql使用内连接更新多行

SQL Server 在主表中加入两个没有重复的表

sql - 如何在 SQL Server 上的 CASE 中使用 "IN"?

.net - 跟踪对数据库行的更改 (SQL Server)