web-dev-qa-db-ja.com

計算列で列が参照されているかどうかを確認するにはどうすればよいですか?

列を大量に再入力しようとしています。つまり、最初に、それらが含まれている制約を削除して再作成します。

これらの制約によって参照される列を見つけました

  • 外部キー、
  • 主キー、
  • インデックス、
  • チェック制約、
  • ルール、
  • デフォルトの制約。

しかし、計算された列が見つかりません。

INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGEを調査しましたが、計算列は含まれていません。

定義を示すsys.computed_columnsもありますが、検索可能な方法で列をリストしません。

他に見れるところはありますか? SQL Serverが依存関係を理解できれば、私もできると思いました。

6
Zikato

Scott Hodginのおかげでsys.sql_expression_dependencies

SELECT 
    OBJECT_NAME(sed.referencing_id)     AS referencingTable
    , pc.[name] AS computedColumn
    , pc.is_computed
    , cc.[name] AS referencedcolumn
    , cc.is_computed
FROM sys.sql_expression_dependencies sed
JOIN sys.[columns] pc ON sed.referencing_minor_id = pc.column_id AND sed.referencing_id = pc.[object_id]
JOIN sys.[columns] cc ON sed.referenced_minor_id = cc.column_id AND sed.referenced_id = cc.[object_id]
WHERE sed.referencing_minor_id > 0      -- referencing object is Column
AND sed.referenced_minor_id > 0         -- referenced object is Column
AND sed.referencing_id = sed.referenced_id  -- references the same table
6
Zikato

定義を示すsys.computed_columnsもありますが、検索可能な方法で列をリストしません。

私が正しく理解している場合は、計算された列によって参照されている列を見つける必要があります。

1つの解決策は、sys.computed_columnsが一致する各列に対してCHARINDEX()を使用してobject_idの定義を検索することです

SELECT DISTINCT c.name, 
                cc.definition 
FROM sys.columns c
CROSS APPLY
(
SELECT definition from sys.computed_columns cc
WHERE c.object_id = cc.object_id
AND CHARINDEX(c.name,cc.definition) > 0
) as cc;

クイックテスト

--Create a heap table.
CREATE TABLE dbo.test(id int,
                      val int);
-- add computed column on two columns.
ALTER TABLE dbo.test 
ADD computedcolumn as id + val;

-- add a column that is not part of any computed column.
ALTER TABLE dbo.test 
ADD bla int;

1つの特定のテーブルのクエリ

SELECT DISTINCT c.name, 
                cc.definition 
FROM sys.columns c
CROSS APPLY
(
SELECT definition from sys.computed_columns cc
WHERE c.object_id = cc.object_id
AND CHARINDEX(c.name,cc.definition) > 0
) as cc
where c.object_id = object_id('dbo.test');

結果

name    definition
id  ([id]+[val])
val ([id]+[val])
3
Randi Vertongen