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
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.
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
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])