Catalog
github/sql-server-table-reconciliation

github

sql-server-table-reconciliation

Use when: comparing SQL Server tables across instances, data migration validation, ETL verification, row mismatch detection, schema drift, reconciliation report, production vs staging comparison. Uses mssql-python driver with Apache Arrow for fast columnar data transfer and comparison.

v1.0Latest
New~1.4kUpdated Jun 26, 2026

SQL Server Table Reconciliation

Compare identical tables across two SQL Server instances using Python with mssql-python driver and Apache Arrow. Detect missing rows, column mismatches, schema drift, and produce a reconciliation report.

Workflow

  1. Collect connection details for source and target
  2. Identify primary key / composite key
  3. Detect schema differences
  4. Extract data via Arrow for efficient columnar transfer
  5. Compare rows and columns
  6. Generate reconciliation report

Collect Inputs

Parameter Required Description
Source server Yes Source SQL Server (e.g. prod-server.database.windows.net)
Source database Yes Source database name
Target server Yes Target SQL Server (e.g. staging-server.database.windows.net)
Target database Yes Target database name
Tables Yes Comma-separated schema.table names, or schema.* wildcard (e.g. dbo.Orders,dbo.Items or dbo.*)
Auth mode Yes sql (user/password) or entra (Azure AD/token)
Primary key Auto-detect Column(s) forming the row identity. Auto-detect from metadata if not provided.
Columns to compare All Subset of columns, or all non-PK columns
Chunk size 100000 Rows per batch for large tables
Output format console console, csv, parquet, or json

Bundled Script

The reconciliation logic is provided as a standalone script at scripts/reconcile.py. Invoke it with the appropriate arguments based on user inputs:

python scripts/reconcile.py \
    --source-server <source_server> \
    --source-database <source_database> \
    --target-server <target_server> \
    --target-database <target_database> \
    --tables "<table_spec>" \
    --auth <sql|entra> \
    --chunk-size <chunk_size> \
    --output <console|csv|json>

Optional arguments

Argument Description
--primary-key Comma-separated PK column(s). Omit to auto-detect.
--columns Comma-separated columns to compare. Omit to compare all non-PK columns.

Example invocations

Single table with SQL auth:

python scripts/reconcile.py \
    --source-server prod-server.database.windows.net \
    --source-database ProdDB \
    --target-server staging-server.database.windows.net \
    --target-database StagingDB \
    --tables "dbo.Orders" \
    --auth sql \
    --output console

Wildcard with Entra auth and CSV output:

python scripts/reconcile.py \
    --source-server prod-server.database.windows.net \
    --source-database ProdDB \
    --target-server staging-server.database.windows.net \
    --target-database StagingDB \
    --tables "dbo.*" \
    --auth entra \
    --output csv

Prerequisites

Install required packages before running:

pip install mssql-python pyarrow pandas

Comparison Rules

  • Normalize types before comparing: cast decimals to same precision, trim strings, normalize datetime to UTC
  • NULL handling: NULL == NULL is considered a match (both sides missing = no diff)
  • Ignore row order: always compare by PK join, never positional
  • Large tables: chunk extraction with OFFSET/FETCH or ROW_NUMBER() partitioning

Hash-Based Optimization (for large tables)

When table has >1M rows, generate a hash pre-check:

SELECT {pk_cols},
       HASHBYTES('SHA2_256', CONCAT_WS('|', col1, col2, ...)) AS row_hash
FROM {table}

Compare hashes first; only fetch full rows for mismatched hashes. This reduces data transfer significantly.

Report Format

Reconciling dbo.EMPLOYEES...
Reconciling dbo.DEPARTMENTS...
Reconciling dbo.JOBS...

--- dbo.EMPLOYEES ---
  Source: 107  Target: 107
  Missing: 0  Extra: 0  Mismatches: 0
  Result: ✓ IDENTICAL

--- dbo.DEPARTMENTS ---
  Source: 27  Target: 27
  Missing: 0  Extra: 0  Mismatches: 3
  Result: ✗ DIFFERENCES FOUND

--- dbo.JOBS ---
  Source: 19  Target: 19
  Missing: 0  Extra: 0  Mismatches: 0
  Result: ✓ IDENTICAL

=== Summary: 2 passed, 1 failed, 0 skipped / 3 tables ===

When a single table is provided, include full detail (schema drift, sample rows, mismatches). When multiple tables, use the compact per-table format above with full detail only for tables with FAIL status.

