2012-07-24 3 views
3

현재 데이터베이스는 French_CI_AS이므로 대/소문자를 구분하지 않지만 액센트를 구분합니다. French_CI_AI에 데이터베이스의 데이터 정렬을 변경하면 내 문제가 해결 될 것이라고 생각했습니다. 그러나, 나는 여전히 단순한 검색 작업을 할 수 없다. Accent-Insensitive. 확인하고 테이블의 데이터 정렬이 French_CI_AI인데, 아마도 데이터베이스와 함께 변경 되었기 때문일 수 있습니다.검색을 수정하여 SQL Server에서 악센트를 구분하지 않음

모든 데이터베이스에서 악센트를 구분하지 않고 검색 할 수있는 방법이 있습니까? 또는 그와 같은 방식으로 단일 한 해변을 만들 수있는 방법이 있습니까? 나는 그렇게 할 수있는 하나 또는 두 개의 저장 프로 시저 만 필요로합니다.

차이가있을 경우 내가 찾는 데이터 유형은 모두 nvarchar (n)입니다.

감사

+1

당신이 확인 * 열 위치 :

은 INFORMATION_SCHEMA.COLUMNS

당신이 게시물을 참조 할 수 있습니다 구별 DATA_TYPE을 선택? 데이터베이스를 변경해도 기존의 모든 열은 변경되지 않습니다. –

+0

열 자체에 데이터 정렬이 있다는 것을 알지 못했습니다. 나는 그것을 검사 할 것이다.감사합니다. –

+0

그것은 하나의 열과 함께 작동했기 때문에 이제해야 할 일은 모두 제가 사용하는 모든 열을 통과하는 것입니다. 많은 것은 아닙니다. 감사. 당신은 물론 신용을 원한다면 대답으로 의견을하실 수 있습니다! –

답변

4

당신은 당신이 원하는대로 정렬 검색 사용, 예를 들어, 만들 수 있습니다

WHERE column COLLATE FRENCH_CI_AI LIKE '%something%' COLLATE FRENCH_CI_AI 

그러나 실제로 데이터베이스 열 정렬을 변경했을 때 발생하지 않은 열을 수정하면 더 잘 작동한다고 생각됩니다. 어떤 제약과 다른 종속이 문제를 해결하는 방법에의 짧은 대답을 떠나 :

ALTER TABLE dbo.foo ADD newcol NVARCHAR(32) COLLATE FRENCH_CI_AI; 

UPDATE dbo.foo SET newcol = oldcol; 

ALTER TABLE dbo.foo DROP COLUMN oldcol; 

EXEC sp_rename N'dbo.foo.newcol', N'oldcol', 'COLUMN'; 
0

첫째, 데이터베이스 데이터 정렬 들어간 상태 것은 테이블에 기존 열 영향을주지 않고 새로 만든 테이블과 컬럼에 영향을 미칠 것입니다. 데이터베이스에서 새 개체를 만들 때 사용할 기본 데이터 정렬입니다.

그래서 기존 열을 모두 찾고 현재 데이터 정렬을 업데이트해야합니다.

SQL 커서를 사용하여 모든 테이블과 열을 쿼리하고 특정 유형 또는 열 이름에 대한 데이터 정렬을 업데이트 할 수 있습니다. 예를함으로써

:

1)) 미래의 객체

USE master; 
GO 
ALTER DATABASE databasename COLLATE French_CI_AI ; 
GO 

2 데이터 정렬을 변경 특정 열

ALTER TABLE tablenameX ALTER COLUMN LastName varchar(100) COLLATE French_CI_AI NULL 
ALTER TABLE tablenameY ALTER COLUMN FirstName varchar(100) COLLATE French_CI_AI NULL 

3 수동으로 열 정렬을 변경) SQL 스크립트를 생성 커서가있는 상태로

콜라주를 변경할 열을 결정해야합니다 에. 유형, 이름 또는 특정 테이블 일 수 있습니다.

예제에서 caracter 유형을 찾고 바꾸려면 시작 커서를 참조하십시오. 조합은 예상하고있다 *

http://www.codeproject.com/Articles/302405/The-Easy-way-of-changing-Collation-of-all-Database

declare @CollationName as nvarchar = 'Latin1_General_CI_AS' 

declare @tablename as nvarchar(100) = '' 
declare @sqltext as nvarchar(100) = '' 
declare @columnname as nvarchar(200) = '' 
declare @DataType as nvarchar(100) = '' 
declare @CharacterMaxLen as int = 0 
declare @IsNullable as bit = 0 

DECLARE MyTableCursor Cursor 
FOR 
SELECT * from information_schema.TABLES 
      WHERE TABLE_TYPE = 'BASE TABLE' 
OPEN MyTableCursor 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
     DECLARE MyColumnCursor Cursor 
     FOR 
     SELECT COLUMN_NAME,DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, 
      IS_NULLABLE from information_schema.columns 
      WHERE table_name = @TableName AND (Data_Type LIKE '%char%' 
      OR Data_Type LIKE '%text%') AND COLLATION_NAME <> @CollationName 
      ORDER BY ordinal_position 
     Open MyColumnCursor 

     FETCH NEXT FROM MyColumnCursor INTO @ColumnName, @DataType, 
       @CharacterMaxLen, @IsNullable 
     WHILE @@FETCH_STATUS = 0 
      BEGIN 
      SET @SQLText = 'ALTER TABLE ' + @TableName + ' ALTER COLUMN [' + @ColumnName + '] ' + 
       @DataType + '(' + CASE WHEN @CharacterMaxLen = -1 THEN 'MAX' ELSE @CharacterMaxLen END + 
       ') COLLATE ' + @CollationName + ' ' + 
       CASE WHEN @IsNullable = 'NO' THEN 'NOT NULL' ELSE 'NULL' END 
      PRINT @SQLText 

     FETCH NEXT FROM MyColumnCursor INTO @ColumnName, @DataType, 
       @CharacterMaxLen, @IsNullable 
     END 
     CLOSE MyColumnCursor 
     DEALLOCATE MyColumnCursor 

FETCH NEXT FROM MyTableCursor INTO @TableName 
END 
CLOSE MyTableCursor 
DEALLOCATE MyTableCursor 
관련 문제