2013-11-28 2 views
3
내가 저장 프로 시저의 IF-그렇지 블록에 두 문자열을 비교해야

같은대소 문자 구분 문자열 비교

If(@USERNAME='rajat') 
begin 
select * from table 
end 
else 
begin 
select * from table1 
end 

그러나 위의 방법으로 문제가 '='비교하는 경우가 insensitive.I 필요 비교가 대/소문자를 구분하는 방식

+0

가능한 [SQL 사례 구분 문자열 비교] (http://stackoverflow.com/questions/3969059/sql-case-sensitive-string-compare) – NickyvV

+0

가능한 복제본. http://stackoverflow.com/questions/3387378/sql-server-queries-case-sensitivity?rq=1 – Tommassiov

+0

대소 문자 구분 기호는 등호와 아무런 관련이 없습니다. 대/소문자 구분은 데이터베이스의 데이터 정렬에 의해 결정됩니다. –

답변

7

SQL Server는 서버, 데이터베이스 및 열 수준에서 대/소문자를 구분합니다. 이 속성은 collation 속성의 일부입니다. 따라서 귀하의 예에서 이러한 설정 중 하나 이상이 대소 문자를 구분하지 않도록 설정되었을 수 있습니다. 이 SQL과 같은

-- Check server collation 
SELECT SERVERPROPERTY('COLLATION') 

-- Check database collation. 
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation; 

-- Check column collation 
select table_name, column_name, collation_name 
from information_schema.columns 
where table_name = @table_name 

무언가가 당신을 위해 일 수 있습니다

If (@USERNAME='rajat' COLLATE Latin1_General_CS_AS) 
..... 
+0

+1 다른 정보없이 작업 코드를 게시하는 대신 대답과 다른 관련 정보에 대한 설명을 실제로 제공합니다. 이것은 Stackoverflow에서 죽어가는 예술로 보입니다. – GarethD

+0

upper() 또는 lower 함수 대신 collate casting을 사용하는 것이 더 효율적입니까? 콜레트는 어떤 문자를 변경하는 데 사용 된 데이터 정렬에 따라 달라질 수 있습니다. –

+0

@MatheseF, 대/소문자 함수는 대소 문자를 구분합니다. 또한 Collate는 정렬 규칙 및 악센트 민감도를 처리합니다. 나는 어느 것이 더 performant인지 모른다. – RoadWarrior

2
If(@USERNAME='rajat' COLLATE Latin1_General_CS_AS) 
begin 
select * from table 
end 
else 
begin 
select * from table1 
end 
1

대소 문자 구분을 강제하는 또 다른 방법은 convert/cast 모두 인수하는 것입니다 varbinary 유형 : -

declare @string1 as varchar(50) = 'abc' 
declare @string2 as varchar(50) = 'ABC' 

if @[email protected] 
    print 'same' 
else 
    print 'different' 

if convert(varbinary(50),@string1)=convert(varbinary(50),@string2) 
    print 'same' 
else 
    print 'different' 

생산 : -

same 
different