Site icon PlusMagi's Blog By Pitt Phunsanit

SQL Server: cleaning table column descriptions

จากที่มีการใส่ descriptions ลงใน table และ column ไว้เรียบร้อยแล้ว แต่กลับใช้ SQL Server: ค้นหา Table Description ไม่เจอ เลยลอง debug ดู ปรากฏว่า มี space อยู่ 2 ตัวแทนที่จะเป็นตัวเดียว คั่นอยู่ระหว่าง 2 คำ ทำให้หาไม่เจอ เลยเป็นที่มาของ query cleaning descriptions ทั้งใน table และ column
cleaning_table_column_descriptions.sql

SET NOCOUNT ON;

;WITH DirtyDescriptions AS (SELECT
 DB_NAME () AS DBName,
 SCHEMA_NAME (o.schema_id) AS SchemaName,
 OBJECT_NAME (o.object_id) AS TableName,
 c.name AS ColumnName,
 CAST (ep.value AS nvarchar (max)) AS OldDesc,
 LTRIM (RTRIM (REPLACE (REPLACE (REPLACE (CAST (ep.value AS nvarchar (max)) , CHAR (13) , ' ') , CHAR (10) , ' ') , ' ', ' '))) AS CleanDesc
 FROM sys.extended_properties ep
 INNER JOIN sys.objects o ON ep.major_id = o.object_id
 LEFT JOIN sys.columns c ON ep.minor_id = c.column_id AND ep.major_id = c.object_id
 WHERE ep.name = N'MS_Description'
 AND ep.class = 1
 AND ep.value IS NOT NULL
 AND (CAST (ep.value AS nvarchar (max)) LIKE '% %'
 OR CAST (ep.value AS nvarchar (max)) LIKE '%' + CHAR (13) + '%'
 OR CAST (ep.value AS nvarchar (max)) LIKE '%' + CHAR (10) + '%'
 OR LTRIM (RTRIM (CAST (ep.value AS nvarchar (max)))) <> CAST (ep.value AS nvarchar (max)))) SELECT
 ROW_NUMBER () OVER (ORDER BY SchemaName, TableName, ColumnName) AS [No],
 DBName + '.' + SchemaName + '.' + TableName AS [Full_Table_Name],
 ISNULL (ColumnName, ' (Table Level) ') AS [Column_Name],
 OldDesc AS [Old_Description],
 CleanDesc AS [New_Description],

 -- เปลี่ยน description ให้สะอาด
 N'USE ' + QUOTENAME (DBName) + N'; EXEC sp_updateextendedproperty ' +
 N'@name = N''MS_Description'', @value = N''' + REPLACE (CleanDesc, '''', '''''') + N''', ' +
 N'@level0type = N''SCHEMA'', @level0name = N''' + SchemaName + N''', ' +
 N'@level1type = N''TABLE'', @level1name = N''' + TableName + N'''' +
 CASE WHEN ColumnName IS NOT NULL
 THEN N', @level2type = N''COLUMN'', @level2name = N''' + ColumnName + N''''
 ELSE N''
 END + N';' AS [SQL_Command_To_Run]

FROM DirtyDescriptions
ORDER BY [No];

Exit mobile version