หมวดหมู่: T-SQL

Microsoft SQL Server is Transact-SQL (T-SQL)

SQL Server: check column name type sizeSQL Server: check column name type size

จากเรื่อง SQL Server: Join table with varchar, nvarchar size ชนิด column ไม่ตรงกัน หรือแม้แต่ชนิด varchar, nvarchar ต่างกัน เวลาเอามา join กันมันทำให้ Performance Impact จึงทำ query มาเช็ก column name ว่าแต่ละตาราง มันมี type, size ตรงกันมั๋ย
audit_table_column_type_and_size.sql

WITH RawColumns AS (SELECT 
 table_catalog AS DatabaseName,
 table_schema AS SchemaName,
 table_name AS TableName,
 column_name AS ColumnName,
 data_type AS DataType,
 -- จัดการเรื่อง DataSize
 CASE
 WHEN character_maximum_length IS NOT NULL THEN CAST (character_maximum_length AS VARCHAR) WHEN datetime_precision IS NOT NULL THEN CAST (datetime_precision AS VARCHAR) WHEN numeric_precision IS NOT NULL AND numeric_scale IS NOT NULL 
 THEN CAST (numeric_precision AS VARCHAR) + ',' + CAST (numeric_scale AS VARCHAR) WHEN numeric_precision IS NOT NULL THEN CAST (numeric_precision AS VARCHAR) ELSE 'N/A'
 END AS DataSize,
 -- ตัด Prefix ออก (สมมติว่า prefix จบด้วย underscore เช่น 'pp_column_name') -- หากไม่มีขีดล่างจะใช้ชื่อเดิม
 CASE 
 WHEN column_name LIKE '%_%' THEN SUBSTRING (column_name, CHARINDEX ('_', column_name) + 1, LEN (column_name)) ELSE column_name 
 END AS CleanedColumnName
 FROM information_schema.columns) ,
ColumnStats AS (-- นับว่าในแต่ละ CleanedColumnName มี Type หรือ Size ที่ต่างกันกี่แบบ
 SELECT 
 CleanedColumnName,
 COUNT (DISTINCT DataType) AS DistinctTypes,
 COUNT (DISTINCT DataSize) AS DistinctSizes
 FROM RawColumns
 GROUP BY CleanedColumnName) SELECT 
 r.DatabaseName,
 r.SchemaName,
 r.TableName,
 r.DatabaseName + '.' + r.SchemaName + '.' + r.TableName AS FullyQualifiedDomainName,
 r.ColumnName,
 r.CleanedColumnName,
 r.DataType,
 r.DataSize
FROM RawColumns r
JOIN ColumnStats s ON r.CleanedColumnName = s.CleanedColumnName
-- เงื่อนไข: แสดงเฉพาะ column ที่มี type หรือ size ไม่เหมือนเพื่อนในชื่อ cleaned เดียวกัน
WHERE s.DistinctTypes > 1 OR s.DistinctSizes > 1
ORDER BY 
 r.CleanedColumnName, 
 r.SchemaName, 
 r.TableName;

อ่านเพิ่มเติม