Sql-Server
生成腳本以自動重命名預設約束
背景:我們的一些預設列約束是在沒有明確名稱的情況下生成的,因此我們會得到有趣的名稱,這些名稱因伺服器而異,例如:
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
腳本,而不必複製所有返回的元素並將它們粘貼到新的查詢視窗中並再次執行它們?嘗試保存盡可能多的擊鍵,以便我可以在許多環境中更正此問題。
好的,有幾件事。
EXEC
執行儲存過程時總是使用;速記 withoutEXEC
僅在它是批處理中的第一個語句時才有效(這裡不是這種情況)。- 總是使用分號終止符——在這種情況下,它們可以代替漂亮的輸入和縮進,但它們總是明智的。
- 始終使用
QUOTENAME()
而不是自己手動應用方括號。在這種情況下,您可能是安全的,但在某些情況下手動方法會中斷。- 您可以測試
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;