【问题标题】:TSQLT Asserting stored procedure column namesTSQLT 断言存储过程列名
【发布时间】:2020-12-10 19:17:16
【问题描述】:

有没有办法让 tsqlt 断言从存储过程返回的所有列都具有特定的列名?我需要检查 Employee_lname 列是否实际返回为 'Employee_lname' 而不是(无列名)

【问题讨论】:

    标签: sql sql-server database tsqlt


    【解决方案1】:

    您可以尝试使用这些 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;
    

    你会看到它只输出一个空白行。

    【讨论】:

      【解决方案2】:

      看看这个:

      tSQLt.AssertResultSetsHaveSameMetaData [@expectedCommand = ] 'expected command'
                                           , [@actualCommand = ] 'actual command'
      

      (documentation)

      我相信这提供了您正在寻找的东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多