2011-12-28 8 views
5

SQL Server 2008 R2에서 작업 중이며 데이터베이스의 여러 테이블에있는 여러 열에 제약 조건을 추가하는 저장 프로 시저를 작성했습니다. 그러나 열의 인덱스로 인해 특정 열을 기본 키로 설정할 수 없기 때문에 저장 프로 시저가 실패하는 것으로 나타났습니다. 이것은 다양한 테이블의 많은 열의 경우입니다.열이 인덱싱 될 때 ALTER COLUMN이 NULL이 아닌 방법은 무엇입니까

열을 삭제하지 않고 ALTER COLUMN을 NOT NULL로 설정하고 PRIMARY KEY로 설정하는 방법이 있습니까? 그렇지 않으면 인덱스를 비활성화하거나 삭제 한 다음 ALTER COLUMN 문 다음에 인덱스를 다시 활성화하거나 활성화하는 것이 좋습니다.

+1

인덱스를 삭제하고 다시 만들어야합니다. SSMS에서 색인을 마우스 오른쪽 단추로 클릭 한 다음 "색인 색인" – Andomar

+0

@Andomar를 클릭하여 두 작업을 모두 스크립팅 할 수 있습니다. 응답 해 주셔서 감사합니다. 이 작업을 저장 프로 시저에서 동적으로 수행 할 수 있습니까? 앞에서 언급했듯이 많은 테이블에서 많은 열이 발생합니다. 어쨌든 그것을 변경하기 전에 필드에서 인덱스를 프로그램 적으로 확인하고, 인덱스를 삭제하고, 나중에 다시 작성 하시겠습니까? – Brian

+1

이 블로그 게시물을 시작해야합니다. http://blog.sqlauthority.com/2009/07/23/sql-server-puzzle-write-script-to-generate-primary-key-and-foreign-key/ – Andomar

답변

2

의견을 보내 주셔서 감사합니다. 몇 가지 조사를 한 후에, @mwigdahl이 언급 한 정확한 테이블을 사용하여이를 동적으로 수행하는 방법을 결정할 수있었습니다. 코드 아래를 참조

DECLARE @indexName nvarchar(254), 
    @tableName nvarchar(254), 
    @indexType nvarchar(254), 
    @columnName nvarchar(254), 
    @isPadded integer, 
    @ignore_dup_key integer, 
    @allow_row_locks integer, 
    @allow_page_locks integer, 
    @fillFactor integer 

SELECT 
    @indexName = i.name, 
    @tableName = o.name, 
    @indexType = i.type_desc, 
    @columnName = co.[name], 
    @isPadded = i.is_padded, 
    @ignore_dup_key = i.[ignore_dup_key], 
    @allow_row_locks = i.[allow_row_locks], 
    @allow_page_locks = i.[allow_page_locks], 
    @fillFactor = i.fill_factor 
FROM sys.indexes AS i 
    INNER JOIN sys.objects AS o ON i.object_id = o.object_id 
    INNER JOIN sys.index_columns ic on ic.object_id = i.object_id AND ic.index_id = i.index_id 
    INNER JOIN sys.columns co on co.object_id = i.object_id AND co.column_id = ic.column_id 
WHERE 
    i.[type] = 2 AND 
    o.[type] = 'U' 

DECLARE @sql varchar(max) 

SET @sql = 'DROP INDEX [' + @indexName + '] ON [' + @tableName + ']' 

EXEC (@sql) 

PRINT 'Dropped Index' 

-- Do work here 

DECLARE @pad_index nvarchar(3), 
    @ignore_dup nvarchar(3), 
    @row_locks nvarchar(3), 
    @page_locks nvarchar(3) 

IF @isPadded = 0 SET @pad_index = 'OFF' 
ELSE SET @pad_index = 'ON' 

IF @ignore_dup_key = 0 SET @ignore_dup = 'OFF' 
ELSE SET @ignore_dup = 'ON' 

IF @allow_row_locks = 0 SET @row_locks = 'OFF' 
ELSE SET @row_locks = 'ON' 

IF @allow_page_locks = 0 SET @page_locks = 'OFF' 
ELSE SET @page_locks = 'ON' 

SET @sql = 'CREATE ' + @indexType + ' INDEX [' + @indexName + '] ON [' + @tableName + ']' + 
    '(' + 
    '[' + @columnName + '] ASC' + 
    ') WITH (' + 
    'PAD_INDEX = ' + @pad_index + ',' + 
    'STATISTICS_NORECOMPUTE = OFF,' + 
    'SORT_IN_TEMPDB = OFF,' + 
    'IGNORE_DUP_KEY = ' + @ignore_dup + ',' + 
    'DROP_EXISTING = OFF,' + 
    'ONLINE = OFF,' + 
    'ALLOW_ROW_LOCKS = ' + @row_locks + ',' + 
    'ALLOW_PAGE_LOCKS = ' + @page_locks + ',' + 
    'FILLFACTOR = ' + CONVERT(nvarchar(100),@fillFactor) + ')' + 
    'ON [PRIMARY]' 

PRINT @sql 

EXEC (@sql) 

PRINT 'Created Index' 

나는 인덱스는 T-SQL에서 만들어집니다 방식을 볼 수 SSMS에서 Script Index As 기능을 사용했다.

그런 다음 sys.indexessys.index_columns 테이블을 쿼리하여 사용 가능한 속성을 확인했습니다.

이 코드는 이러한 속성을 변수에 저장 한 다음 인덱스를 삭제하고 다시 만드는 테이블에 대한 쿼리를 보여줍니다. 하드 코딩해야했던 테이블에는 사용할 수 없었던 몇 가지 옵션이있었습니다. 그 옵션이 시스템 테이블의 어딘가에서 사용 가능한지 아는 사람 있습니까?

앞으로 도움이되기를 바랍니다.

관련 문제