كيف أقوم بإجراء بحث حساس لحالة الأحرف واستبداله في SQL 2000/2005؟

StackOverflow https://stackoverflow.com/questions/113901

سؤال

لإجراء بحث/استبدال حساس لحالة الأحرف على جدول في قاعدة بيانات SQL Server 2000/2005، يجب عليك استخدام الترتيب الصحيح.

كيف يمكنك تحديد ما إذا كان الترتيب الافتراضي لقاعدة البيانات حساسًا لحالة الأحرف، وإذا لم يكن كذلك، فكيف يمكنك إجراء بحث/استبدال حساس لحالة الأحرف؟

هل كانت مفيدة؟

المحلول

SELECT testColumn FROM testTable  
    WHERE testColumn COLLATE Latin1_General_CS_AS = 'example' 

SELECT testColumn FROM testTable
    WHERE testColumn COLLATE Latin1_General_CS_AS = 'EXAMPLE' 

SELECT testColumn FROM testTable 
    WHERE testColumn COLLATE Latin1_General_CS_AS = 'eXaMpLe' 

لا تفترض أن الترتيب الافتراضي سيكون حساسًا لحالة الأحرف، ما عليك سوى تحديد حالة حساسة لحالة الأحرف في كل مرة (باستخدام الحالة الصحيحة للغتك بالطبع)

نصائح أخرى

تحديد ما إذا كان الترتيب الافتراضي حساسًا لحالة الأحرف مثل هذا:

select charindex('RESULT', 'If the result is 0 you are in a case-sensitive collation mode')

تشير نتيجة 0 إلى أنك في وضع ترتيب حساس لحالة الأحرف، وتشير 8 إلى أنه غير حساس لحالة الأحرف.

إذا كان الترتيب غير حساس لحالة الأحرف، فستحتاج إلى الإعلان بوضوح عن وضع الترتيب الذي تريد استخدامه عند إجراء بحث/استبدال.

فيما يلي كيفية إنشاء عبارة UPDATE لإجراء بحث/استبدال حساس لحالة الأحرف عن طريق تحديد وضع الترتيب المطلوب استخدامه:

update ContentTable
set ContentValue = replace(ContentValue COLLATE Latin1_General_BIN, 'THECONTENT', 'TheContent')
from StringResource
where charindex('THECONTENT', ContentValue COLLATE Latin1_General_BIN) > 0

هذا سوف يتطابق ويستبدل 'THECONTENT', ، لكن لا 'TheContent' أو 'thecontent'.

اذا كنت تمتلك حالات مختلفة من نفس الكلمة في نفس المجال, ، وأريد فقط استبدال حالات محددة, ، ثم يمكنك استخدام الترتيب في ملفك REPLACE وظيفة:

UPDATE tableName
SET fieldName = 
    REPLACE(
        REPLACE(
            fieldName COLLATE Latin1_General_CS_AS,
            'camelCase' COLLATE Latin1_General_CS_AS,
            'changedWord'
        ),
        'CamelCase' COLLATE Latin1_General_CS_AS,
        'ChangedWord'
    )

سيؤدي هذا إلى:

This is camelCase 1 and this is CamelCase 2

تصبح:

This is changedWord 1 and this is ChangedWord 2

يمكن القيام به في بيانات متعددة.هذا سوف لن اعمل إذا كان لديك سلاسل طويلة تحتوي على كلمات كبيرة وأخرى صغيرة وتنوي استبدالها.قد تحتاج أيضًا إلى استخدام ترتيب مختلف، وهذا يكون حساسًا لحالة الأحرف.

UPDATE T SET [String] = ReplacedString
FROM [dbo].[TranslationText] T, 
    (SELECT [LanguageCode]
      ,[StringNo]
      ,REPLACE([String], 'Favourite','Favorite') ReplacedString
    FROM [dbo].[TranslationText]
    WHERE 
    [String] COLLATE Latin1_General_CS_AS like '%Favourite%'
    AND [LanguageCode] = 'en-us') US_STRINGS
WHERE 
T.[LanguageCode] = US_STRINGS.[LanguageCode] 
AND T.[StringNo] = US_STRINGS.[StringNo]

UPDATE T SET [String] = ReplacedString
FROM [dbo].[TranslationText] T, 
    (SELECT [LanguageCode]
      ,[StringNo]
      , REPLACE([String], 'favourite','favorite') ReplacedString 
    FROM [dbo].[TranslationText]
    WHERE 
    [String] COLLATE Latin1_General_CS_AS like '%favourite%'
    AND [LanguageCode] = 'en-us') US_STRINGS
WHERE 
T.[LanguageCode] = US_STRINGS.[LanguageCode] 
AND T.[StringNo] = US_STRINGS.[StringNo]

أولا وقبل كل شيء التحقق من هذا:http://technet.microsoft.com/en-us/library/ms180175(SQL.90).aspx

سترى أن CI يحدد حساسًا لحالة الأحرف بينما يحدد CS حساسًا لحالة الأحرف.

أيضاً، قد يكون هذا مفيداً.حدد * من fn_helpcollations() - يؤدي هذا إلى الحصول على جميع عمليات الترتيب التي يدعمها خادمك.حدد * من sys.databases - يوجد هنا عمود يحدد الترتيب الذي يحتوي على كل قاعدة بيانات على الخادم الخاص بك.

يمكنك إما تحديد الترتيب في كل مرة تقوم فيها بالاستعلام عن الجدول أو يمكنك تطبيق الترتيب على الأعمدة (الأعمدة) بشكل دائم عن طريق تغيير الجدول.

إذا اخترت استخدام طريقة الاستعلام، فمن المفيد تضمين وسيطات البحث غير الحساسة لحالة الأحرف أيضًا.سترى أن SQL ستختار خطة exec أكثر كفاءة إذا قمت بتضمينها.على سبيل المثال:

SELECT testColumn FROM testTable 
    WHERE testColumn COLLATE Latin1_General_CS_AS = 'eXaMpLe' 
    and testColumn = 'eXaMpLe'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top