समस्या:
कारण:कॉलम 'नाम' में केस-संवेदी नहीं है (CI
) संयोजन।
समाधान:आपको एक CS
. का उपयोग करना होगा मिलान:SELECT * FROM fn_helpcollations() WHERE description LIKE N'%case-sensitive%'
.
नोट:एक डेटाबेस संयोजन और स्तंभ स्तर का संयोजन है। और, एक सर्वर स्तर का मिलान भी है।
SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation') AS DatabaseCollation
/*
-- Sample output (my database)
DatabaseCollation
----------------------------
SQL_Latin1_General_CP1_CI_AS
*/
SELECT col.collation_name AS ColumnCollation
FROM sys.columns col
WHERE col.object_id = OBJECT_ID(N'dbo.Table_2')
AND col.name = N'Name'
/*
-- Sample output (my database)
ColumnCollation
----------------------------
SQL_Latin1_General_CP1_CI_AS
*/
बस डेटाबेस कोलेशन बदलने से नहीं मौजूदा उपयोगकर्ता तालिकाओं और स्तंभों के लिए संयोजन बदलें:
डेटाबेस संयोजन बदलने के बाद , उपरोक्त प्रश्नों का आउटपुट होगा:
/*
DatabaseCollation -- changed
----------------------------
SQL_Latin1_General_CP1_CS_AS
*/
/*
ColumnCollation -- no change
----------------------------
SQL_Latin1_General_CP1_CI_AS
*/
और, जैसा कि आप कॉलम Name
. का संयोजन देख सकते हैं सीआई रहता है।
अधिक, डेटाबेस संयोजन बदलने से केवल नए बनाए गए टेबल और कॉलम प्रभावित होंगे। इस प्रकार, डेटाबेस संयोजन बदलने से अजीब परिणाम उत्पन्न हो सकते हैं (मेरी राय में) ) क्योंकि कुछ [N][VAR]CHAR
कॉलम CI होंगे और नए कॉलम CS होंगे।
विस्तृत समाधान # 1:यदि कॉलम Name
. के लिए बस कुछ प्रश्न हैं CS
होना चाहिए फिर मैं WHERE
. को फिर से लिखूंगा इन प्रश्नों का खंड इस प्रकार:
SELECT Name
FROM dbo.Table_2
WHERE Name LIKE 'Joe' AND Name LIKE 'Joe' COLLATE SQL_Latin1_General_CP1_CS_AS
यह एक Index Seek
करने के लिए SQL सर्वर में बदलाव देगा कॉलम पर Name
(इसमें कॉलम Name
. पर एक इंडेक्स है ) साथ ही, निष्पादन योजना में एक अंतर्निहित रूपांतरण शामिल होगा (देखें Predicate
Index Seek
. के लिए प्रॉपर्टी ) निम्नलिखित विधेय के कारण Name = N'Joe' COLLATE SQL_Latin1_General_CP1_CS_AS
।
विस्तृत समाधान #2:यदि कॉलम Name
. के लिए सभी क्वेरीज़ सीएस होने की जरूरत है तो मैं केवल कॉलम Name
के लिए संयोजन बदलूंगा इस प्रकार:
-- Drop all objects that depends on this column (ex. indexes, constraints, defaults)
DROP INDEX IX_Table_2_Name ON dbo.Table_2
-- Change column's collation
ALTER TABLE dbo.Table_2
ALTER COLUMN Name VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CS_AS
-- Replace VARCHAR(50) with proper data type and max. length
-- Replace COLLATE SQL_Latin1_General_CP1_CS_AS with the right CS collation
-- Recreate all objects that depends on column Name (ex. indexes, constraints, defaults)
CREATE INDEX IX_Table_2_Name ON dbo.Table_2 (Name)
-- Test query
SELECT Name
FROM dbo.Table_2
WHERE Name LIKE 'Joe'