diff --git a/artifacts/Lake_Database_Auto_DDL.json.tmpl b/artifacts/Lake_Database_Auto_DDL.json.tmpl index 1236bbf..ffe968a 100644 --- a/artifacts/Lake_Database_Auto_DDL.json.tmpl +++ b/artifacts/Lake_Database_Auto_DDL.json.tmpl @@ -401,7 +401,7 @@ }, "SqlScript": { "type": "String", - "defaultValue": "IF OBJECT_ID('tempdb..#tables') IS NOT NULL DROP TABLE #tables; CREATE TABLE #tables ( SchemaName NVARCHAR(100) , TableName NVARCHAR(100) , FolderPath NVARCHAR(1000) ); INSERT INTO #tables VALUES ( '{SchemaNameStaging}' , '{TableNameStaging}' , '{FolderPathFull}' ); IF OBJECT_ID('tempdb..#CreateViewsDDL') IS NOT NULL DROP TABLE #CreateViewsDDL; CREATE TABLE #CreateViewsDDL ( SchemaName NVARCHAR(100) , ViewName NVARCHAR(100) , ViewDDL NVARCHAR(MAX) ); DECLARE @cnt INT = 1 DECLARE @sqlCreateView NVARCHAR(MAX) DECLARE @SchemaName NVARCHAR(100) DECLARE @TableName NVARCHAR(100) DECLARE @FolderPath NVARCHAR(1000); SELECT @SchemaName = SchemaName , @TableName = TableName , @FolderPath = FolderPath , @sqlCreateView = CONCAT ( 'sp_describe_first_result_set @tsql=N''SELECT * FROM OPENROWSET(BULK ''''' , FolderPath , ''''' , FORMAT=''''PARQUET'''') AS r''' ) FROM #tables; IF OBJECT_ID('tempdb..#InformationSchemaTempTable', 'U') IS NOT NULL DROP TABLE #InformationSchemaTempTable; CREATE TABLE #InformationSchemaTempTable ( 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) , 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 ); INSERT INTO #InformationSchemaTempTable EXEC (@sqlCreateView) /*SELECT * FROM #InformationSchemaTempTable*/ DECLARE @GetMaxValueStatement NVARCHAR(MAX) DECLARE @GetColumnList NVARCHAR(MAX) SELECT @GetMaxValueStatement = CONVERT(NVARCHAR(MAX), CONCAT ( 'SELECT ' , STRING_AGG(ColumnMaxLength, ',') , ' FROM OPENROWSET(BULK ''' , @FolderPath , ''' , FORMAT=''PARQUET'') WITH (' , STRING_AGG(CONVERT(NVARCHAR(MAX), ColumnDatatypeWithMax), ',') , ') AS r' )) , @GetColumnList = STRING_AGG(QUOTENAME([name]), ',') FROM ( SELECT CASE WHEN system_type_name LIKE ('%char%') OR system_type_name = 'varbinary(8000)' THEN CONCAT ( 'CONVERT(BIGINT, COALESCE(NULLIF(MAX(DATALENGTH(' , QUOTENAME([name]) , ')), 0), 1)) AS ' , QUOTENAME([name]) ) ELSE CONCAT ( 'COALESCE(CONVERT(BIGINT, SUM(0)), 0) AS ' , QUOTENAME([name]) ) END AS ColumnMaxLength , CASE WHEN system_type_name LIKE ('%char%') THEN CONCAT ( QUOTENAME([name]) , ' ' , REPLACE(system_type_name, '8000', 'MAX') , ' COLLATE Latin1_General_100_BIN2_UTF8' ) WHEN system_type_name = 'varbinary(8000)' THEN CONCAT ( QUOTENAME([name]) , ' ' , REPLACE(system_type_name, '8000', 'MAX') ) ELSE CONCAT ( QUOTENAME([name]) , ' ' , system_type_name ) END AS ColumnDatatypeWithMax , [name] FROM #InformationSchemaTempTable ) AS a /*SELECT @GetMaxValueStatement*/ /*SELECT @GetColumnList*/ DECLARE @sqlUnpivot NVARCHAR(MAX) SET @sqlUnpivot = CONCAT ( 'SELECT ''' , @TableName , ''' AS TABLE_NAME, unpvt.col AS COLUMN_NAME, CASE WHEN unpvt.datatype > 8000 THEN ''MAX'' ELSE CONVERT(NVARCHAR(100), unpvt.datatype) END AS DATATYPE_MAX FROM ( ' , @GetMaxValueStatement , ' ) AS a ' , CHAR(13) , ' UNPIVOT ( datatype FOR col IN ( ' , @GetColumnList , ') ) AS unpvt' ) DROP TABLE IF EXISTS #tmpBus; CREATE TABLE #tmpBus ( TABLE_CLEAN NVARCHAR(1000) , COLUMN_NAME NVARCHAR(1000) , DATATYPE_MAX NVARCHAR(1000) ); INSERT INTO #tmpBus EXEC (@sqlUnpivot) DROP TABLE IF EXISTS #tmpFinal; CREATE TABLE #tmpFinal ( table_name NVARCHAR(1000) , column_name NVARCHAR(1000) , DataType NVARCHAR(1000) , ColumnFullDefinition NVARCHAR(1000) ); INSERT INTO #tmpFinal SELECT @TableName AS table_name , c.[name] AS column_name , UPPER(TYPE_NAME(c.system_type_id)) AS DataType , CONCAT ( c.[name] , ' ' , CASE WHEN TYPE_NAME(c.system_type_id) IN ('int', 'bigint', 'smallint', 'tinyint', 'bit', 'decimal', 'numeric', 'float', 'real', 'datetime2', 'date') THEN UPPER(c.system_type_name) ELSE CONCAT ( UPPER(TYPE_NAME(c.system_type_id)) , '(' , a.DATATYPE_MAX , ') COLLATE Latin1_General_100_BIN2_UTF8' ) END ) AS ColumnFullDefinition FROM #InformationSchemaTempTable AS c JOIN #tmpBus AS a ON a.COLUMN_NAME = c.[name] ORDER BY column_ordinal OFFSET 0 ROWS; DECLARE @createTableDDL NVARCHAR(MAX) DECLARE @createTableStatsDDL NVARCHAR(MAX) DECLARE @createViewDDL NVARCHAR(MAX) DECLARE @createViewStatsDDL NVARCHAR(MAX) DECLARE @openrowsetValue NVARCHAR(MAX) DECLARE @DataSourceName NVARCHAR(MAX) = ( SELECT CONCAT ( 'ds_' , SUBSTRING(FolderPath, CHARINDEX('//', FolderPath) + 2, (CHARINDEX('.', FolderPath) - 9)) ) FROM #tables ) DECLARE @DataSourceDefinition NVARCHAR(MAX) = ( SELECT SUBSTRING(FolderPath, 0, CHARINDEX('/', REPLACE(FolderPath, '//', '')) + 2) FROM #tables ) DECLARE @DataSourcePath NVARCHAR(MAX) = ( SELECT SUBSTRING(FolderPath, CHARINDEX('/', REPLACE(FolderPath, '//', '')) + 2, LEN(FolderPath)) FROM #tables ) DECLARE @DataSourceCreateDDL NVARCHAR(MAX) = ( SELECT CONCAT ( 'IF NOT EXISTS (SELECT * FROM sys.external_data_sources WHERE name = ''' , @DataSourceName , ''') CREATE EXTERNAL DATA SOURCE [' , @DataSourceName , '] WITH (LOCATION = ''' , @DataSourceDefinition , ''')' , '' ) ) DECLARE @FileFormatCreateDDL NVARCHAR(MAX) = 'IF NOT EXISTS (SELECT * FROM sys.external_file_formats WHERE name = ''SynapseParquetFormat'') CREATE EXTERNAL FILE FORMAT [SynapseParquetFormat] WITH ( FORMAT_TYPE = PARQUET)' DECLARE @CreateSchema NVARCHAR(MAX) = ( SELECT CONCAT ( 'IF NOT EXISTS(SELECT 1 FROM sys.schemas WHERE [name] = ''' , @SchemaName , ''') EXEC(''CREATE SCHEMA ' , QUOTENAME(@SchemaName) , ''');' ) ) SELECT @createTableDDL = CONCAT ( 'CREATE EXTERNAL TABLE ' , QUOTENAME(@SchemaName) , '.' , QUOTENAME(@TableName) , ' (' , STRING_AGG(ColumnFullDefinition, ',') , ') WITH ( LOCATION = ''' , @DataSourcePath , ''', DATA_SOURCE = [' , @DataSourceName , '], FILE_FORMAT = [SynapseParquetFormat])' ) , @createTableStatsDDL = STRING_AGG(CONCAT ( 'CREATE STATISTICS stat_' , column_name , ' ON ' , QUOTENAME(@Schemaname) , '.' , QUOTENAME(@TableName) , ' (' , QUOTENAME(column_name) , ') WITH FULLSCAN, NORECOMPUTE' ), ';') , @createViewDDL = CONCAT ( 'CREATE VIEW ' , QUOTENAME(@SchemaName) , '.[vw' , @TableName , '] AS SELECT * FROM OPENROWSET(BULK ''' , @FolderPath , ''' , FORMAT=''PARQUET'') WITH (' , STRING_AGG(ColumnFullDefinition, ',') , ') AS r' ) , @openrowsetValue = CONCAT ( 'FROM OPENROWSET(BULK ''''' , @FolderPath , ''''', FORMAT=''''PARQUET'''') WITH (' , STRING_AGG(CONVERT(NVARCHAR(MAX), ColumnFullDefinition), ',') ) FROM #tmpFinal; SELECT @createViewStatsDDL = STRING_AGG(CONCAT ( 'EXEC sys.sp_create_openrowset_statistics N''SELECT ' , column_name , ' ' , @openrowsetValue , ') AS r''' ), ';') FROM #tmpFinal; SELECT @SchemaName AS SchemaName , @TableName AS TableName , CONCAT ( @FileFormatCreateDDL , ';' , @DataSourceCreateDDL , ';' , @CreateSchema , ' IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.tables WHERE TABLE_SCHEMA = ''' , @SchemaName , ''' AND TABLE_NAME = ''' , @TableName , ''') DROP EXTERNAL TABLE ' , @SchemaName , '.' , @TableName , '; ' , @createTableDDL , ';' ) AS CreateTableDDL , @createTableStatsDDL AS CreateTableStatsDDL , CONCAT ( @CreateSchema , ' IF OBJECT_ID(''' , @SchemaName , '.vw' , @TableName , ''', ''V'') IS NOT NULL DROP VIEW ' , @SchemaName , '.vw' , @TableName , '; EXEC(''' , REPLACE(@createViewDDL, '''', '''''') , ''');' ) AS CreateViewDDL , @createViewStatsDDL AS CreateViewStatsDDL;" + "defaultValue": "IF OBJECT_ID('tempdb..#tables') IS NOT NULL \tDROP TABLE #tables; CREATE TABLE #tables ( \tSchemaName NVARCHAR(100) \t,TableName NVARCHAR(100) \t,FolderPath NVARCHAR(1000) \t); INSERT INTO #tables VALUES ( \t'{SchemaNameStaging}' \t,'{TableNameStaging}' \t,'{FolderPathFull}' \t); IF OBJECT_ID('tempdb..#CreateViewsDDL') IS NOT NULL \tDROP TABLE #CreateViewsDDL; CREATE TABLE #CreateViewsDDL ( \tSchemaName NVARCHAR(100) \t,ViewName NVARCHAR(100) \t,ViewDDL NVARCHAR(MAX) \t); DECLARE @cnt INT = 1 DECLARE @sqlCreateView NVARCHAR(MAX) DECLARE @SchemaName NVARCHAR(100) DECLARE @TableName NVARCHAR(100) DECLARE @FolderPath NVARCHAR(1000); SELECT @SchemaName = SchemaName \t,@TableName = TableName \t,@FolderPath = FolderPath \t,@sqlCreateView = CONCAT ( \t\t'sp_describe_first_result_set @tsql=N''SELECT * FROM OPENROWSET(BULK ''''' \t\t,FolderPath \t\t,''''' , FORMAT=''''PARQUET'''') AS r''' \t\t) FROM #tables; IF OBJECT_ID('tempdb..#InformationSchemaTempTable', 'U') IS NOT NULL \tDROP TABLE #InformationSchemaTempTable; CREATE TABLE #InformationSchemaTempTable ( \tis_hidden BIT NOT NULL \t,column_ordinal INT NOT NULL \t,name SYSNAME NULL \t,is_nullable BIT NOT NULL \t,system_type_id INT NOT NULL \t,system_type_name NVARCHAR(256) NULL \t,max_length SMALLINT NOT NULL \t,precision TINYINT NOT NULL \t,scale TINYINT NOT NULL \t,collation_name SYSNAME NULL \t,user_type_id INT NULL \t,user_type_database SYSNAME NULL \t,user_type_schema SYSNAME NULL \t,user_type_name SYSNAME NULL \t,assembly_qualified_type_name NVARCHAR(4000) \t,xml_collection_id INT NULL \t,xml_collection_database SYSNAME NULL \t,xml_collection_schema SYSNAME NULL \t,xml_collection_name SYSNAME NULL \t,is_xml_document BIT NOT NULL \t,is_case_sensitive BIT NOT NULL \t,is_fixed_length_clr_type BIT NOT NULL \t,source_server SYSNAME NULL \t,source_database SYSNAME NULL \t,source_schema SYSNAME NULL \t,source_table SYSNAME NULL \t,source_column SYSNAME NULL \t,is_identity_column BIT NULL \t,is_part_of_unique_key BIT NULL \t,is_updateable BIT NULL \t,is_computed_column BIT NULL \t,is_sparse_column_set BIT NULL \t,ordinal_in_order_by_list SMALLINT NULL \t,order_by_list_length SMALLINT NULL \t,order_by_is_descending SMALLINT NULL \t,tds_type_id INT NOT NULL \t,tds_length INT NOT NULL \t,tds_collation_id INT NULL \t,tds_collation_sort_id TINYINT NULL \t); INSERT INTO #InformationSchemaTempTable EXEC (@sqlCreateView) /*SELECT * FROM #InformationSchemaTempTable*/ DECLARE @GetMaxValueStatement NVARCHAR(MAX) DECLARE @GetColumnList NVARCHAR(MAX) SELECT @GetMaxValueStatement = CONVERT(NVARCHAR(MAX), CONCAT ( \t\t\t'SELECT ' \t\t\t,STRING_AGG(ColumnMaxLength, ',') \t\t\t,' FROM OPENROWSET(BULK ''' \t\t\t,@FolderPath \t\t\t,''' , FORMAT=''PARQUET'') WITH (' \t\t\t,STRING_AGG(CONVERT(NVARCHAR(MAX), ColumnDatatypeWithMax), ',') \t\t\t,') AS r' \t\t\t)) \t,@GetColumnList = STRING_AGG(QUOTENAME([name]), ',') FROM ( \tSELECT CASE \t\t\tWHEN system_type_name LIKE ('%char%') \t\t\t\tOR system_type_name LIKE 'varbinary%' \t\t\t\tTHEN CONCAT ( \t\t\t\t\t\t'CONVERT(BIGINT, COALESCE(NULLIF(MAX(DATALENGTH(' \t\t\t\t\t\t,QUOTENAME([name]) \t\t\t\t\t\t,')), 0), 1)) AS ' \t\t\t\t\t\t,QUOTENAME([name]) \t\t\t\t\t\t) \t\t\tELSE CONCAT ( \t\t\t\t\t'COALESCE(CONVERT(BIGINT, SUM(0)), 0) AS ' \t\t\t\t\t,QUOTENAME([name]) \t\t\t\t\t) \t\t\tEND AS ColumnMaxLength \t\t,CASE \t\t\tWHEN system_type_name LIKE ('%char%') \t\t\t\tTHEN CONCAT ( \t\t\t\t\t\tQUOTENAME([name]) \t\t\t\t\t\t,' ' \t\t\t\t\t\t,REPLACE(system_type_name, '8000', 'MAX') \t\t\t\t\t\t,' COLLATE Latin1_General_100_BIN2_UTF8' \t\t\t\t\t\t) \t\t\tWHEN system_type_name LIKE 'varbinary%' \t\t\t\tTHEN CONCAT ( \t\t\t\t\t\tQUOTENAME([name]) \t\t\t\t\t\t,' ' \t\t\t\t\t\t,REPLACE(system_type_name, '8000', 'MAX') \t\t\t\t\t\t) \t\t\tELSE CONCAT ( \t\t\t\t\tQUOTENAME([name]) \t\t\t\t\t,' ' \t\t\t\t\t,system_type_name \t\t\t\t\t) \t\t\tEND AS ColumnDatatypeWithMax \t\t,[name] \tFROM #InformationSchemaTempTable \t) AS a /*SELECT @GetMaxValueStatement*/ /*SELECT @GetColumnList*/ DECLARE @sqlUnpivot NVARCHAR(MAX) SET @sqlUnpivot = CONCAT ( \t\t'SELECT ''' \t\t,@TableName \t\t,''' AS TABLE_NAME, unpvt.col AS COLUMN_NAME, CASE WHEN unpvt.datatype > 8000 THEN ''MAX'' ELSE CONVERT(NVARCHAR(100), unpvt.datatype) END AS DATATYPE_MAX FROM ( ' \t\t,@GetMaxValueStatement \t\t,' ) AS a ' \t\t,CHAR(13) \t\t,' UNPIVOT ( datatype FOR col IN ( ' \t\t,@GetColumnList \t\t,') ) AS unpvt' \t\t) DROP TABLE IF EXISTS #tmpBus; \tCREATE TABLE #tmpBus ( \t\tTABLE_CLEAN NVARCHAR(1000) \t\t,COLUMN_NAME NVARCHAR(1000) \t\t,DATATYPE_MAX NVARCHAR(1000) \t\t); INSERT INTO #tmpBus EXEC (@sqlUnpivot) DROP TABLE IF EXISTS #tmpFinal; \tCREATE TABLE #tmpFinal ( \t\ttable_name NVARCHAR(1000) \t\t,column_name NVARCHAR(1000) \t\t,DataType NVARCHAR(1000) \t\t,ColumnFullDefinition NVARCHAR(1000) \t\t); INSERT INTO #tmpFinal SELECT @TableName AS table_name \t,c.[name] AS column_name \t,UPPER(TYPE_NAME(c.system_type_id)) AS DataType \t,CONCAT ( \t\tc.[name] \t\t,' ' \t\t,CASE \t\t\tWHEN TYPE_NAME(c.system_type_id) IN ( \t\t\t\t\t'int' \t\t\t\t\t,'bigint' \t\t\t\t\t,'smallint' \t\t\t\t\t,'tinyint' \t\t\t\t\t,'bit' \t\t\t\t\t,'decimal' \t\t\t\t\t,'numeric' \t\t\t\t\t,'float' \t\t\t\t\t,'real' \t\t\t\t\t,'datetime2' \t\t\t\t\t,'date' \t\t\t\t\t,'varbinary' \t\t\t\t\t) \t\t\t\tTHEN UPPER(c.system_type_name) \t\t\tELSE CONCAT ( \t\t\t\t\t\tUPPER(TYPE_NAME(c.system_type_id)) \t\t\t\t\t\t,'(' \t\t\t\t\t\t,CASE \t\t\t\t\t\t\tWHEN CASE WHEN a.DATATYPE_MAX = 'MAX' THEN 8001 ELSE a.DATATYPE_MAX END > 8000 \t\t\t\t\t\t\t\tTHEN 'MAX' \t\t\t\t\t\t\tELSE a.DATATYPE_MAX \t\t\t\t\t\t\tEND \t\t\t\t\t\t,') COLLATE Latin1_General_100_BIN2_UTF8' \t\t\t\t\t\t) \t\t\t\tEND \t\t) AS ColumnFullDefinition FROM #InformationSchemaTempTable AS c JOIN #tmpBus AS a ON a.COLUMN_NAME = c.[name] ORDER BY column_ordinal OFFSET 0 ROWS; DECLARE @createTableDDL NVARCHAR(MAX) DECLARE @createTableStatsDDL NVARCHAR(MAX) DECLARE @createViewDDL NVARCHAR(MAX) DECLARE @createViewStatsDDL NVARCHAR(MAX) DECLARE @openrowsetValue NVARCHAR(MAX) DECLARE @DataSourceName NVARCHAR(MAX) = ( \t\tSELECT CONCAT ( \t\t\t\t'ds_' \t\t\t\t,SUBSTRING(FolderPath, CHARINDEX('//', FolderPath) + 2, (CHARINDEX('.', FolderPath) - 9)) \t\t\t\t) \t\tFROM #tables \t\t) DECLARE @DataSourceDefinition NVARCHAR(MAX) = ( \t\tSELECT SUBSTRING(FolderPath, 0, CHARINDEX('/', REPLACE(FolderPath, '//', '')) + 2) \t\tFROM #tables \t\t) DECLARE @DataSourcePath NVARCHAR(MAX) = ( \t\tSELECT SUBSTRING(FolderPath, CHARINDEX('/', REPLACE(FolderPath, '//', '')) + 2, LEN(FolderPath)) \t\tFROM #tables \t\t) DECLARE @DataSourceCreateDDL NVARCHAR(MAX) = ( \t\tSELECT CONCAT ( \t\t\t\t'IF NOT EXISTS (SELECT * FROM sys.external_data_sources WHERE name = ''' \t\t\t\t,@DataSourceName \t\t\t\t,''') CREATE EXTERNAL DATA SOURCE [' \t\t\t\t,@DataSourceName \t\t\t\t,'] WITH (LOCATION = ''' \t\t\t\t,@DataSourceDefinition \t\t\t\t,''')' \t\t\t\t,'' \t\t\t\t) \t\t) DECLARE @FileFormatCreateDDL NVARCHAR(MAX) = 'IF NOT EXISTS (SELECT * FROM sys.external_file_formats WHERE name = ''SynapseParquetFormat'') CREATE EXTERNAL FILE FORMAT [SynapseParquetFormat] WITH ( FORMAT_TYPE = PARQUET)' DECLARE @CreateSchema NVARCHAR(MAX) = ( \t\tSELECT CONCAT ( \t\t\t\t'IF NOT EXISTS(SELECT 1 FROM sys.schemas WHERE [name] = ''' \t\t\t\t,@SchemaName \t\t\t\t,''') EXEC(''CREATE SCHEMA ' \t\t\t\t,QUOTENAME(@SchemaName) \t\t\t\t,''');' \t\t\t\t) \t\t) SELECT @createTableDDL = CONCAT ( \t\t'CREATE EXTERNAL TABLE ' \t\t,QUOTENAME(@SchemaName) \t\t,'.' \t\t,QUOTENAME(@TableName) \t\t,' (' \t\t,STRING_AGG(ColumnFullDefinition, ',') \t\t,') WITH ( LOCATION = ''' \t\t,@DataSourcePath \t\t,''', DATA_SOURCE = [' \t\t,@DataSourceName \t\t,'], FILE_FORMAT = [SynapseParquetFormat])' \t\t) \t,@createTableStatsDDL = STRING_AGG(CONVERT(NVARCHAR(MAX), CASE WHEN DataType <> 'VARBINARY' THEN CONCAT ( \t\t\t'CREATE STATISTICS stat_', @Schemaname, '_', @TableName, '_' \t\t\t,column_name \t\t\t,' ON ' \t\t\t,QUOTENAME(@Schemaname) \t\t\t,'.' \t\t\t,QUOTENAME(@TableName) \t\t\t,' (' \t\t\t,QUOTENAME(column_name) \t\t\t,') WITH FULLSCAN, NORECOMPUTE' \t\t\t) ELSE '' END ), ';') \t,@createViewDDL = CONCAT ( \t\t'CREATE VIEW ' \t\t,QUOTENAME(@SchemaName) \t\t,'.[vw' \t\t,@TableName \t\t,'] AS SELECT * FROM OPENROWSET(BULK ''' \t\t,@FolderPath \t\t,''' , FORMAT=''PARQUET'') WITH (' \t\t,STRING_AGG(ColumnFullDefinition, ',') \t\t,') AS r' \t\t) \t,@openrowsetValue = CONCAT ( \t\t'FROM OPENROWSET(BULK ''''' \t\t,@FolderPath \t\t,''''', FORMAT=''''PARQUET'''') WITH (' \t\t,STRING_AGG(CONVERT(NVARCHAR(MAX), ColumnFullDefinition), ',') \t\t) FROM #tmpFinal; SELECT @createViewStatsDDL = CONCAT('BEGIN TRY ', STRING_AGG(CONCAT ( \t\t\t'EXEC sys.sp_create_openrowset_statistics N''SELECT ' \t\t\t,column_name \t\t\t,' ' \t\t\t,@openrowsetValue \t\t\t,') AS r''' \t\t\t), ';') \t\t\t,' END TRY BEGIN CATCH SELECT ''ERROR'' END CATCH; ') FROM #tmpFinal; SELECT QUOTENAME(@SchemaName) AS SchemaName \t,QUOTENAME(@TableName) AS TableName \t,CONCAT ( \t\t@FileFormatCreateDDL \t\t,';' \t\t,@DataSourceCreateDDL \t\t,';' \t\t,@CreateSchema \t\t,' IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.tables WHERE TABLE_SCHEMA = ''' \t\t,@SchemaName \t\t,''' AND TABLE_NAME = ''' \t\t,@TableName \t\t,''') DROP EXTERNAL TABLE ' \t\t,QUOTENAME(@SchemaName) \t\t,'.' \t\t,QUOTENAME(@TableName) \t\t,'; ' \t\t,@createTableDDL \t\t,';' \t\t) AS CreateTableDDL \t,CONCAT(@createTableStatsDDL, ';') AS CreateTableStatsDDL \t,CONCAT ( \t\t@CreateSchema \t\t,' IF OBJECT_ID(''' \t\t,@SchemaName \t\t,'.[vw' \t\t,@TableName, ']' \t\t,''', ''V'') IS NOT NULL DROP VIEW ' \t\t,QUOTENAME(@SchemaName) \t\t,'.[vw' \t\t,@TableName, ']' \t\t,'; EXEC(''' \t\t,REPLACE(@createViewDDL, '''', '''''') \t\t,''');' \t\t) AS CreateViewDDL \t,CONCAT(@createViewStatsDDL, ';') AS CreateViewStatsDDL;" }, "DatabaseName": { "type": "String",