SQL 2000: T-SQL للحصول على علاقات المفاتيح الخارجية لجدول
-
06-07-2019 - |
سؤال
وعلى غرار كنها ليست متطابقة إلى SQL خادم 2000 - سؤال ل علاقات المفاتيح الخارجية الجدول
وأنا في حاجة الى بيان T-SQL التي ستعمل SQL 2000 أن يطلق عليها اسم الجدول، سيعود علاقات المفاتيح الخارجية لهذا الجدول منها مثلا.
والجدول MyFristTable لديه المفتاح الخارجي إلى MySecondTable، حيث يجب أن يكون MyFirstTable.ColA في MySecondTable.ColB. سأكون سعيدا، وإذا ركض عبارة SQL (أو بروك المخزنة) لMyFirstTable وعاد نتيجة تعيين على خطوط
Column | FK_Table | FK_COLUMN
----------------------------------
ColA | MySecondTable | ColB
على NB : للدي عينات ل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 environemnt.
نصائح أخرى
وكان علي أن أفعل هذا الشيء بالضبط للاستعلام، ولقد وجدت هذا الإجراء المخزن، بعد محاولة إصدار مثل الكثير من تميز الكلية طاولة واحدة:
exec sp_fkeys @fktable_name = 'foo'
ويبدو أن هذا هو متاح في 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