2013-11-28 161 views
3

我需要兩個字符串中的if-else塊的存儲過程中比較如區分大小寫字符串比較

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屬性的一部分。因此,在您的示例中,可能有一個或多個這些設置已設置爲不區分大小寫。

-- 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 

事情是這樣的SQL可能會爲你工作:

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

+1爲了實際提供答案的解釋和其他相關信息,而不是僅發佈沒有其他信息的工作代碼。這似乎是一個在Stackoverflow上垂死的藝術。 – GarethD

+0

使用分頁轉換而不是使用upper()或更低的函數更高效嗎?和collat​​e可以根據排序規則使用問題來改變某些字符 –

+0

@MatheseF,上/下函數只處理區分大小寫。 Collat​​e還處理排序規則和口音敏感度。我不知道哪個更高性能。 – 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