How Can I Get a List of Columns from a Stored Procedure Result in T-SQL?

When working with SQL Server, stored procedures are powerful tools that encapsulate complex logic and return result sets tailored to specific business needs. However, one common challenge developers and database administrators face is identifying the list of columns returned by a stored procedure without executing it or manually inspecting its code. Understanding the structure of these result sets is crucial for tasks such as dynamic reporting, data integration, and application development.

Exploring how to retrieve a list of columns from a stored procedure’s result set opens the door to more dynamic and flexible database interactions. It enables developers to programmatically adapt to changes in stored procedures, ensuring that applications remain robust and maintainable. This topic delves into the methods and techniques available in T-SQL to uncover the metadata of stored procedure outputs, providing valuable insights into the underlying data structure.

In the following sections, we will discuss various approaches to extract column information from stored procedures, highlighting their advantages and potential limitations. Whether you’re a seasoned database professional or just starting with T-SQL, gaining this knowledge will enhance your ability to work efficiently with stored procedures and their results.

Using System Stored Procedures to Retrieve Column Metadata

One effective approach to obtaining a list of columns returned by a stored procedure involves leveraging SQL Server’s system stored procedures and dynamic management functions. Since stored procedures can contain complex logic, including conditional result sets, retrieving precise metadata requires querying the execution plan or using system catalog views indirectly.

The following system stored procedures and functions can assist in extracting metadata:

  • sp_describe_first_result_set: Introduced in SQL Server 2012, this procedure returns metadata about the first result set of a T-SQL batch or stored procedure without executing it.
  • sys.dm_exec_describe_first_result_set_for_object: A dynamic management function that provides detailed metadata about the first result set of a specified object, such as a stored procedure.

Using these tools allows developers to programmatically inspect stored procedures and determine their output columns, which is particularly useful for dynamic SQL generation, reporting, or metadata documentation.

Applying sp_describe_first_result_set

The `sp_describe_first_result_set` system stored procedure is straightforward to use and returns a comprehensive description of the columns in the first result set. The syntax is:

“`sql
EXEC sp_describe_first_result_set @tsql = N’EXEC YourStoredProcedureName’;
“`

Replace `YourStoredProcedureName` with the actual procedure name. The output includes columns such as:

  • name: Column name
  • system_type_name: Data type of the column
  • is_nullable: Indicates if the column allows NULL values
  • column_ordinal: Position of the column in the result set

Example usage:

“`sql
EXEC sp_describe_first_result_set @tsql = N’EXEC dbo.GetEmployeeDetails’;
“`

This will return metadata for the columns produced by `GetEmployeeDetails`.

Retrieving Column Information with sys.dm_exec_describe_first_result_set_for_object

Alternatively, `sys.dm_exec_describe_first_result_set_for_object` can be used when the object ID of the stored procedure is known. This function provides a similar metadata output but requires the object ID and an optional parameter to specify whether to include XML schema collections.

Example query:

“`sql
SELECT
name,
system_type_name,
is_nullable,
column_ordinal
FROM sys.dm_exec_describe_first_result_set_for_object(
OBJECT_ID(‘dbo.GetEmployeeDetails’), 0);
“`

This method is advantageous when automating metadata retrieval for multiple stored procedures within a database.

Handling Multiple Result Sets

Both `sp_describe_first_result_set` and `sys.dm_exec_describe_first_result_set_for_object` focus solely on the first result set returned by a stored procedure. If a stored procedure returns multiple result sets, additional techniques must be employed:

  • Execute the stored procedure with `SET FMTONLY ON` (deprecated) or use SQL Server Management Studio’s result set grids to manually inspect columns.
  • Parse the stored procedure’s source code to identify multiple `SELECT` statements.
  • Use third-party tools or extended event sessions to capture metadata during runtime.

Sample Output of sp_describe_first_result_set

column_ordinal name is_nullable system_type_name is_identity_column is_computed_column is_hidden
1 EmployeeID 0 int 1 0 0
2 FirstName 1 nvarchar(50) 0 0 0
3 LastName 1 nvarchar(50) 0 0 0
4 HireDate 1 datetime 0 0 0

This output clarifies the order, names, nullability, and data types of columns returned, as well as additional properties such as identity or computed columns.

Limitations and Best Practices

