2011-02-23 3 views
3

내가 가진 테이블의 모든 제약 조건을 삭제하려고합니다. 이 작업이 완료동적으로 생성 된 SQL 문을 실행하는 방법

SELECT 'ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']' 
    FROM information_schema.table_constraints 
    WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' 
    AND TABLE_NAME LIKE 'Old_%'' 

, 내가 할 수있는 '이 이후 는 SQL 서버에서 가능하지, 내가 스크립트를 생성 한 선택의 결과로 동적 드롭 문을 만드는 (일 온라인으로 볼 기준) 그것을 파싱하고 루프에서 실행하는 방법을 찾으십시오.

내 시도는이 같은 커서를 만드는 것입니다,하지만 난 그게 각 라인을 실행하기 위해 다음 단서가 없다 :

DECLARE @AlterTables nvarchar(2000) 
SET @AlterTables = 'DECLARE Dyn_cursor CURSOR 
FOR SELECT ''ALTER TABLE '' + TABLE_SCHEMA + ''.['' + TABLE_NAME + ''] DROP CONSTRAINT ['' + CONSTRAINT_NAME + '']'' 
FROM information_schema.table_constraints 
WHERE CONSTRAINT_TYPE = ''FOREIGN KEY'' 
AND TABLE_NAME LIKE ''Old_%''' 
Exec(@AlterTables) 

Open Dyn_Cursor 
    FETCH NEXT FROM Dyn_Cursor INTO @name 
    WHILE @@FETCH_STATUS = 0 
BEGIN 
END 

Close Dyn_cursor 
Deallocate Dyn_cursor 

가 사전에 감사하는위한 솔루션을 것 누구를!

환호

J.

답변

2

당신이 jzd 감사, 그러나 그것은 년후 당신이 추천 한 방식대로 작동하지 않습니다. 커서를 열기 전에 작업중인 선택을 선언해야한다고 생각합니다. 그렇게하기 위해 (웹에서 찾은) 다음과 같은 코드를 업데이트했습니다.

declare @str varchar(max) 
declare cur cursor for 
    SELECT 'ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']' 
    FROM information_schema.table_constraints 
    WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' 
    AND TABLE_NAME LIKE 'Old_%' 
    open cur 
     FETCH NEXT FROM cur INTO @str 
     WHILE (@@fetch_status = 0) 
      BEGIN 
       EXEC (@str) 
       FETCH NEXT FROM cur INTO @str 
      END 
    close cur 
deallocate cur 
0

당신이 가까이 있습니다. 커서가 동적이 아니어야하고 표 제약 조건을 선택해야합니다.

Open Dyn_Cursor 
    FETCH NEXT FROM Dyn_Cursor INTO @name 
    WHILE @@FETCH_STATUS = 0 
BEGIN 
--Add Here 
END 

을 그리고 시작 및 종료 문 사이에 다음과 같이 뭔가를 추가 : 그런 다음 루프 내에서 업데이트를 실행해야합니다, 여기에 코드를 가지고

SET @AlterTable = 'ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] 
DROP CONSTRAINT ['' + @name + '']' 
FROM information_schema.table_constraints 
WHERE CONSTRAINT_TYPE = ''FOREIGN KEY'' 
AND TABLE_NAME LIKE ''Old_%''' 
Exec(@AlterTable) 
FETCH NEXT FROM Dyn_Cursor INTO @name 
관련 문제