2013-06-17 2 views
2

У меня есть следующий оператор SQL для получения операторов ограничения на падение.SQL Server 2008 выбрать порядок ограничений по первичному ключу

SELECT DISTINCT 'ALTER TABLE '+TABLE_NAME+' DROP CONSTRAINT '+CONSTRAINT_NAME AS 'DropConstraintStatement' 
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 
WHERE TABLE_NAME = 'USER'; 

В результате этого запроса:

  1. ALTER TABLE ЕДИНИЦЫ DROP CONSTRAINT FK_USER_TASK_ID
  2. ALTER TABLE ЕДИНИЦЫ DROP CONSTRAINT PK_USER
  3. ALTER TABLE ЕДИНИЦЫ DROP CONSTRAINT UQ_USER_NAME_VERSION

Я хочу выполнить эти инструкции в Java-приложении, поэтому мне нужны эти е заявления упорядочены таким образом, что ограничение первичного ключа падения на последнее место, как:

  1. ALTER TABLE ЕДИНИЦА DROP CONSTRAINT FK_USER_TASK_ID
  2. ALTER TABLE ЕДИНИЦА DROP CONSTRAINT UQ_USER_NAME_VERSION
  3. ALTER TABLE ЕДИНИЦА DROP ОГРАНИЧЕНИЯ PK_USER

Есть ли хорошая возможность сделать это с помощью собственного SQL?

ответ

2

INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE не содержит необходимой информации, чтобы различать PK и другие ограничения. Если вы уверены, что ваши имена ПК начинаются с ПК вы можете попробовать добавить ORDER BY так:

ORDER BY CASE WHEN CONSTRAINT_NAME LIKE 'PK%' THEN 1 ELSE 0 END 

Однако, я хотел бы предложить переход на системные представления SQL Server для более точных данных. sys.key_constraints содержит информацию о первичных ключах и уникальных ограничениях и sys.foreign_keys о внешних ключах.

WITH CTE AS 
(
    SELECT OBJECT_NAME(parent_object_id) AS TABLE_NAME 
     , name AS CONSTRAINT_NAME, Type 
    FROM sys.key_constraints 
    WHERE parent_object_id = object_id('YourTable') 

    UNION 

    SELECT OBJECT_NAME(parent_object_id) AS TABLE_NAME 
     , name AS CONSTRAINT_NAME, Type 
    FROM sys.foreign_keys 
    WHERE parent_object_id = object_id('YourTable') 
) 
SELECT 'ALTER TABLE '+TABLE_NAME+' DROP CONSTRAINT '+CONSTRAINT_NAME AS 'DropConstraintStatement' 
FROM CTE 
ORDER BY CASE WHEN Type = 'PK' THEN 1 ELSE 0 END 
+0

Благодарим вас за этот отличный ответ! Он отлично работает для меня. Я просто добавил ограничения проверки соединения тоже, если такой существует для этой таблицы. –

Смежные вопросы