К сожалению, в SQL Server 2005 это не очень просто. Я немного поиграл с этим, и это очень близко, но это зависит от того факта, что вы называете свои столбцы в своем представлении точно так же, как они названы в базовой таблице. Это связано с тем, что представление sys.sql_dependencies, которое сейчас не рекомендуется использовать в SQL-Server-2008, неправильно хранит ссылку на column_id, поэтому нет никакого способа сопоставить его с фактическими столбцами в представлении. Я думаю, что у SQL Server 2008 будут лучшие варианты для вас, поскольку они снова представили новый набор объектов зависимостей. Я также не искал пути с INFORMATION_SCHEMA.KEY_COLUMN_USAGE, но так как эти представления основаны исключительно на именах, а не на идентификаторах, вы, вероятно, находитесь в одном и том же списке. Так что, возможно, это может быть началом для вас, но, как я уже сказал, это будет охватывать только простые случаи. Если вы используете псевдонимы для своих столбцов, вам не повезет. Может быть, кто-то еще, кто разберется в тонкостях того, как на эти вещи ссылаются, вытащит кролика и выяснит, как ссылаться на несовпадающие столбцы ...
-- very simple; one-column key:
CREATE TABLE dbo.boo
(
far INT PRIMARY KEY
);
GO
CREATE VIEW dbo.view_boo
AS
SELECT far FROM dbo.boo;
GO
-- slightly more complex. Two-column key,
-- not all columns are in key, view columns
-- are in different order:
CREATE TABLE dbo.foo
(
splunge INT,
a INT,
mort INT,
PRIMARY KEY(splunge, mort)
);
GO
CREATE VIEW dbo.view_foo
AS
SELECT
splunge,
mort,
a
FROM
dbo.foo;
GO
SELECT
QUOTENAME(OBJECT_SCHEMA_NAME(v.[object_id])) + '.'
+ QUOTENAME(v.name) + '.' + QUOTENAME(vc.name)
+ ' references '
+ QUOTENAME(OBJECT_SCHEMA_NAME(t.[object_id]))
+ '.' + QUOTENAME(t.name) + '.' + QUOTENAME(tc.name)
FROM
sys.views AS v
INNER JOIN
sys.sql_dependencies AS d
ON v.[object_id] = d.[object_id]
INNER JOIN
sys.tables AS t
ON d.referenced_major_id = t.[object_id]
INNER JOIN
sys.columns AS tc
ON tc.[object_id] = t.[object_id]
INNER JOIN
sys.index_columns AS ic
ON tc.[object_id] = ic.[object_id]
AND tc.column_id = ic.column_id
AND tc.column_id = d.referenced_minor_id
INNER JOIN
sys.columns AS vc
ON vc.[object_id] = v.[object_id]
AND vc.name = tc.name -- the part I don't like
INNER JOIN
sys.indexes AS i
ON ic.[object_id] = i.[object_id]
AND i.is_primary_key = 1
ORDER BY
t.name,
ic.key_ordinal;
GO
DROP VIEW dbo.view_boo, dbo.view_foo;
DROP TABLE dbo.foo, dbo.boo;