背景:我们的一些默认列约束是在没有明确名称的情况下生成的,因此我们会得到有趣的名称,这些名称因服务器而异,例如: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()
而不是自己手动应用方括号。在这种情况下,您可能是安全的,但在某些情况下手动方法会中断。您可以测试
PRINT
输出,但如果您的总命令大于 8k,它不一定是完整的(有关一些替代方法,请参阅此提示)。根据您的问题..您已删除“在实例上的某些数据库上自动执行相同的脚本”
以下是可以帮助您的代码