Performance Considerations

Scenario Strategy
< 100K rows Single Arrow fetch, in-memory pandas compare
100K–1M rows Chunked extraction (100K batches), streaming comparison
> 1M rows Hash pre-check → only fetch mismatched rows
Wide tables (100+ cols) Compare PK + hash first, drill into specific columns on mismatch
Network-constrained Use Arrow columnar format (10-50x smaller than row-by-row)

Constraints

  • Always use mssql-python driver (not pyodbc, pymssql)
  • Always use Apache Arrow via cursor (cursor.arrow()) for data extraction
  • Connection MUST use connection string format, not keyword arguments (kwargs like encrypt=True throw errors)
  • Never compare without identifying PK first — ask user if auto-detect fails
  • Handle connection failures gracefully with retry logic
  • Never hardcode credentials in generated scripts — use os.environ / getpass (env vars: MSSQL_USER, MSSQL_PASSWORD)
  • Do not print credentials in output or logs
  • Use parameterized queries (? placeholders) for metadata lookups — never f-string interpolate user input into SQL
Files2
2 files · 13.9 KB

Select a file to preview

Grade adjusted by static analysis guardrails

AI scored this skill as grade B, but static analysis findings capped it to C:

  • Hardcoded credentials or secrets detected in content (max: C)

Overall Score

78/100

Grade

C

Adequate

Safety

76

Quality

82

Clarity

85

Completeness

72

Summary

This skill enables SQL Server table reconciliation across instances using a Python script (`reconcile.py`) that leverages the `mssql-python` driver and Apache Arrow for efficient columnar data transfer. The skill detects schema drift, identifies missing/extra rows, compares column values, and generates reconciliation reports in multiple formats (console, CSV, JSON).

Static Analysis Findings

1 finding

Patterns detected by deterministic static analysis before AI scoring. Hover over any finding code for detailed information and remediation guidance.

Credential Exposure
SEC-023Plaintext Password or SecretMax: C

Password or secret in plaintext

scripts/reconcile.pyPassword: ") conn_str = ( f

Detected Capabilities

file writeshell executionenvironment variable readnetwork requestSQL query executiondatabase connectionexternal process invocation

Trigger Keywords

Phrases that MCP clients use to match this skill to user intent.

reconcile sql tablescompare database instancessql data validationmigration verificationschema drift detectionetl verificationtable row mismatch

Risk Signals

WARNING

Plaintext password handling in connection string (lines 33-44)

scripts/reconcile.py:33-44
INFO

Password read from environment variable or interactive prompt before connection

scripts/reconcile.py:37-39
WARNING

No credential masking in console output or logs

scripts/reconcile.py (throughout)
INFO

Parameterized SQL queries used for metadata lookups (lines 78, 106, 120)

scripts/reconcile.py:78-120

Use Cases

  • Compare production and staging database tables for data consistency
  • Validate data migration between SQL Server instances
  • Verify ETL pipeline correctness by comparing source and target tables
  • Detect schema differences and column type mismatches between databases
  • Generate reconciliation reports showing row counts, missing records, and data mismatches
  • Identify data integrity issues before deploying to production

Quality Notes

  • Skill provides clear, scoped instructions with realistic parameter documentation and practical examples
  • Script correctly uses getpass for password prompting and respects environment variables (MSSQL_USER, MSSQL_PASSWORD) per best practices
  • SQL injection protection implemented via parameterized queries for all user-influenced inputs
  • Comprehensive handling of multiple auth modes (SQL auth and Entra/Azure AD)
  • Schema drift detection and primary key auto-discovery add value for complex scenarios
  • Report format is well-structured with pass/fail status and actionable summary
  • Hash-based optimization strategy documented for large tables (>1M rows)
  • Error handling for missing PKs is present but could be more graceful (currently returns SKIPPED)
  • Apache Arrow columnar format used correctly for efficient data transfer
  • Minor: credentials in plaintext in connection strings is standard ODBC practice but should include warning about secure credential storage
Model: claude-haiku-4-5-20251001Analyzed: Jun 26, 2026

Reviews

Add this skill to your library to leave a review.

No reviews yet

Be the first to share your experience.

Use github/sql-server-table-reconciliation in your dev environment

Command Palette

Search for a command to run...

github/sql-server-table-reconciliation | SkillRepo