SQL Code

For SQL Server 2017 and above: If you place the query into a string then you can get the result set data types like so:

-- Database Parameter and Query Declaration
USE AdventureWorks2022;
DECLARE @query nvarchar(max) = 'SELECT * FROM Production.vProductAndDescription';
DECLARE @DataVersePrefix varchar(10) = 'crpdp';

-- Create Temp Table for SP_Describe_First_Result_Set
IF OBJECT_ID('tempdb..#ResultSet', 'U') IS NOT NULL DROP TABLE #ResultSet;
CREATE TABLE #ResultSet (
    [is_hidden] bit NOT NULL,
    [column_ordinal] int NOT NULL,
    [name] sysname NULL,
    [is_nullable] bit NOT NULL,
    [system_type_id] int NOT NULL,
    [system_type_name] nvarchar(256) NULL,
    [max_length] smallint NOT NULL,
    [precision] tinyint NOT NULL,
    [scale] tinyint NOT NULL,
    [collation_name] sysname NULL,
    [user_type_id] int NULL,
    [user_type_database] sysname NULL,
    [user_type_schema] sysname NULL,
    [user_type_name] sysname NULL,
    [assembly_qualified_type_name] nvarchar(4000) NULL,
    [xml_collection_id] int NULL,
    [xml_collection_database] sysname NULL,
    [xml_collection_schema] sysname NULL,
    [xml_collection_name] sysname NULL,
    [is_xml_document] bit NOT NULL,
    [is_case_sensitive] bit NOT NULL,
    [is_fixed_length_clr_type] bit NOT NULL,
    [source_server] sysname NULL,
    [source_database] sysname NULL,
    [source_schema] sysname NULL,
    [source_table] sysname NULL,
    [source_column] sysname NULL,
    [is_identity_column] bit NULL,
    [is_part_of_unique_key] bit NULL,
    [is_updateable] bit NULL,
    [is_computed_column] bit NULL,
    [is_sparse_column_set] bit NULL,
    [ordinal_in_order_by_list] smallint NULL,
    [order_by_list_length] smallint NULL,
    [order_by_is_descending] smallint NULL,
    [tds_type_id] int NOT NULL,
    [tds_length] int NOT NULL,
    [tds_collation_id] int NULL,
    [tds_collation_sort_id] tinyint NULL
);
 
-- Run the query and insert the result into the temp table
INSERT INTO #ResultSet
EXEC sp_describe_first_result_set @query, null, 0;
 
-- Return the results in a format that can be used for Extract Transform Load development
SELECT  CASE WHEN R.[column_ordinal]<>MC.MaxCol THEN CONCAT('[',R.[name],'],') ELSE CONCAT('[',R.[name],']') END as Column_MSSQL,
        CASE WHEN R.[column_ordinal]<>MC.MaxCol THEN CONCAT('"',R.[name],'",') ELSE CONCAT('"',R.[name],'"') END as Column_ORA,
        CASE WHEN R.[column_ordinal]<>MC.MaxCol THEN CONCAT('`',R.[name],'`,') ELSE CONCAT('`',R.[name],'`') END as Column_MYSQL_Databricks,
        CASE WHEN R.[column_ordinal]<>MC.MaxCol THEN CONCAT('[',@DataVersePrefix,'_',REPLACE(LOWER(R.[name]),' ',''),'],') ELSE CONCAT('[',@DataVersePrefix,'_',REPLACE(LOWER(R.[name]),' ',''),']') END as Column_DataVerse,
 
		-- Microsoft SQL Compatible Create Table
        CASE WHEN R.[column_ordinal]<>MC.MaxCol THEN CONCAT('[',R.[name],'] ',R.[system_type_name],CASE WHEN R.is_nullable=0 THEN '' ELSE ' NOT NULL' END,',') ELSE CONCAT('[',R.[name],'] ',R.[system_type_name],CASE WHEN R.is_nullable=0 THEN '' ELSE ' NOT NULL' END) END as CreateTable_MSSQL,
		
		-- Oracle SQL Compatible Create Table
		CASE WHEN R.[column_ordinal]<>MC.MaxCol THEN CONCAT('"',R.[name],'" ',R.[system_type_name],CASE WHEN R.is_nullable=0 THEN '' ELSE ' NOT NULL' END,',') ELSE CONCAT('"',R.[name],'" ',R.[system_type_name],CASE WHEN R.is_nullable=0 THEN '' ELSE ' NOT NULL' END) END as CreateTable_ORA,
		
		-- MySQL Compatible Create Table
		CASE WHEN R.[column_ordinal]<>MC.MaxCol THEN CONCAT('`',R.[name],'` ',R.[system_type_name],CASE WHEN R.is_nullable=0 THEN '' ELSE ' NOT NULL' END,',') ELSE CONCAT('`',R.[name],'` ',R.[system_type_name],CASE WHEN R.is_nullable=0 THEN '' ELSE ' NOT NULL' END) END as CreateTable_MYSQL,
		
		-- Databricks Compatible Create Table
		CASE WHEN R.[column_ordinal]<>MC.MaxCol THEN CONCAT('`',R.[name],'` ',
			CASE	WHEN LEFT(R.[system_type_name],8) = 'nvarchar' THEN REPLACE(R.[system_type_name],'nvarchar','varchar')
					WHEN LEFT(R.[system_type_name],5) = 'nchar' THEN REPLACE(R.[system_type_name],'nchar','varchar')
					WHEN LEFT(R.[system_type_name],8) = 'datetime' THEN 'timestamp'
					WHEN LEFT(R.[system_type_name],4) = 'char' AND LEFT(R.[system_type_name],7) NOT IN ('nvarcha','varchar') THEN REPLACE(R.[system_type_name],'char','varchar')
					ELSE R.[system_type_name]
			END,
			CASE WHEN R.is_nullable=0 THEN '' ELSE ' NOT NULL' END,',') ELSE CONCAT('`',R.[name],'` ',
				CASE	WHEN LEFT(R.[system_type_name],8) = 'nvarchar' THEN REPLACE(R.[system_type_name],'nvarchar','varchar')
						WHEN LEFT(R.[system_type_name],5) = 'nchar' THEN REPLACE(R.[system_type_name],'nchar','varchar')
						WHEN LEFT(R.[system_type_name],8) = 'datetime' THEN 'timestamp'
						WHEN LEFT(R.[system_type_name],4) = 'char' AND LEFT(R.[system_type_name],7) NOT IN ('nvarcha','varchar') THEN REPLACE(R.[system_type_name],'char','varchar')
						ELSE R.[system_type_name]
				END
			,CASE WHEN R.is_nullable=0 THEN '' ELSE ' NOT NULL' END) END as CreateTable_Databricks

FROM #ResultSet R
CROSS JOIN (SELECT MAX([column_ordinal]) MaxCol FROM #ResultSet) MC
ORDER BY [column_ordinal] ASC;

SELECT	STRING_AGG(CONCAT('[',[name],']'),',') as [MSSQL_SingleLine_Select],
		STRING_AGG(CONCAT('"',[name],'"'),',') as [ORA_SingleLine_Select],
		STRING_AGG(CONCAT('`',[name],'`'),',') as [MYSQL_Databricks_SingleLine_Select]
FROM #ResultSet;

Source

https://stackoverflow.com/questions/1601727/how-do-i-return-the-sql-data-types-from-my-query

https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-describe-first-result-set-transact-sql?view=sql-server-ver15




  • No labels