Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
This article is about the system function sys.dm_exec_describe_first_result_set that can be used to check the syntax of dynamic SQL before execution. This system function, sys.dm_exec_describe_first_result_set, was introduced in SQL Server 2012.
Create sample table and insert sample data:
CREATE Table Test (Id INT NOT NULL Primary Key,Name VARCHAR(100))
INSERT Test SELECT 1 , 'Sathya'
GO
Create sample stored procedure:
CREATE PROC TestProc
AS
BEGIN
DECLARE @SQL NVARCHAR(MAX) = 'SELECT *, FROM Test'
IF EXISTS (
SELECT 1 FROM sys.dm_exec_describe_first_result_set(@SQL, NULL, 0)
WHERE error_message IS NOT NULL
AND error_number IS NOT NULL
AND error_severity IS NOT NULL
AND error_state IS NOT NULL
AND error_type IS NOT NULL
AND error_type_desc IS NOT NULL )
BEGIN
SELECT error_message
FROM sys.dm_exec_describe_first_result_set(@SQL, NULL, 0)
WHERE column_ordinal = 0
END
ELSE
BEGIN
EXEC (@SQL)
END
END
GO
If you examine the dynamic SQL in the above stored procedure, you will notice incorrect syntax in that query with an extra comma before FROM clause.
To execute the stored procedure:
EXEC TestProc
GO
After removing the comma before the FROM clause in the @SQL variable, alter the stored procedure.
ALTER PROC TestProc
AS
BEGIN
DECLARE @SQL NVARCHAR(MAX) = 'SELECT * FROM Test'
IF EXISTS(
SELECT 1 FROM sys.dm_exec_describe_first_result_set(@SQL, NULL, 0)
WHERE error_message IS NOT NULL
AND error_number IS NOT NULL
AND error_severity IS NOT NULL
AND error_state IS NOT NULL
AND error_type IS NOT NULL
AND error_type_desc IS NOT NULL )
BEGIN
SELECT error_message
FROM sys.dm_exec_describe_first_result_set(@SQL, NULL, 0)
WHERE column_ordinal = 0
END
ELSE
BEGIN
EXEC (@SQL)
END
END
To execute the stored procedure:
EXEC TestProc
GO