Как мне объединить эти два оператора SQL в один, совместимый с MSSQL 2000 и 2005? - PullRequest
0 голосов
/ 09 апреля 2009

Моя конечная цель - достичь чего-то вроде:

CREATE FOREIGN KEY IF NOT EXISTS FOREIGN KEY

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

У меня есть оператор, который будет возвращать имя FK, если оно существует:

SELECT f.name AS ForeignKey
FROM sys.foreign_keys AS f 
WHERE OBJECT_NAME(f.parent_object_id) = 'myTableName'

И у меня есть утверждение, которое добавляет желаемый внешний ключ:

ALTER TABLE myTableName
WITH CHECK 
ADD CONSTRAINT [FK_myTableName_otherTable] 
FOREIGN KEY([columnName]) 
REFERENCES otherTable ([otherColumn])

Я просто не могу при жизни понять, как объединить их в одно утверждение.

Абсолютно необходимо, чтобы решение работало как в MS SQL 2000, так и в MS SQL 2005.

Ответы [ 3 ]

3 голосов
/ 09 апреля 2009
if not exists (SELECT f.name AS ForeignKey
FROM sys.foreign_keys AS f 
WHERE OBJECT_NAME(f.parent_object_id) = 'myTableName'
)
begin
    ALTER TABLE myTableName
    WITH CHECK 
    ADD CONSTRAINT [FK_myTableName_otherTable] 
    FOREIGN KEY([columnName]) 
    REFERENCES otherTable ([otherColumn])
end
1 голос
/ 09 апреля 2009

sys.foreign_keys был представлен в SQL Server 2005. Вам нужно будет использовать sysobjects , чтобы быть совместимыми с SQL Server 2000 и 2005.

Попробуйте этот SQL:

IF NOT EXISTS (
    SELECT NULL FROM sysobjects 
    WHERE name = 'FK_myTableName_otherTable' 
    AND parent_obj = OBJECT_ID(N'myTableName'))
ALTER TABLE myTableName
WITH CHECK 
ADD CONSTRAINT [FK_myTableName_otherTable] 
FOREIGN KEY([columnName]) 
REFERENCES otherTable ([otherColumn])
0 голосов
/ 09 апреля 2009
if not exists (
    SELECT f.name AS ForeignKey
    FROM sys.foreign_keys AS f 
    WHERE OBJECT_NAME(f.parent_object_id) = 'myTableName') 
begin
    ALTER TABLE myTableName
    WITH CHECK 
    ADD CONSTRAINT [FK_myTableName_otherTable] 
    FOREIGN KEY([columnName]) 
    REFERENCES otherTable ([otherColumn])
end
...