Оператор LIKE, N и% SQL Server не работают в столбце nvarchar - PullRequest
0 голосов
/ 09 января 2019

Есть ли способ заставить следующий запрос работать?

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   

Ответы [ 3 ]

0 голосов
/ 09 января 2019

в этих строках

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

'حس' - это константа varchar , которую вы затем назначаете переменной nvarchar. Но вы уже потеряли данные при первоначальном преобразовании в эту постоянную varchar, и вы не можете получить их обратно.

Решение состоит в том, чтобы использовать nvarchar константу:

set @t=N'حس'
0 голосов
/ 09 января 2019

Это может быть намного проще:

Попробуйте это

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
0 голосов
/ 09 января 2019

Вам не нужно использовать префикс 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

...