Как определить столбцы PK в представлении - PullRequest
1 голос
/ 13 ноября 2009

Раньше я использовал GetSchemaTable для чтения информации о схеме, но в ней отсутствовали некоторые «вещи», поэтому я написал большой запрос, ссылаясь, среди прочего, на sys.columns, sys.index_columns и sys.indexes ( и другие таблицы), чтобы вернуть ту же информацию, которую я использовал для получения из GetSchemaTable, а также вернуть другую информацию, которую я хочу.

Проблема в том, что GetSchemaTable скажет мне, если столбец, возвращаемый из представления, является столбцом Key из базовых таблиц, а мой новый запрос - нет. Это даст мне правильный ответ в течение всего дня для таблиц, но не для представлений.

У кого-нибудь есть решение этого? Я бы не хотел возвращаться в GetSchemaTable только для того, чтобы получить информацию, когда я проверяю представление. (Плюс, я действительно просто хочу решение на основе SQL, в идеале.)

Спасибо!

1 Ответ

1 голос
/ 13 ноября 2009

К сожалению, в 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...