我有很多数据库,跨越不同的服务器,都包含几十个表,共有一个列。 注意 - 所有数据库都在SQL Server 2008 R2上运行。
我需要检查(并在必要时更改)名为“tblFAC%”的每个表中的值。 该列名为“SOURCE”,值应为“((0))”
这些是系统生成的列,这就是为什么它们都是必需的和(通常)统一的原因。
我发现很偶然,我会看到奇怪的错误条目 - 通常是{blank}或'(0)' - 唯一的解决方法是使用DESIGN打开每个数据库中的每个表查看然后选择“SOURCE”字段并检查默认值,并根据需要进行修改。
因此,我想知道是否有任何类型的脚本检查数据库中名为'tblFAC%'的所有表的'SOURCE'字段的默认值,并将它们设置为'((0))'不管情况如何。
感谢阅读。 克雷格
答案 0 :(得分:0)
这将显示SOURCE
的默认约束未设置为((0))
的所有架构/表:
SELECT s.name AS schema_
, t.name AS table_
, OBJECT_DEFINITION(default_object_id) AS default_value
FROM sys.columns c
JOIN sys.tables t
ON c.object_id = t.object_id
JOIN sys.schemas s
ON t.schema_id = s.schema_id
JOIN sys.default_constraints d
ON c.default_object_id = d.object_id
WHERE t.name LIKE 'tblFAC%'
AND c.name = 'SOURCE'
AND OBJECT_DEFINITION(default_object_id) <> '((0))'
您可以使用上面的内容构建一个alter语句,我认为您必须将其设置为在每台服务器上运行,不确定是否可以查询跨服务器sys表。
更新,红利问题:
没有时间对此进行测试,但要查找未设置约束的位置,您应该只能将其更改为LEFT JOIN
并检查NULL
:
SELECT s.name AS schema_
, t.name AS table_
, OBJECT_DEFINITION(default_object_id) AS default_value
FROM sys.columns c
JOIN sys.tables t
ON c.object_id = t.object_id
JOIN sys.schemas s
ON t.schema_id = s.schema_id
LEFT JOIN sys.default_constraints d
ON c.default_object_id = d.object_id
WHERE t.name LIKE 'tblFAC%'
AND c.name = 'SOURCE'
AND OBJECT_DEFINITION(default_object_id) IS NULL