【问题标题】:SQL Server IN clause within the boolean of IF statement [duplicate]IF语句的布尔值中的SQL Server IN子句[重复]
【发布时间】:2020-08-20 21:32:15
【问题描述】:

我有一个要调试的查询,它包含一些我没见过的东西。这是我的问题的模拟查询。

DECLARE @i AS INT
DECLARE @total AS INT
SET @total = 0
SET @i = 0

IF DATENAME(WEEKDAY,GETDATE()) IN (N'Wednesday') BEGIN
    SELECT @total = @total + 1
        SET @i = @i + 1
END

SELECT @i

我的问题在这部分:IN (N'Wednesday')。 varchar 'Wednesday' 之前的 N 是什么。我不知道它是否是一种关键字或类似的东西。这个查询可以执行;不会有错误。另一方面,当我删除这个N 时,也可以(据我所知)。我最感兴趣的是,当我将其更改为n 时,它会产生错误。

【问题讨论】:

  • 在 SQL Server 中,它指定了一个国家字符集字符串 -- 一个字符超过 1 个字节的字符串。

标签: sql if-statement in-clause


【解决方案1】:

N 前缀表示以下字符串文字是 nvarchar 值而不是 varchar 值。

在 SQL Server 中,nvarchar 和 nchar 值使用 UTF-16 存储,这在存储更高平面的 Unicode 字符时存在问题 - 但可以解决它们。而 varchar 和 char 值使用服务器配置的默认编码 (ISO 8859-1) SQL Server 调用“iso_1”。

(我注意到,自 SQL Server 2019 以来,SQL Server now finally supports UTF-8 在我看来已经过时了 nvarchar - 因为 UTF-16 与 UTF-8 相比的唯一优势是更有效地存储代码点范围 2048-65535(它使用 2 个字节,而 UTF-8 使用 3 个字节),但这是没有实际意义的,因为大多数语言使用的大多数字符都在 0-2047 范围内 - 所以在大多数情况下,对于大多数应用程序,尤其是那些主要处理基于拉丁字母的字母,最好坚持使用 UTF-8)。

这个查询可以执行;不会有错误。另一方面,删除这个 N 也可以(据我所知)。我最感兴趣的是,当我将其更改为 n 时,它会产生错误。

它出错是因为DATENAME 返回一个nvarchar 值,而不是varchar 值,并且您不能使用IN 运算符来比较nvarchar 和varchar 值一起(但您可以使用= 运算符) - 或

保留N'' 语法。即使IN 运算符确实支持混合varchar 和nvarchar 操作数,这意味着您不必强制SQL Server 在varchar 和nvarchar 的编码之间转换值——这也意味着DATENAME将适用于非拉丁语环境,其中“星期三”不是驼峰日的名称。

【讨论】:

    猜你喜欢
    • 2010-11-10
    • 2019-06-30
    • 2013-03-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 2013-03-26
    相关资源
    最近更新 更多