SQL 2000: T-SQL, чтобы получить отношения внешнего ключа для таблицы

Подобный, но НЕ ИДЕНТИКАЛЬНЫЙ дляSQL Server 2000 - запрос взаимосвязи внешнего ключа таблицы

Мне нужен оператор T-SQL, который будет работать в SQL 2000 с заданным именем таблицы и будет возвращать отношения внешнего ключа для этой таблицы, например.

Таблица MyFristTable имеет внешний ключ для MySecondTable, где MyFirstTable.ColA должен быть в MySecondTable.ColB. Я был бы рад, если бы оператор SQL (или хранимый процесс) выполнялся для MyFirstTable и возвращал набор результатов в строках

<code>Column | FK_Table      | FK_COLUMN
----------------------------------
ColA   | MySecondTable | ColB
</code>

NB: У меня есть образцы для SQL 2005, которые не будут работать, потому что они полагаются на sys.foreign_key_columns

Я бы предпочел не разбирать результаты оператора sp_help.

Спасибо,

Ответы на вопрос(4)

поэтому я просто посмотрел исходный код системной хранимой процедуры, скопировал то, что мне было нужно, в свою собственную процедуру и заставил ее работать так, как мне нужно.

Вы можете посмотреть на исходный код sp_helpconstraint ...

 Binary Worrier22 июн. 2009 г., 14:13
+1 за предложение взглянуть на источник системного процесса, который никогда бы не пришёл мне в голову. Спасибо друг.

и я нашел эту хранимую процедуру, после того, как попробовал версию, очень похожую на таблицу sys:

exec sp_fkeys @fktable_name = 'foo'

Похоже, это доступно вSQL Server 2000. Also, I found that in a few cases there were minor differences between this stored proc and the queries here. I'm guessing sp_fkeys is the canonical version.

 13 мар. 2010 г., 04:25
@Ogre: я опоздал на несколько месяцев. :)
 15 мар. 2010 г., 21:15
Ну, за то, что это стоит, это помогло мне и, надеюсь, поможет будущим ищущим ответов.
 10 мар. 2010 г., 22:58
Ничего себе, я действительно не могу понять, почему за это больше не проголосовали! Brilliant! Я бы предпочел выполнить один довольно хорошо названный хранимый процесс, чем пытаться набрать огромный запрос, чтобы получить это.

если эта работа не моя заслуга. Надеюсь, это поможет

 SELECT 
        FK_Table  = FK.TABLE_NAME, 
        FK_Column = CU.COLUMN_NAME, 
        PK_Table  = PK.TABLE_NAME, 
        PK_Column = PT.COLUMN_NAME, 
        Constraint_Name = C.CONSTRAINT_NAME 
    FROM 
        INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
        INNER JOIN 
        INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK 
            ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
        INNER JOIN 
        INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK 
            ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME 
        INNER JOIN 
        INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU 
            ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME 
        INNER JOIN 
        ( 
            SELECT 
                i1.TABLE_NAME, i2.COLUMN_NAME 
            FROM 
                INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1 
                INNER JOIN 
                INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 
                ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
                WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY' 
        ) PT 
        ON PT.TABLE_NAME = PK.TABLE_NAME 

    WHERE PK.TABLE_NAME='something'    -- the table for you are asking
 22 июн. 2009 г., 13:55
& Quot; // & Quot; не является комментарием, & quot; - & quot; является...
 22 июн. 2009 г., 14:00
+1: мой ответ был неполным, так что я удалил свой,
 22 июн. 2009 г., 13:53
Ограничения FK могут не ссылаться на PK в другой таблице: может использоваться любое уникальное ограничение.
 Binary Worrier22 июн. 2009 г., 14:12
У меня не работает, но все равно спасибо
Решение Вопроса
DECLARE @tableName sysname

SET @tableName = '' -- Your table name goes here

SELECT
    c.name
    , target.name
    , targetc.name
FROM
    -- source table
    sysobjects t
    -- source column
    INNER JOIN syscolumns c ON t.id = c.id
    -- general constraint
    INNER JOIN sysconstraints co ON t.id = co.id AND co.colid = c.colid
    -- foreign key constraint
    INNER JOIN sysforeignkeys fk ON co.constid = fk.constid
    -- target table
    INNER JOIN sysobjects target ON fk.rkeyid = target.id
    -- target column
    INNER JOIN syscolumns targetc ON fk.rkey = targetc.colid AND fk.rkeyid = targetc.id
WHERE
    t.name = @tableName

NOTE Я думаю, я использовал только те системные представления, которые доступны в SQL 2000 (то есть sysXXX, а не sys.XXX в SQL 2005), но на самом деле я проверял это только в среде SQL 2005.

 18 окт. 2016 г., 18:19
Это не включает отношения с ключами, состоящими из нескольких столбцов
 Binary Worrier22 июн. 2009 г., 14:11
Отлично, именно то, что я искал, спасибо приятель

Ваш ответ на вопрос