Tag Archive data

Byphunsanit

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];