SQL 2000:T-SQL для получения отношений внешнего ключа для таблицы
-
06-07-2019 - |
Вопрос
Похож, но НЕ ИДЕНТИЧЕН SQL Server 2000 — запрос отношений внешнего ключа таблицы
Мне нужен оператор T-SQL, который будет работать с SQL 2000, который, учитывая имя таблицы, вернет отношения внешнего ключа для этой таблицы, например.
Таблица MyFristTable имеет внешний ключ к MySecondTable, где MyFirstTable.ColA должен находиться в MySecondTable.ColB.Я был бы рад, если бы оператор sql (или сохраненная процедура) запускался для MyFirstTable и возвращал набор результатов в строках
Column | FK_Table | FK_COLUMN
----------------------------------
ColA | MySecondTable | ColB
Примечание::У меня есть образцы для SQL 2005, которые не будут работать, поскольку они полагаются на sys.foreign_key_columns.
Я бы предпочел не анализировать результаты инструкции sp_help.
Спасибо,
Решение
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
ПРИМЕЧАНИЕ Я думаю, что использовал только те системные представления, доступные в SQL 2000 (т.е. sysXXX, а не sys.XXX SQL 2005), но на самом деле я тестировал это только в среде SQL 2005.
Другие советы
Мне пришлось сделать именно это для запроса, и я нашел эту хранимую процедуру после того, как попробовал версию, очень похожую на версию таблицы sys:
exec sp_fkeys @fktable_name = 'foo'
Похоже, это доступно в SQL-сервер 2000.Кроме того, я обнаружил, что в некоторых случаях между этой хранимой процедурой и запросами здесь были незначительные различия.Я предполагаю, что sp_fkeys — каноническая версия.
Однажды мне понадобилось что-то подобное, поэтому я просто посмотрел исходный код системной хранимой процедуры, скопировал то, что мне нужно, в свою собственную процедуру и заставил ее работать так, как мне нужно.
Вы можете посмотреть исходный код sp_helpconstraint...
Я нашел это в Гугле...так что если эта работа не моя заслуга.Надеюсь, это поможет
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