3

我已经通过 StackOverflow 和 Google 搜索了一段时间,并没有发现任何太相似的东西,所以这是我的问题:

我目前正在编写一个存储过程来检查名为“Sequence”的数据库中的每一列是否都有一个关联的约束,以确保该值> = 1。但是,我当前的方法返回包含“序列”的所有对象,而不仅仅是表(即获取/设置/删除包含“序列”的存储过程)。

这是我当前的代码,它有效,但我觉得这是一个肮脏的解决方案:

SELECT DISTINCT
  'The Sequence column of the ' + CAST(OBJECT_NAME([AC].[object_id]) AS NVARCHAR(255)) + ' table is missing a Sequence>=1 constraint.' AS MESSAGE
FROM [sys].[all_columns] AC
LEFT JOIN [sys].[check_constraints] CC
ON [CC].[parent_object_id] = [AC].[object_id]
  AND [CC].[name] LIKE '%Sequence'
  AND [CC].[definition] LIKE '%Sequence]>=(1))'
WHERE [AC].[name] = 'Sequence'
  AND [CC].[name] IS NULL
  AND OBJECT_NAME([AC].[object_id]) NOT LIKE '%Get%'
  AND OBJECT_NAME([AC].[object_id]) NOT LIKE '%Set%'
  AND OBJECT_NAME([AC].[object_id]) NOT LIKE '%Delete%'

具体来说,我的问题是:给定 [sys].[all_columns].[object_id],是否有一种简单的方法可以检查给定对象是表还是存储过程?

对此的任何帮助或建议将不胜感激!这里也是一般代码清理,我对 tSQL 比较陌生,所以这可能不是最有效的方法。

谢谢,安德鲁

4

1 回答 1

1

sys.tables您可以在仅与列关联的约束中使用视图和搜索来引用表Sequence

select quotename(schema_name(t.schema_id)) + '.' + quotename(t.name)
from sys.tables t
    join sys.columns c on c.object_id = t.object_id
    left join sys.check_constraints cs on cs.parent_object_id = t.object_id and cs.parent_column_id = c.column_id
        and cs.definition like '%Sequence]>=(1))'
where c.name = 'Sequence' and cs.object_id is NULL

这应该为您提供具有Sequence列但对其没有约束或具有未根据指定规则定义的约束的表。

于 2013-07-19T23:40:53.060 回答