# Importa configurazione e assembly necessari Add-Type -AssemblyName System.Web . "$PSScriptRoot\conf.ps1" $scriptName = $MyInvocation.MyCommand.Name $logFile = Join-Path $env:logDir "${scriptName}.log" "start" | Out-File -FilePath $logFile # Imposta il percorso di output nella cartella sql $OutputPath = Join-Path $env:workdir "transito\tabelle" # Verifica che la directory di output esista, altrimenti la crea if (-not (Test-Path -Path $OutputPath)) { New-Item -ItemType Directory -Path $OutputPath | Out-Null } try { # Carica l'assembly System.Data Add-Type -AssemblyName System.Data # Query per estrarre la definizione delle tabelle $query = @" WITH TableColumns AS ( SELECT DISTINCT t.object_id, ( SELECT STUFF(( SELECT ',' + CHAR(13) + CHAR(10) + CHAR(9) + '[' + c2.name + '] ' + CASE WHEN t2.name IN ('char', 'varchar', 'nchar', 'nvarchar') THEN t2.name + '(' + CASE WHEN c2.max_length = -1 THEN 'MAX' WHEN t2.name LIKE 'n%' THEN CAST(c2.max_length/2 AS VARCHAR) ELSE CAST(c2.max_length AS VARCHAR) END + ')' WHEN t2.name IN ('decimal', 'numeric') THEN t2.name + '(' + CAST(c2.[precision] AS VARCHAR) + ',' + CAST(c2.[scale] AS VARCHAR) + ')' ELSE t2.name END + CASE WHEN c2.is_nullable = 0 THEN ' NOT NULL' ELSE ' NULL' END + CASE WHEN ic.is_identity = 1 THEN ' IDENTITY(' + CAST(IDENT_SEED(OBJECT_SCHEMA_NAME(t.object_id) + '.' + OBJECT_NAME(t.object_id)) AS VARCHAR) + ',' + CAST(IDENT_INCR(OBJECT_SCHEMA_NAME(t.object_id) + '.' + OBJECT_NAME(t.object_id)) AS VARCHAR) + ')' ELSE '' END + CASE WHEN dc.definition IS NOT NULL THEN ' DEFAULT ' + dc.definition ELSE '' END FROM sys.columns c2 INNER JOIN sys.types t2 ON c2.user_type_id = t2.user_type_id LEFT JOIN sys.identity_columns ic ON ic.object_id = c2.object_id AND ic.column_id = c2.column_id LEFT JOIN sys.default_constraints dc ON dc.parent_object_id = c2.object_id AND dc.parent_column_id = c2.column_id WHERE c2.object_id = t.object_id ORDER BY c2.column_id FOR XML PATH('') ), 1, 2, '') ) as ColumnDefinitions FROM sys.tables t ), TablePrimaryKeys AS ( SELECT DISTINCT i.object_id, ( SELECT CHAR(13) + CHAR(10) + 'ALTER TABLE [' + OBJECT_SCHEMA_NAME(i.object_id) + '].[' + OBJECT_NAME(i.object_id) + '] ADD CONSTRAINT [' + i.name + '] PRIMARY KEY ' + CASE WHEN i.type = 1 THEN 'CLUSTERED' ELSE 'NONCLUSTERED' END + ' (' + STUFF(( SELECT ',' + QUOTENAME(c2.name) FROM sys.index_columns ic2 INNER JOIN sys.columns c2 ON c2.object_id = ic2.object_id AND c2.column_id = ic2.column_id WHERE ic2.object_id = i.object_id AND ic2.index_id = i.index_id ORDER BY ic2.key_ordinal FOR XML PATH('') ), 1, 1, '') + ')' ) as PkDefinition FROM sys.indexes i WHERE i.is_primary_key = 1 ) SELECT s.name as SchemaName, t.name as TableName, CONCAT( 'CREATE TABLE [', s.name, '].[', t.name, '] (', CHAR(13), CHAR(10), tc.ColumnDefinitions, CHAR(13), CHAR(10), ')', ISNULL(pk.PkDefinition, '') ) as TableDefinition FROM sys.tables t INNER JOIN sys.schemas s ON t.schema_id = s.schema_id INNER JOIN TableColumns tc ON tc.object_id = t.object_id LEFT JOIN TablePrimaryKeys pk ON pk.object_id = t.object_id WHERE t.is_ms_shipped = 0 "@ # Esegui la query Write-Host "Eseguo query su $env:dbHostInput..." "Eseguo query su $env:dbHostInput..." | Out-File -FilePath $logFile -Append try { # Crea la connessione e esegui la query $connectionString = "Server=$($env:dbHostInput);Database=$($env:dbNameInput);User Id=$($env:dbUserInput);Password=$($env:dbPasswordInput);TrustServerCertificate=True;Connection Timeout=30" Write-Host "Tentativo di connessione a $($env:dbHostInput)..." $connection = New-Object System.Data.SqlClient.SqlConnection($connectionString) $command = New-Object System.Data.SqlClient.SqlCommand($query, $connection) $adapter = New-Object System.Data.SqlClient.SqlDataAdapter($command) $dataset = New-Object System.Data.DataSet $adapter.Fill($dataset) | Out-Null $tables = $dataset.Tables[0] } catch { Write-Error "Errore di connessione al database: $($_.Exception.Message)" Write-Host "Dettagli connessione:" Write-Host "Server: $($env:dbHostInput)" Write-Host "Database: $($env:dbNameInput)" Write-Host "Utente: $($env:dbUserInput)" throw } Write-Host "Trovate $($tables.Count) tabelle" "Trovate $($tables.Count) tabelle" | Out-File -FilePath $logFile -Append # Funzione per formattare il nome del file function Format-FileName { param([string]$name) # Sostituisce caratteri non validi con underscore $invalidChars = [IO.Path]::GetInvalidFileNameChars() $invalidChars += '[', ']', ' ', '(', ')', '{', '}', 'ยด', '`', '''', '"' $result = $name foreach ($char in $invalidChars) { $result = $result.Replace($char, '_') } return $result } # Per ogni tabella trovata Write-Host "Inizio elaborazione tabelle..." "Inizio elaborazione tabelle..." | Out-File -FilePath $logFile -Append foreach ($table in $tables) { $schemaName = Format-FileName $table.SchemaName $tableName = Format-FileName $table.TableName $definition = $table.TableDefinition # Crea il nome del file $fileName = Join-Path $OutputPath "${schemaName}_${tableName}.sql" Write-Host "Elaboro ${schemaName}.${tableName}..." "Elaboro ${schemaName}.${tableName}..." | Out-File -FilePath $logFile -Append # Pulisci e formatta il contenuto $content = $definition.Trim() # Rimuovi caratteri speciali e di escape HTML $content = $content -replace ' |#x0D;|\r|\n', "`r`n" $content = [System.Web.HttpUtility]::HtmlDecode($content) $content += "`r`nGO" # Rimuovi righe vuote multiple e normalizza i line endings $lines = $content -split "\r?\n" | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } $content = $lines -join "`r`n" try { # Scrivi il contenuto nel file con codifica UTF8 con BOM [System.IO.File]::WriteAllText($fileName, $content, [System.Text.UTF8Encoding]::new($true)) Write-Host "Creato file per tabella: ${schemaName}.${tableName}" -ForegroundColor Green "Creato file per tabella: ${schemaName}.${tableName}" | Out-File -FilePath $logFile -Append } catch { $errorMessage = "ERRORE durante la scrittura del file per ${schemaName}.${tableName}: $($_.Exception.Message)" Write-Host $errorMessage -ForegroundColor Red $errorMessage | Out-File -FilePath $logFile -Append } } Write-Host "`nEstrazione completata con successo!" } catch { Write-Error "Errore durante l'estrazione delle tabelle: $_" exit 1 }