Sql-Server

生成腳本以自動重命名預設約束

  • May 8, 2020

背景:我們的一些預設列約束是在沒有明確名稱的情況下生成的,因此我們會得到有趣的名稱,這些名稱因伺服器而異,例如:DF__User__TimeZoneIn__5C4D869D

我希望它們都可以通過一致的命名進行管理,DF_Users_TimeZoneInfo這樣我們就可以確保在未來的目標表中存在適當的約束(比如在 RedGate 比較中,甚至只是在視覺上)

我有一個主要適用於我想要的腳本:

select 'sp_rename N''[' + s.name + '].[' + d.name + ']'', 
  N''[DF_' + t.name + '_' + c.name + ']'', ''OBJECT'';'
from sys.tables t
   join
   sys.default_constraints d
       on d.parent_object_id = t.object_id
   join
   sys.columns c
       on c.object_id = t.object_id
       and c.column_id = d.parent_column_id
   join sys.schemas s
       on t.schema_id = s.schema_id
WHERE d.NAME like 'DF[_][_]%'

但這只是給了我一個結果集,而不是我實際上可以傳遞給 exec 之類的東西。

我怎樣才能做到這一點,這樣我就可以執行這些sp_rename腳本,而不必複製所有返回的元素並將它們粘貼到新的查詢視窗中並再次執行它們?嘗試保存盡可能多的擊鍵,以便我可以在許多環境中更正此問題。

在此處輸入圖像描述

好的,有幾件事。

  1. EXEC執行儲存過程時總是使用;速記 withoutEXEC僅在它是批處理中的第一個語句時才有效(這裡不是這種情況)。
  2. 總是使用分號終止符——在這種情況下,它們可以代替漂亮的輸入和縮進,但它們總是明智的。
  3. 始終使用QUOTENAME()而不是自己手動應用方括號。在這種情況下,您可能是安全的,但在某些情況下手動方法會中斷。
  4. 您可以測試PRINT輸出,但如果您的總命令大於 8k,它不一定是完整的(有關一些替代方法,請參閱此提示)。
DECLARE @sql nvarchar(max) = N'';

SELECT @sql += N'EXEC sys.sp_rename N''' 
   + QUOTENAME(s.name) + '.' + QUOTENAME(d.name) 
   + ''', N''DF_' + t.name + '_' + c.name + ''', ''OBJECT'';'
 FROM sys.tables AS t
 INNER JOIN sys.default_constraints AS d
    ON d.parent_object_id = t.object_id
 INNER JOIN sys.columns AS c
    ON c.object_id = t.object_id
   AND c.column_id = d.parent_column_id
 INNER JOIN sys.schemas AS s
    ON t.schema_id = s.schema_id
 WHERE d.NAME LIKE N'DF[_][_]%';

PRINT @sql;
-- EXEC sys.sp_executesql @sql;

引用自:https://dba.stackexchange.com/questions/37383