为了对SQL Server 2000/2005数据库中的表执行区分大小写的搜索/替换,您必须使用正确的排序规则。
如何确定数据库的默认排序规则是否区分大小写,如果不是,则如何执行区分大小写的搜索/替换?
答案 0 :(得分:13)
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'
不要假设默认排序规则区分大小写,只需每次都指定一个区分大小写(当然使用正确的语言)
答案 1 :(得分:8)
确定默认排序规则是否区分大小写,如下所示:
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'
。
答案 2 :(得分:1)
可以在多个语句中完成。 如果您的长字符串同时包含您要替换的大写单词,则将不会。 您可能还需要使用不同的排序规则,这是重音和区分大小写的。
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]
答案 3 :(得分:0)
首先检查一下: http://technet.microsoft.com/en-us/library/ms180175(SQL.90).aspx
您将看到CI指定不区分大小写,CS指定区分大小写。
答案 4 :(得分:0)
此外,这可能是有用的。 select * from fn_helpcollations() - 这将获得服务器支持的所有排序规则。 select * from sys.databases - 这里有一个列,指定服务器上每个数据库的排序规则。
答案 5 :(得分:0)
您可以在每次查询表时指定排序规则,也可以通过更改表永久地将排序规则应用于列。
如果您确实选择执行查询方法,那么包含不区分大小写的搜索参数也是有益的。如果包含SQL,您将看到SQL将选择更高效的exec计划。例如:
SELECT testColumn FROM testTable
WHERE testColumn COLLATE Latin1_General_CS_AS = 'eXaMpLe'
and testColumn = 'eXaMpLe'