web-dev-qa-db-fra.com

Comment trouver si une colonne est référencée dans une colonne calculée?

J'essaie de masser des colonnes de retape. Cela signifie d'abord abandonner et recréer toutes les contraintes dont ils font partie.

J'ai trouvé des colonnes référencées par ces contraintes

  • Clés étrangères,
  • Clés primaires,
  • Index,
  • Vérifiez les contraintes,
  • Des règles,
  • Contraintes par défaut.

Mais je ne trouve pas de colonnes calculées.

J'ai regardé dans INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE, mais cela n'inclut pas les colonnes calculées.

Il y a aussi sys.computed_columns qui montre la définition, mais ne répertorie pas les colonnes de manière interrogeable.

Y a-t-il ailleurs où je peux regarder? Si SQL Server peut comprendre la dépendance, je pensais que je pourrais aussi bien.

6
Zikato

Merci à Scott Hodgin, je l'ai trouvé dans 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

Il y a aussi SYS.COMMUTÉD_COLAUMNS qui montre la définition, mais ne répertorie pas les colonnes de manière interrogeable.

Si je comprends bien, vous voulez trouver quelles colonnes sont référencées par la colonne calculée.

ne solution rechercherait la définition dans sys.computed_columns Avec CHARINDEX() pour chaque colonne où le object_id Correspond à

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;

test rapide

--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;

la requête pour une table spécifique

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');

résultat

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