Here’s what the script does step by step:
- Declares a variable
@TableNameand assigns it a value. - Declares a variable
@SQLto hold dynamic SQL. - Generates dynamic SQL to query column names and data types of the specified table.
- Executes the dynamic SQL using
sp_executesql, passing the@TableNamevariable as a parameter.
The script uses a cursor to iterate over the columns of the specified table in the INFORMATION_SCHEMA.COLUMNS view and inserts the column names and data types into a temporary table #ComparisonResults. Finally, it selects the comparison results and drops the temporary table.
Make sure to replace 'YourTableName' with the actual name of your table.
DECLARE @TableName NVARCHAR(100) = ‘YourTableName’; — Change to your table name
— Generate dynamic SQL to get column names and data types of the specified table
DECLARE @SQL NVARCHAR(MAX) = ‘
DECLARE @ColumnName NVARCHAR(100);
DECLARE @DataType NVARCHAR(100);
DECLARE @Query NVARCHAR(MAX);
— Temporary table to store results
CREATE TABLE #ComparisonResults (
TableName NVARCHAR(100),
ColumnName NVARCHAR(100),
DataType NVARCHAR(100)
);
— Get column names and data types of the specified table
DECLARE column_cursor CURSOR FOR
SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TableName;
OPEN column_cursor;
FETCH NEXT FROM column_cursor INTO @ColumnName, @DataType;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Query =
”INSERT INTO #ComparisonResults (TableName, ColumnName, DataType)
VALUES (””” + @TableName + ”””’, ””’ + @ColumnName + ”””, ””’ + @DataType + ”””);”;
EXEC sp_executesql @Query;
FETCH NEXT FROM column_cursor INTO @ColumnName, @DataType;
END
CLOSE column_cursor;
DEALLOCATE column_cursor;
— Select comparison results
SELECT *
FROM #ComparisonResults;
— Drop temporary table
DROP TABLE #ComparisonResults;
‘;
DECLARE @TableName1 NVARCHAR(100) = ‘Table1’; — Change to your first table name
DECLARE @TableName2 NVARCHAR(100) = ‘Table2’; — Change to your second table name
— Generate dynamic SQL to compare columns and row data
DECLARE @SQL NVARCHAR(MAX) = ‘
— Create temporary tables to store data from each table
CREATE TABLE #Table1Data (
RowID INT IDENTITY(1,1),
‘ + (SELECT STUFF((SELECT ‘, ‘ + COLUMN_NAME + ‘ ‘ + DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TableName1
FOR XML PATH(”)), 1, 2, ”)) + ‘
);
CREATE TABLE #Table2Data (
RowID INT IDENTITY(1,1),
‘ + (SELECT STUFF((SELECT ‘, ‘ + COLUMN_NAME + ‘ ‘ + DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TableName2
FOR XML PATH(”)), 1, 2, ”)) + ‘
);
— Insert data from first table
INSERT INTO #Table1Data (‘ + (SELECT STUFF((SELECT ‘, ‘ + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TableName1
FOR XML PATH(”)), 1, 2, ”)) + ‘)
SELECT ‘ + (SELECT STUFF((SELECT ‘, ‘ + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TableName1
FOR XML PATH(”)), 1, 2, ”)) + ‘
FROM ‘ + @TableName1 + ‘;
— Insert data from second table
INSERT INTO #Table2Data (‘ + (SELECT STUFF((SELECT ‘, ‘ + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TableName2
FOR XML PATH(”)), 1, 2, ”)) + ‘)
SELECT ‘ + (SELECT STUFF((SELECT ‘, ‘ + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TableName2
FOR XML PATH(”)), 1, 2, ”)) + ‘
FROM ‘ + @TableName2 + ‘;
— Compare columns and row data
SELECT
T1.RowID AS Table1_RowID,
T2.RowID AS Table2_RowID,
‘ + (SELECT STUFF((SELECT ‘,
CASE WHEN C1.COLUMN_NAME IS NULL THEN ” ELSE ‘CASE WHEN T1.’ + C1.COLUMN_NAME + ‘ = T2.’ + C2.COLUMN_NAME + ‘ THEN ”Match” ELSE ”Mismatch” END AS ‘ + C1.COLUMN_NAME END
FROM INFORMATION_SCHEMA.COLUMNS C1
LEFT JOIN INFORMATION_SCHEMA.COLUMNS C2 ON C1.COLUMN_NAME = C2.COLUMN_NAME
WHERE C1.TABLE_NAME = @TableName1
FOR XML PATH(”)), 1, 2, ”)) + ‘
FROM #Table1Data T1
FULL OUTER JOIN #Table2Data T2 ON T1.RowID = T2.RowID;
— Drop temporary tables
DROP TABLE #Table1Data;
DROP TABLE #Table2Data;
‘;
— Execute dynamic SQL
EXEC sp_executesql @SQL, N’@TableName1 NVARCHAR(100), @TableName2 NVARCHAR(100)’, @TableName1, @TableName2;
Discover more from SQLYARD
Subscribe to get the latest posts sent to your email.


