sql - LIKE 运算符、N 和 % SQL Server 不适用于 nvarchar 列
问题描述
有没有办法使以下查询工作?
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
解决方案
您不需要N
在子句中使用前缀,WHERE
因为您的变量已经是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
您可能已经看到使用 N 前缀传递字符串的 Transact-SQL 代码。这表示随后的字符串是 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 时,您需要使用N
前缀,而不是在 SP 或WHERE
子句中。