3

StackOverflow と Google をしばらく検索しましたが、あまり似たものは見つかりませんでした。ここに私の問題があります。

現在、「Sequence」という名前のデータベース内のすべての列に、値が >=1 であることを保証する制約が関連付けられていることを確認するストアド プロシージャを作成しています。ただし、現在のメソッドは、テーブルだけでなく、「Sequence」を含むすべてのオブジェクトを返します (つまり、「Sequence」を含むストアド プロシージャの取得/設定/削除)。

ここに私の現在のコードがありますが、これはうまくいきますが、私は汚い解決策だと感じています:

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 に答える