問題
SQL Server為你提供了在你的數據庫中存儲混合大小寫數據的能力,但是根據你怎樣創建數據庫,SQL Server將在你給出T-SQL命令時忽視大小寫。你可能面對的一個問題是你想從一個表獲得只包含不同值的列表,來顯示你的表中不同,但是如果你的數據庫是按照不區分大小寫來建立的,那麼DISTINCT條件語句不會顯示這些不同,它只會將所有的值放在一起。所以在這方面有什麼選擇嗎?
專家解答
為了說明這個動作,我們將使用一個區分大小寫和一個不區分大小寫的數據庫來看看它工作的兩種方式。
第一組查詢使用了AdventureWorks數據庫,它被配置為區分大小寫。為了得到從你的數據庫而來的集合,你可以運行這個查詢:
SELECT name, collation_name
FROM master.sys.databases
我們將查詢AdventureWorks數據庫中的Preson.Contact的數據。所有的數據都是作為混合大小寫來建立的,所以當我們運行這個查詢的時候我們沒有得到重復的值。
SELECT DISTINCT TOP 10 FirstName
FROM Person.Contact
WHERE FirstName LIKE 'A%'
ORDER BY 1
如果你更新一條記錄並將FirstName從“Adam”改為“ADAM”,那麼當運行這個查詢時我們會獲得兩個不同的值。
UPDATE Person.Contact
SET FirstName = 'ADAM'
WHERE ContactID = 62
GO
SELECT DISTINCT TOP 10 FirstName
FROM Person.Contact
WHERE FirstName LIKE 'A%'
ORDER BY 1
正如你看到的,現在“Adam”和“ADAM”作為不同的值來顯示。
下一步我們將要做的是在一個不區分大小寫的數據庫中創建一個新表然後從Person.Contact加載所有的數據到這個新表中。
CREATE TABLE Test.dbo.contact (FirstName nvarchar(50))
GO
INSERT INTO Test.dbo.contact
SELECT FirstName FROM Person.Contact
GO
SELECT DISTINCT TOP 10 FirstName
FROM Test.dbo.contact
WHERE FirstName LIKE 'A%'
ORDER BY 1
GO
當我們運行SELECT查詢時你可以看到輸出將“Adam”和“ADAM”結合起來,因為不區分大小寫。