存储过程中的区分大小写的变量/字符串文字比较

时间:2014-04-01 09:13:55

标签: sql-server sql-server-2008 tsql collation case-sensitive

我需要在SQL Server 2008中的存储过程中进行区分大小写的比较,但无法确定如何实现它。

我尝试过以下代码:

Declare @andJob  varchar(1)

select @andJob = (SELECT szUserdefined6 from inserted ) 

if  @andJob like 'y%'
begin
  /* Do Stuff */
end

3 个答案:

答案 0 :(得分:0)

您可以使用COLLATION选项来实现此目的。例如。Link 进一步可以在MSDN找到排序规则选项列表。

答案 1 :(得分:0)

可能宣布整理将完成这项工作。看看这两个问题,找到详细的解释:

SQL Case Sensitive String Compare

SQL server ignore case in a where expression

这些答案中的一个能解决您的问题吗?

答案 2 :(得分:0)

问题很简单,字符串文字/常量和变量(包括参数)使用当前数据库的默认排序规则。使用列时,将使用列的排序规则。在这里,您将列中的值存储到变量中,因此列的排序不再重要。

由于您显然位于具有不区分大小写的默认排序规则的数据库中,因此您需要指定COLLATE关键字作为该比较的一部分。含义:

IF ( @andJob LIKE 'y%' COLLATE Latin1_General_CS_AI )

这将覆盖使用数据库的排序规则进行比较的默认行为。

例如:

IF (DB_ID(N'CaseInsensitive') IS NULL)
BEGIN
  CREATE DATABASE [CaseInsensitive] COLLATE Latin1_General_100_CI_AS;
  ALTER DATABASE [CaseInsensitive] SET RECOVERY SIMPLE;
END;
GO

USE [CaseInsensitive];

SELECT 1 WHERE 'YES' LIKE 'y%';
-- 1

SELECT 2 WHERE 'YES' LIKE 'y%' COLLATE Latin1_General_100_CS_AS;
-- (nothing)


/* -- Clean up:
USE [master];
DROP DATABASE [CaseInsensitive];
*/

此外,您将变量声明为varchar(1),这看起来有点小。它会将szUserdefined6中的任何值截断为第一个字符,并且我不确定这是否是预期的行为。

另外,在触发器中执行select @andJob = (SELECT szUserdefined6 from inserted )时,您需要非常小心。从多行DML操作执行的触发器将在inserted和/或deleted表中的每个受影响的行中具有一行。你在这里做的只捕获inserted表中最后一行的值,因此它只有在从不多行INSERT或{{ 1}}反对这个表。

有关归类,编码等的更多信息,请访问:Collations Info