我需要在SQL Server 2008中的存储过程中进行区分大小写的比较,但无法确定如何实现它。
我尝试过以下代码:
Declare @andJob varchar(1)
select @andJob = (SELECT szUserdefined6 from inserted )
if @andJob like 'y%'
begin
/* Do Stuff */
end
答案 0 :(得分:0)
答案 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