【问题标题】:NVARCHAR variable not working in Where clauseNVARCHAR 变量在 Where 子句中不起作用
【发布时间】:2022-11-18 11:05:34
【问题描述】:

在 SQL Server 中(我想是 2018 年?我不知道怎么说)我的变量在 WHERENVARCHAR. 子句中不起作用比较应该返回值,但它什么都不返回。如果我只是手动输入声明的文本,它就会突然起作用并返回值。没有任何逻辑上的理由这应该有任何不同,类型都是 NVARCHARS。它为我工作的日期和数字。

以下 SQL Server 代码可以正常工作并返回结果:

SELECT * FROM table WHERE Column = 'text'

但是,当我使用初始 declare 语句时,以下代码失败了:

DECLARE @Class AS NVARCHAR = 'text'

SELECT * FROM table WHERE Column = @Class

我无法让变量在 WHERE 子句中工作,即使我已经确认该列是 NVARCHAR。我声明的其他参数工作正常它似乎是 NVARCHAR 给我问题。

有什么我想念的吗?

【问题讨论】:

  • 尝试在 DBFiddle 或 SQLFiddle 中重现此问题并在此处发布链接。
  • 顺便说一句,'text' 是一个varchar 文字,而N'text 是一个nvarchar 文字。
  • select @@version 获取版本。

标签: sql sql-server declare nvarchar


【解决方案1】:

这并不像您认为的那样:

DECLARE @Class AS NVARCHAR = 'text'
  • 必须使用varchar(n)nvarchar(n)varbinary(n) 列类型指定长度参数n,因为如果不这样做,它就等同于n = 1
  • 所以DECLARE @Class AS NVARCHAR = 'text' 与:
    • DECLARE @Class AS nvarchar(1) = 'text'
    • 这意味着@class = N't'而不是N'text'(但如果你输入DECLARE @Class AS nvarchar(4)就会是这样。

你可以通过运行这个来看到它:

DECLARE @Class AS NVARCHAR = 'text'
SELECT @class;

...它给你 t 作为输出:


因此,将您的 SQL 更改为:

DECLARE @class nvarchar(4) = N'text';

SELECT * FROM table WHERE Column = @class;

另外,不要忘记始终对您的对象名称进行模式限定:即更喜欢dbo.table而不是table

【讨论】:

    【解决方案2】:

    您需要声明 nvarchar 的长度。例如:

    声明 @Class 为 NVARCHAR(10) = '文本'

    您可以通过运行“select @Class”查看它包含的内容来检查@Class 的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 2015-01-27
      • 2014-01-26
      • 1970-01-01
      相关资源
      最近更新 更多