sql - TSQLT 断言存储过程列名
问题描述
tsqlt 有没有办法断言从存储过程返回的所有列都具有特定的列名?我需要检查 Employee_lname 列是否实际上返回为 'Employee_lname' 而不是(没有列名)
解决方案
您可以尝试使用这些 DMV 之一。它们旨在以表格形式输出查询/对象返回的第一个结果集的描述。
USE TargetDatabase
GO
SELECT *
FROM sys.dm_exec_describe_first_result_set_for_object(@Object_ID_Of_Proc, 0) o
SELECT *
FROM sys.dm_exec_describe_first_result_set('EXEC usp_NameOfProcYouAreTesting', NULL, 0)
文档:
应该注意的是,如果您有动态输出,例如通过使用IF/THEN/ELSE
或使用动态 SQL,这将不适合您。这些 DMV 实际上并不运行查询和解析输出。
动态输出示例:
CREATE PROCEDURE #usp_dynamic_output
AS
IF (RAND() > 0.5)
SELECT Col1 = 1, Col2 = 2
ELSE
SELECT Col3 = 3
GO
SELECT *
FROM sys.dm_exec_describe_first_result_set('EXEC #usp_dynamic_output', NULL, 0)
GO
DROP PROCEDURE #usp_dynamic_output;
你会看到它只输出一个空白行。
推荐阅读
- windows-10 - 强制 Windows 显示未签名应用程序的“未知发布者”警告
- javascript - D3.js 寻找隐藏选择性分层元素的有效方法
- python - 极高的损失和一致的验证准确性
- c# - 为什么我的网络表单直到 OnSaveStateComplete 才检测到我的列表框的内容?我怎样才能更早地检测到它们?
- dask - dask-gateway (helm 部署):如何配置自定义身份验证器?
- javascript - 如何实现可调整大小和自动隐藏侧边菜单
- nfc - ACR122U NFC 读卡器在卡为只读时无法正确读取 ISO14443 卡
- c++ - 如果分隔符是输入范围的最后一个元素,为什么 views::split 会忽略分隔符后的空子范围?
- html - 如何在页面上的其他内容下正确定位 HTML 元素?
- informatica - Informatica Cloud 中的文件侦听器