Вам не нужно использовать префикс 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
Живая демоверсия
Возможно, вы видели код Transact-SQL, который передает строки, используя префикс N. Это означает, что следующая строка в Unicode (N фактически означает набор символов на национальном языке). Это означает, что вы передаете значение NCHAR, NVARCHAR или NTEXT, а не CHAR, VARCHAR или TEXT.
Из документов
Префикс символьных констант Unicode с буквой N. Без префикса N строка преобразуется в кодовую страницу базы данных по умолчанию. Эта кодовая страница по умолчанию может не распознавать определенные символы.
Чтобы ответить на ваш вопрос в комментарии простым ответом, вы используете неправильный тип данных, поэтому ALTER
сохраните процедуру и измените тип данных вашего параметра с VARCHAR
на NVARCHAR
.
UPDATE:
Поскольку вы используете 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
Если вы видите, вам нужно использовать префикс N
, когда вы передаете литеральную строку вашему SP, а не внутри SP, или в предложении WHERE
.
Демонстрация для SP