เพราะว่ากำลังดู project ใหญ่ ๆ ที databases หลายตัวแถมยังซอยเป็น dev, stg, qa ซึ่ง sq, dev หลายคนเข้าไปแก้ โครงสร้างได้เอง ทำให้เวลาเอา code ขี้น deploy ไปแล้วแตกเพราะ column ดันไม่ตรงกัน เลยเขียน query มาเที่ยบมันซะเลย ได้จบ ๆ
compare_structure_in_databases_v.1.sql
-- Declare variables for the database names
DECLARE @db1 NVARCHAR(128) = 'DB_DEV';
DECLARE @db2 NVARCHAR(128) = 'DB_QA';
-- Use dynamic SQL to build the query
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'
SELECT
ISNULL(c1.TABLE_SCHEMA, c2.TABLE_SCHEMA) AS TableSchema,
ISNULL(c1.TABLE_NAME, c2.TABLE_NAME) AS TableName,
ISNULL(c1.COLUMN_NAME, c2.COLUMN_NAME) AS ColumnName,
CASE
WHEN c1.COLUMN_NAME IS NULL THEN ''Missing in ' + QUOTENAME(@db1) + '''
WHEN c2.COLUMN_NAME IS NULL THEN ''Missing in ' + QUOTENAME(@db2) + '''
WHEN c1.DATA_TYPE <> c2.DATA_TYPE THEN ''Data Type Mismatch''
WHEN c1.IS_NULLABLE <> c2.IS_NULLABLE THEN ''Nullability Mismatch''
ELSE ''Difference''
END AS DifferenceType,
c1.DATA_TYPE AS ' + @db1 + '_DataType,
c2.DATA_TYPE AS ' + @db2 + '_DataType,
c1.IS_NULLABLE AS ' + @db1 + '_IsNullable,
c2.IS_NULLABLE AS ' + @db2 + '_IsNullable
FROM ' + QUOTENAME(@db1) + '.INFORMATION_SCHEMA.COLUMNS c1
FULL OUTER JOIN ' + QUOTENAME(@db2) + '.INFORMATION_SCHEMA.COLUMNS c2
ON c1.TABLE_SCHEMA = c2.TABLE_SCHEMA
AND c1.TABLE_NAME = c2.TABLE_NAME
AND c1.COLUMN_NAME = c2.COLUMN_NAME
WHERE (
c1.COLUMN_NAME IS NULL
OR c2.COLUMN_NAME IS NULL
OR c1.DATA_TYPE <> c2.DATA_TYPE
OR c1.IS_NULLABLE <> c2.IS_NULLABLE
)
-- Filter the results
-- AND ISNULL(c1.TABLE_NAME, c2.TABLE_NAME) = ''PITT''
;';
-- Execute the dynamic SQL
EXEC sp_executesql @sql;
มันจะบอกว่าคอลัมน์ไหน ต่างกันที่ตรงไหนบ้าง ช่วยให้เตรียมตัวได้ตอน deploy ไม่โดน QA ตีกลับมา
ในบรรทัด 36 ถ้า uncomment หรือเปลี่ยนเงื่อนไขเพื่อหากลุ่มตารางเฉพาะของเราก็ได้เหมือนกัน