繁体   English   中英

像运算符一样,N和%SQL Server在nvarchar列上不起作用

[英]LIKE operator, N and % SQL Server doesn't work on nvarchar column

有什么办法可以使以下查询工作?

declare @t nvarchar(20)
set @t='حس'
SELECT  [perno] ,[pName]
  FROM  [dbo].[People]
  Where [pName] like N''+@t +'%'

我不能这样使用:

 Where [pName] like N'حس%'

或使用存储过程:

  ALTER PROCEDURE [dbo].[aTest]
  (@t  nvarchar(20))
  AS
    BEGIN

     SELECT     [perno] ,[pName]
       FROM     [dbo].[People]
       WHERE   ([People].[pName] LIKE N'' +@t + '%')
END   

您不需要在WHERE子句中使用N前缀,因为您的变量已经是nvarchar ,并且您要传递的变量不是文字字符串

这是一个例子:

CREATE TABLE People
(
  ID INT,
  Name NVARCHAR(45)
);

INSERT INTO People VALUES
(1, N'حسام'),
(2, N'حسان'),
(3, N'حليم');

DECLARE @Name NVARCHAR(45) = N'حس';--You need to use N prefix when you pass the string literal

SELECT *
FROM People
WHERE Name LIKE @Name + '%'; --You can use it here when you pass string literal, but since you are passing a variable, you don't need N here

现场演示

您可能已经看到了Transact-SQL代码,该代码使用N前缀传递字符串。 这表示后续的字符串采用Unicode(N实际上代表本国语言字符集)。 这意味着您正在传递一个NCHAR,NVARCHAR或NTEXT值,而不是CHAR,VARCHAR或TEXT。

来自文档

使用字母N作为前缀Unicode字符串常量。没有N前缀的情况下,该字符串将转换为数据库的默认代码页。 此默认代码页可能无法识别某些字符。


要用简单的答案在注释中回答您的问题,您使用了错误的数据类型,因此请ALTER存储过程,并将参数的数据类型从VARCHAR更改为NVARCHAR


更新:

由于您使用的是SP,因此您可以按以下方式创建SP(根据您的评论 ):

CREATE PROCEDURE MyProc
(
  @Var NVARCHAR(45)
)
AS 
BEGIN
  SELECT *
  FROM People
  WHERE Name LIKE ISNULL(@Var, Name) + '%';
  --Using ISNULL() will return all rows if you pass NULL to the stored procedure
END

并称其为

EXEC MyProc N'حس'; --If you don't use N prefix then you are pass a varchar string

如果看到的话,则在不向SP或WHERE子句中传递文字字符串给SP时,需要使用N前缀。

SP的演示

在这些行中

declare @t nvarchar(20)
set @t='حس'

'حس'是一个varchar常量,然后您可以将其分配给nvarchar变量。 但是,您已经丢失了原始转换为该varchar常量的数据,并且无法恢复该数据。

解决方案是使用nvarchar常量:

set @t=N'حس'

可能要简单得多:

尝试这个

declare @t nvarchar(20)
set @t='حس';

SELECT @t; --the result is "??"

您正在正确将变量声明为NVARCHAR 但是文字不知道其目标。 如果没有N则将其作为具有默认排序规则的VARCHAR

下一行

Where [pName] like N''+@t +'%'

将搜索pName LIKE '??%'

解决方案应该是

set @t=N'حس'; --<-- N-prefix

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM