Sql server 使用计数的sql server意外输出

Sql server 使用计数的sql server意外输出,sql-server,Sql Server,我正在使用sql server 2012 查询是: CREATE TABLE TEST ( NAME VARCHAR(20) ); INSERT TEST ( NAME ) SELECT NULL UNION ALL SELECT 'James' UNION ALL SELECT 'JAMES' UNION ALL SELECT 'Eric'; SEL

我正在使用sql server 2012

查询是:

CREATE TABLE TEST ( NAME VARCHAR(20) );
INSERT TEST
        ( NAME
        )
        SELECT NULL
        UNION ALL
        SELECT 'James'
        UNION ALL
        SELECT 'JAMES'
        UNION ALL
        SELECT 'Eric';

SELECT NAME
      , COUNT(NAME) AS T1
      , COUNT(COALESCE(NULL, '')) T2
      , COUNT(ISNULL(NAME, NULL)) T3
      , COUNT(DISTINCT ( Name )) T4
      , COUNT(DISTINCT ( COALESCE(NULL, '') )) T5
      , @@ROWCOUNT T6
    FROM TEST
    GROUP BY Name;
DROP TABLE TEST;
在结果集中没有“詹姆斯”?(大写)

请告诉我这是怎么排除的


预期为
Null,james、james、eric
使用敏感的大小写排序规则,如
COLLATE Latin1\u General\u CS\u AS

CREATE TABLE TEST ( NAME VARCHAR(20) COLLATE Latin1_General_CS_AS );

您需要将
名称
列排序规则更改为
Latin1\u General\u CS\u AS
,该排序规则区分大小写

SELECT NAME COLLATE Latin1_General_CS_AS,
       Count(NAME)                            AS T1,
       Count(COALESCE(NULL, ''))              T2,
       Count(Isnull(NAME, NULL))              T3,
       Count(DISTINCT ( Name ))               T4,
       Count(DISTINCT ( COALESCE(NULL, '') )) T5,
       @@ROWCOUNT                             T6
FROM   TEST
GROUP  BY Name COLLATE Latin1_General_CS_AS; 

在这里发表评论的其他人是正确的

如果你在谷歌上搜索排序规则和区分大小写,你会更容易理解它们的含义,但用外行的话说,是这样的:

排序规则有点像编码;它确定字符串列中的字符的解释、排序和相互比较方式。不区分大小写意味着大写/小写被认为完全相同,因此例如“JAMES”、“JAMES”、“JAMES”等与SQL Server没有区别。因此,当您的数据库具有不区分大小写的排序规则,并且您随后创建了一个包含列的表,而不定义排序规则时,该列将继承数据库使用的默认排序规则,这就是我们在这里介绍的方式

您可以手动更改列排序规则,也可以在查询过程中对其进行定义,但请记住,无论何时比较两个不同的列,都需要将它们指定为使用相同的排序规则,否则将出现错误。这就是为什么最好在整个数据库中使用相同的排序规则,除非特殊的查询特定情况

关于你的问题,关于什么是拉丁字母,它基本上是“拉丁字母”的意思,你可以在线查看详细信息。“CS”部分表示区分大小写,如果它不区分大小写,您将看到“CI”。“AS”表示重音敏感,“AI”表示重音不敏感。基本上,“Á”是否被视为等于“A”


你可以从源代码中阅读更多关于它的信息,

COLLATE-Latin1\u-General\u-CS\u-AS它对查询所做的事情?@ HaleMaaHaRkRISHNA数据库排序是不区分大小写的,它将考虑<代码>杰姆斯< /代码>,<代码>杰姆斯< /代码>和<代码>杰姆斯< /代码>。code>COLLATE Latin1\u General\u CS\u AS
将使查询区分大小写
COLLATE Latin1\u General\u CS\u AS;它对查询有什么影响@HareRamaHareKrishna读到,它比任何人试图在评论中解释它要好得多