SQL Update - только если нет ограничений - PullRequest
0 голосов
/ 11 октября 2019

У меня есть запрос, подобный этому,

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
           WHERE TABLE_NAME = 'Enrollment' AND COLUMN_NAME = 'nosuchfield')
BEGIN
    UPDATE dbo.Enrollment 
    SET nosuchfield='666'
END

Я хочу обновить его, только когда нет ключевых ограничений на него (первичный ключ, ограничения внешнего ключа).

1 Ответ

1 голос
/ 11 октября 2019

При этом используются INFORMATION_SCHEMA объекты, а не sys объекты (последние рекомендуются, но у меня было кое-что для первого), которые должны получить то, что вы ищете:

IF NOT EXISTS (SELECT 1
               FROM  INFORMATION_SCHEMA.COLUMNS ISC 
                     JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC ON ISC.TABLE_SCHEMA = TC.TABLE_SCHEMA
                                                                 AND ISC.TABLE_NAME = TC.TABLE_NAME
                     JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU ON TC.TABLE_SCHEMA = KCU.TABLE_SCHEMA
                                                                 AND TC.TABLE_NAME = KCU.TABLE_NAME
                                                                 AND TC.CONSTRAINT_NAME = KCU.CONSTRAINT_NAME
                                                                 AND ISC.COLUMN_NAME = KCU.COLUMN_NAME
               WHERE ISC.TABLE_SCHEMA = N'dbo' --TABLE_SCHEMA is not always accurate
                 AND ISC.TABLE_NAME = N'Enrollment'
                 AND ISC.COLUMN_NAME = N'nosuchfield'
                 AND TC.CONSTRAINT_TYPE IN ('PRIMARY KEY','FOREIGN KEY'))
    UPDATE dbo.Enrollment
    SET nosuchfield = '666';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...