@@ -412,7 +412,58 @@ function Copy-DbaDbTableData {
412412
413413
414414 if (Test-Bound - ParameterName Query -Not ) {
415- $Query = " SELECT * FROM $fqtnfrom "
415+ # Build ORDER BY clause to ensure consistent row order
416+ # This prevents data misalignment when copying tables without explicit ordering
417+ $orderByClause = " "
418+
419+ # Refresh indexes to ensure we have current metadata
420+ $sqlObject.Indexes.Refresh ()
421+
422+ # Option 1: Use clustered index columns for ordering (most common and performant)
423+ $clusteredIndex = $sqlObject.Indexes | Where-Object IsClustered -eq $true | Select-Object - First 1
424+ if ($clusteredIndex ) {
425+ $orderColumns = $clusteredIndex.IndexedColumns | Sort-Object IndexKeyPosition | ForEach-Object {
426+ $colName = $_.Name
427+ $descending = if ($_.Descending ) { " DESC" } else { " " }
428+ " [$colName ]$descending "
429+ }
430+ if ($orderColumns ) {
431+ $orderByClause = " ORDER BY " + ($orderColumns -join " , " )
432+ Write-Message - Level Verbose - Message " Using clustered index for ordering: $orderByClause "
433+ }
434+ }
435+
436+ # Option 2: If no clustered index, try primary key
437+ if (-not $orderByClause ) {
438+ $primaryKey = $sqlObject.Indexes | Where-Object IndexKeyType -eq " DriPrimaryKey" | Select-Object - First 1
439+ if ($primaryKey ) {
440+ $orderColumns = $primaryKey.IndexedColumns | Sort-Object IndexKeyPosition | ForEach-Object {
441+ $colName = $_.Name
442+ $descending = if ($_.Descending ) { " DESC" } else { " " }
443+ " [$colName ]$descending "
444+ }
445+ if ($orderColumns ) {
446+ $orderByClause = " ORDER BY " + ($orderColumns -join " , " )
447+ Write-Message - Level Verbose - Message " Using primary key for ordering: $orderByClause "
448+ }
449+ }
450+ }
451+
452+ # Option 3: If using KeepIdentity and an identity column exists, order by it
453+ if (-not $orderByClause -and $KeepIdentity ) {
454+ $identityColumn = $sqlObject.Columns | Where-Object Identity -eq $true | Select-Object - First 1
455+ if ($identityColumn ) {
456+ $orderByClause = " ORDER BY [$ ( $identityColumn.Name ) ]"
457+ Write-Message - Level Verbose - Message " Using identity column for ordering: $orderByClause "
458+ }
459+ }
460+
461+ # If no ordering found, log a warning for tables without proper keys
462+ if (-not $orderByClause ) {
463+ Write-Message - Level Verbose - Message " No clustered index, primary key, or identity column found for ordering. Row order is not guaranteed."
464+ }
465+
466+ $Query = " SELECT * FROM $fqtnfrom$orderByClause "
416467 $sourceLabel = $fqtnfrom
417468 } else {
418469 $sourceLabel = " Query"
0 commit comments