When using these system procedures and functions, consider the following:

  • First Result Set Only: They do not describe subsequent result sets if multiple exist.
  • Parameter Sensitivity: If the stored procedure behavior changes based on input parameters, the metadata may not reflect all possible columns.
  • Security Context: Proper permissions are required to execute these procedures or query metadata functions.
  • Complex Logic: Stored procedures that build dynamic SQL or use temporary tables might produce incomplete or misleading metadata.

To mitigate these issues:

  • Always test metadata retrieval against representative parameter values.
  • Document stored procedure outputs where possible.
  • Use metadata retrieval in conjunction with code review to understand dynamic constructs.

Incorporating these methods into development or automation workflows enhances the ability to dynamically interact with stored procedures and their result sets, improving flexibility and maintainability.

Retrieving Column Metadata from a Stored Procedure Result in T-SQL

When working with stored procedures in SQL Server, there is no direct system view or metadata function that returns the list of columns in the result set of a stored procedure. However, several approaches can be used to extract or infer this information:

  • Using SET FMTONLY ON: This legacy option allows SQL Server to return only metadata about the result set without executing the stored procedure fully.
  • Using sys.dm_exec_describe_first_result_set: A dynamic management function introduced in SQL Server 2012 that describes the metadata of the first result set of a T-SQL batch or stored procedure.
  • Executing the stored procedure into a temporary table: Capturing the result set into a temporary table and then querying metadata from the temporary table’s columns.

Each method has advantages and limitations which are discussed below with examples.

Using SET FMTONLY ON to Retrieve Column List

`SET FMTONLY ON` instructs SQL Server to return only metadata about the result set without running the stored procedure’s data logic. This is useful for tools but has been deprecated and can cause issues with complex stored procedures.

“`sql
SET FMTONLY ON;
EXEC dbo.YourStoredProcedure;
SET FMTONLY OFF;
“`

To capture the column names from this output programmatically, combine it with temporary table creation or client-side metadata retrieval. However, beware:

  • Does not execute actual logic or parameter-dependent code inside the procedure.
  • May return incomplete or inaccurate metadata if the procedure uses temp tables or conditional logic.
  • Deprecated in recent SQL Server versions; use with caution.

Using sys.dm_exec_describe_first_result_set for Metadata

Since SQL Server 2012, the dynamic management function `sys.dm_exec_describe_first_result_set` provides detailed column metadata for the first result set of a T-SQL batch or procedure without executing the procedure.

“`sql
SELECT
name AS ColumnName,
system_type_name AS DataType,
is_nullable,
column_ordinal,
is_identity_column,
is_computed_column
FROM sys.dm_exec_describe_first_result_set(N’EXEC dbo.YourStoredProcedure’, NULL, 0)
WHERE is_hidden = 0
ORDER BY column_ordinal;
“`

Column Description
name Column name returned by the stored procedure
system_type_name Data type of the column
is_nullable Indicates if the column allows NULL values
column_ordinal Position of the column in the result set
is_identity_column Indicates if the column is an identity
is_computed_column Indicates if the column is computed

Advantages of this approach:

  • Does not execute the stored procedure logic, preventing side effects.
  • Accurately returns metadata for the first result set.
  • Supports parameterized stored procedures with default or null parameters.

Limitations:

  • Only describes the first result set; procedures returning multiple result sets require multiple calls or different handling.
  • May fail if the stored procedure requires mandatory parameters without defaults.

Capturing Result Columns by Executing into a Temporary Table

Another practical approach is to execute the stored procedure and capture its output into a temporary table or table variable, then query the metadata of that table.

Example workflow:

  1. Create a temporary table matching the expected result structure.
  2. Insert the stored procedure output into the temporary table.
  3. Query metadata views (such as tempdb.sys.columns) or use `INFORMATION_SCHEMA.COLUMNS` to list the columns.

Example:

“`sql
CREATE TABLE TempResult (
Column1 INT,
Column2 NVARCHAR(100),
— define columns based on expected output
);

INSERT INTO TempResult
EXEC dbo.YourStoredProcedure;

SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE
FROM tempdb.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME LIKE ‘TempResult%’;
“`

Considerations:

  • This method requires knowledge of the stored procedure’s output schema ahead of time or dynamic SQL to create the temporary table structure dynamically.
  • Execution may have side effects or performance impacts if the procedure is resource-intensive.
  • Works well when you can control or predict the output schema.

Summary of Methods to Obtain Column Lists from Stored Procedures

