Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर जैसे क्वेरी केस संवेदी नहीं है

समस्या:

कारण:कॉलम 'नाम' में केस-संवेदी नहीं है (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'



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. चुनिंदा क्वेरी में ऑटो इंक्रीमेंट फ़ील्ड कैसे जनरेट करें?

  2. SQL सर्वर इंस्टेंस के सभी डेटाबेस में प्राथमिक कुंजी बाधा के बिना तालिकाओं की सूची कैसे प्राप्त करें - SQL सर्वर / TSQL ट्यूटोरियल भाग 62

  3. सभी गैर-संकुल अनुक्रमणिका अक्षम करें

  4. SQL सर्वर प्रबंधन स्टूडियो - TSQL कोडिंग प्रक्रिया में सुधार के लिए टिप्स

  5. अमान्य ऑब्जेक्ट नाम SQL Server 2008 R2 - संग्रहीत कार्यविधि