2009-04-20 31 views

Trả lời

7

Một giải pháp from a search: (Edited cho những hạn chế mặc định)

SET NOCOUNT ON 

DECLARE @constraintname SYSNAME, @objectid int, 
      @sqlcmd   VARCHAR(1024) 

DECLARE CONSTRAINTSCURSOR CURSOR FOR 
SELECT NAME, object_id 
FROM SYS.OBJECTS 
WHERE TYPE = 'D' AND @objectid = OBJECT_ID('Mytable') 

OPEN CONSTRAINTSCURSOR 

FETCH NEXT FROM CONSTRAINTSCURSOR 
INTO @constraintname, @objectid 

WHILE (@@FETCH_STATUS = 0) 
BEGIN 
    SELECT @sqlcmd = 'ALTER TABLE ' + OBJECT_NAME(@objectid) + ' DROP CONSTRAINT ' + @constraintname 
    EXEC(@sqlcmd) 
    FETCH NEXT FROM CONSTRAINTSCURSOR 
    INTO @constraintname, @objectid 
END 

CLOSE CONSTRAINTSCURSOR 
DEALLOCATE CONSTRAINTSCURSOR 
+0

thay đổi OBJECT_NAME thành PARENT_OBJECT_NAME hoạt động tốt hơnx. –

+0

Truy vấn tốt. Tôi sẽ thực hiện một chỉnh sửa mặc dù. Việc khai báo con trỏ phải là: SELECT NAME, parent_object_id FROM SYS.OBJECTS WHERE TYPE = 'D' AND parent_object_id = OBJECT_ID ('Mytable') –

0

Chỉ cần tại sao bạn muốn làm điều này? Giảm ràng buộc là một hành động khá quyết liệt và ảnh hưởng đến tất cả người dùng không chỉ là quá trình của bạn. Có thể vấn đề của bạn có thể được giải quyết theo một cách khác. Nếu bạn không phải là dba của hệ thống, bạn nên suy nghĩ rất nhiều về việc bạn nên làm điều này. (Tất nhiên trong hầu hết các hệ thống, một dba sẽ không cho phép bất kỳ ai khác quyền làm điều đó.)

+2

Tôi đang sử dụng một số trường cần hỗ trợ Unicode và tôi không tìm thấy bất kỳ cách nào khác của làm điều này. do đó tôi đang thay đổi kiểu dữ liệu của các cột và trong quá trình thả các ràng buộc và tạo lại chúng ....... –

4

Tôi biết điều này là cũ, nhưng tôi chỉ tìm thấy nó khi googling. Một giải pháp mà làm việc cho tôi trong SQL 2008 (không chắc chắn về 2005) mà không cần đến con trỏ là dưới đây:

declare @sql nvarchar(max) 

set @sql = '' 

select @sql = @sql + 'alter table YourTable drop constraint ' + name + ';' 
from sys.default_constraints 
where parent_object_id = object_id('YourTable') 
AND type = 'D' 

exec sp_executesql @sql 
+0

Điều này chỉ xóa ràng buộc được tìm thấy đầu tiên (ít nhất đó là những gì nó đã làm với tôi). Bạn phải lặp qua tất cả chúng. –

+0

@Ioana Marcu: Làm việc cho tôi trên cơ sở dữ liệu SQL 2008. Tôi nhận được một chuỗi tương tự như dưới đây cho bảng gọi là 'Tài khoản' thay đổi giới hạn thả tài khoản bảng DF__Account__Account__4865BE2A; thay đổi giới hạn thả tài khoản bảng DF__Account__Account__4959E263 tức là một loạt các câu lệnh thả nối – PabloInNZ

Các vấn đề liên quan