วัน: 8 กุมภาพันธ์ 2020

SQL Server: เปลี่ยนชื่อตาม naming conventionSQL Server: เปลี่ยนชื่อตาม naming convention

การตั้งชื่อ index, constraint SQL Server ตาม naming convention ที่ SSMS สร้างช่วยให้การจัดระเบียบ ให้ส่วนต่าง ๆ ใน database เป็นระเบียบได้ โดยได้เพิ่ม table filter ไว้อย่าง “PP_” เพราะว่าสร้างไว้แบบ ชื่อของฉัน ชื่อของคุณไว้เยอะมาก จนถ้าดูทีเดียวทั้ง database นี่ดูกันไม่ทัน
find_index_constraint_not_gennarate_naming_convention_not_your_name.sql

-- 1. ประกาศและตั้งค่าตัวแปรสำหรับกรองชื่อตาราง
DECLARE @TableNameFilter NVARCHAR(100);
SET @TableNameFilter = '%PP_%'; -- แก้ไขเงื่อนไขของคุณที่นี่ที่เดียว

-- 2. ใช้ Common Table Expression (CTE) เพื่อรวมผลลัพธ์
;WITH AllObjectsToRename AS (

 -- ส่วนที่ 1: ค้นหา Constraints (PK, FK, UQ, DF, CK) ที่ชื่อผิด
 SELECT
  s.name AS SchemaName
  t.name AS TableName,
  o.name AS OldName,
  o.type_desc AS ObjectType,

  (CASE o.type
   WHEN 'PK' THEN 'PK_' + t.name
   WHEN 'F' THEN 'FK_' + t.name + '_' + o.name
   WHEN 'UQ' THEN 'UQ_' + t.name + '_' + o.name
   WHEN 'D' THEN 'DF_' + t.name + '_' + o.name
   WHEN 'C' THEN 'CK_' + t.name + '_' + o.name
   ELSE o.name
  END) AS ProposedNewName,

  'EXEC sp_rename N''' + QUOTENAME(s.name) + '.' + QUOTENAME(o.name) + ''', N''' +
  (CASE o.type
   WHEN 'PK' THEN 'PK_' + t.name
   WHEN 'F' THEN 'FK_' + t.name + '_' + o.name
   WHEN 'UQ' THEN 'UQ_' + t.name + '_' + o.name
   WHEN 'D' THEN 'DF_' + t.name + '_' + o.name
   WHEN 'C' THEN 'CK_' + t.name + '_' + o.name
   ELSE o.name
  END)
  + ''', N''OBJECT'';' AS RenameScript
 FROM
  sys.objects AS o
 JOIN
  sys.tables AS t ON o.parent_object_id = t.object_id
 JOIN
  sys.schemas AS s ON t.schema_id = s.schema_id
 WHERE
  o.is_ms_shipped = 0
  AND o.type IN ('PK', 'F', 'UQ', 'D', 'C')
  AND t.name LIKE @TableNameFilter
  AND (
   (o.type = 'PK' AND o.name NOT LIKE 'PK_%') OR
   (o.type = 'F' AND o.name NOT LIKE 'FK_%') OR
   (o.type = 'UQ' AND o.name NOT LIKE 'UQ_%') OR
   (o.type = 'D' AND o.name NOT LIKE 'DF_%') OR
   (o.type = 'C' AND o.name NOT LIKE 'CK_%')
  )

 UNION ALL

 -- ส่วนที่ 2: ค้นหา Indexes (IX) ที่ชื่อผิด
 SELECT
  s.name AS SchemaName,
  t.name AS TableName,
  i.name AS OldName,
  i.type_desc AS ObjectType,

  'IX_' + t.name + '_' + i.name AS ProposedNewName,

  'EXEC sp_rename N''' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + '.' + QUOTENAME(i.name) + ''', N''' +
  'IX_' + t.name + '_' + i.name +
  ''', N''INDEX'';' AS RenameScript
 FROM
  sys.indexes AS i
 JOIN
  sys.tables AS t ON i.object_id = t.object_id
 JOIN
  sys.schemas AS s ON t.schema_id = s.schema_id
 WHERE
  i.is_primary_key = 0
  AND i.is_unique_constraint = 0
  AND i.type_desc != 'HEAP'
  AND t.is_ms_shipped = 0
  AND i.name IS NOT NULL
  AND t.name LIKE @TableNameFilter
  AND i.name NOT LIKE 'IX_%'
)
-- 3. สั่ง SELECT และ ORDER BY จาก CTE ด้านบน
SELECT
 SchemaName,
 TableName,
 OldName,
 ObjectType,
 ProposedNewName,
 RenameScript
FROM
 AllObjectsToRename
ORDER BY
 SchemaName, TableName, ObjectType, OldName;

ถ้าจะแก้จริง ๆ ให้แน่ใจว่า ชื่อนั้น ๆ ไม่ได้ fixed ไว้ใน code หัวจะปวด งานจะเข้า