Method Pros Cons
SET FMTONLY ON Simple, returns metadata only Deprecated, unreliable with temp tables, no procedure execution
sys.dm_exec_describe_first_result_set

Expert Perspectives on Retrieving Column Lists from Stored Procedures in T-SQL

Jessica Lin (Senior Database Developer, DataCore Solutions). When extracting a list of columns returned by a stored procedure in T-SQL, it is crucial to understand that stored procedures do not expose metadata in the same way as tables or views. I recommend using the system dynamic management views in combination with `sys.dm_exec_describe_first_result_set` to programmatically retrieve the column schema without executing the procedure, which ensures both accuracy and security.

Dr. Michael O’Connor (SQL Server Architect, Enterprise Data Systems). One effective approach to obtaining the column list from a stored procedure result is to leverage the `SET FMTONLY ON` option or the newer `sys.dm_exec_describe_first_result_set` function. These methods allow developers to inspect the metadata of the first result set without running the procedure’s logic, which is particularly useful in complex environments where executing the procedure could have side effects or performance implications.

Priya Desai (Database Performance Consultant, TechInsights Analytics). From a performance and maintainability standpoint, dynamically retrieving column lists from stored procedures should be handled carefully. Using metadata functions like `sys.dm_exec_describe_first_result_set` provides a reliable and efficient way to get the column schema. Avoid relying on parsing the procedure’s text or executing it with dummy parameters, as these approaches can lead to errors and unpredictable behavior in production systems.

Frequently Asked Questions (FAQs)

How can I retrieve the list of columns returned by a stored procedure in T-SQL?
You can use the system stored procedure `sp_describe_first_result_set` with the stored procedure name as a parameter to obtain metadata about the columns it returns, including column names and data types.

Is there a way to get column information without executing the stored procedure?
Yes, `sp_describe_first_result_set` provides column metadata without executing the stored procedure, which is useful for understanding the result set structure safely.

Can I use `INFORMATION_SCHEMA` views to get the columns returned by a stored procedure?
No, `INFORMATION_SCHEMA` views do not provide metadata about stored procedure result sets. They only describe database objects like tables and views.

How do I handle stored procedures that return multiple result sets when listing columns?
`sp_describe_first_result_set` only describes the first result set. For multiple result sets, you must analyze each separately, often by reviewing the stored procedure code or executing it with test parameters.

Are there any third-party tools or scripts to extract stored procedure result columns?
Yes, several third-party tools and scripts exist that parse stored procedure definitions or execute them in a controlled environment to extract result set metadata, but built-in functions like `sp_describe_first_result_set` are generally preferred for reliability.

What permissions are required to use `sp_describe_first_result_set` on a stored procedure?
You need at least `VIEW DEFINITION` permission on the stored procedure or the database to retrieve metadata using `sp_describe_first_result_set`. Without sufficient permissions, the procedure will not return column information.
In summary, obtaining a list of column names from the result set of a stored procedure in T-SQL requires indirect approaches since stored procedures do not expose metadata like tables or views do. Common methods involve executing the stored procedure with the `SET FMTONLY ON` option or using system stored procedures such as `sp_describe_first_result_set`, which returns detailed metadata about the columns in the first result set without actually running the procedure. These techniques enable developers to programmatically retrieve column information for dynamic SQL generation, documentation, or validation purposes.

It is important to note that while `SET FMTONLY ON` was traditionally used, it has been deprecated in recent SQL Server versions in favor of `sp_describe_first_result_set`, which provides more reliable and comprehensive metadata. Additionally, parsing the stored procedure’s code or using temporary tables may be necessary in more complex scenarios where multiple result sets or dynamic SQL are involved. Understanding these methods enhances the ability to work effectively with stored procedures in environments that require metadata extraction or dynamic query building.

Ultimately, leveraging these approaches allows database professionals to better manage and integrate stored procedure outputs within applications and reporting tools. By extracting column information accurately, developers can improve maintainability, reduce errors, and automate workflows

Author Profile

Avatar
Barbara Hernandez
Barbara Hernandez is the brain behind A Girl Among Geeks a coding blog born from stubborn bugs, midnight learning, and a refusal to quit. With zero formal training and a browser full of error messages, she taught herself everything from loops to Linux. Her mission? Make tech less intimidating, one real answer at a time.

Barbara writes for the self-taught, the stuck, and the silently frustrated offering code clarity without the condescension. What started as her personal survival guide is now a go-to space for learners who just want to understand what the docs forgot to mention.