LIKE 运算符、N 和 % SQL Server 不适用于 nvarchar 列

jal*_*eel 1 sql t-sql sql-server sql-like

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

declare @t nvarchar(20)
set @t='??'
SELECT  [perno] ,[pName]
  FROM  [dbo].[People]
  Where [pName] like N''+@t +'%'
Run Code Online (Sandbox Code Playgroud)

我不能这样使用:

 Where [pName] like N'??%'
Run Code Online (Sandbox Code Playgroud)

或者使用存储过程:

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

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

Sam*_*ami 5

您不需要NWHERE子句中使用前缀,因为您的变量已经是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
Run Code Online (Sandbox Code Playgroud)

现场演示

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

来自文档

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


要在评论中用简单的答案回答您的问题,您使用了错误的数据类型,因此ALTER存储过程并将参数的数据类型从 更改VARCHARNVARCHAR


更新:

由于您使用的是 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
Run Code Online (Sandbox Code Playgroud)

并将其称为

EXEC MyProc N'??'; --If you don't use N prefix then you are pass a varchar string
Run Code Online (Sandbox Code Playgroud)

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

SP 演示