Как вставить двойной байт в БД без добавления N в литерал

Многие люди говорят, что вы можете сделать это:

declare @str        nvarchar(255);
declare @finalValue nvarchar(255);

set @str        = N'好使';
set @finalValue = @str;

Но это не мой случай. Что я хочу сделать, это что-то вроде этого:

  declare @str        nvarchar(255);
  declare @finalValue nvarchar(255);

  set @str        = '好使'     ;
  set @finalValue = 'N'+ @str ;

  print @finalValue;

потому что ценность @str на самом деле откуда-то еще (CSV).

В хранимой процедуре я получил @str значение из CSV и это двухбайтовый (китайский / японский), который сохраняется правильно), и я хочу добавить N перед вставкой в ​​таблицу БД (без Nотображается как ?? в таблице.)

Как я могу добавить N?

1 ответ

Решение

ХОРОШО.

N вы говорите не о функции, которая делает Anthing. Это часть синтаксиса SQL, которая определяет строковые литералы.

Однобайтовые строковые литералы

Однобайтовый строковый литерал состоит из вводной одинарной кавычки ('), за которым следует ноль или более других символов, отличных от одинарной кавычки, за которыми следует заключительная одиночная кавычка ('). Чтобы устранить неоднозначность, любые встроенные одинарные кавычки экранируются путем их удвоения. Лексическое значение строкового литерала не включает вводные / выводные кавычки и двойные внутренние экранированные символы, поэтому строковый литерал

'That''s crazy!`

имеет лексическое значение

That's crazy!

Такой строковый литерал определяется как однобайтовая строка, что интерпретируется с помощью параметров сортировки базы данных по умолчанию. Далее каждый символ занимает один байт.

Следовательно, такое выражение, как

select *
from foo
where some_column = 'That''s crazy!'

точно так же, как

declare @temp char(13) = 'That''s crazy!'

select *
from foo
where some_column = @temp

Примечания: хотя вы можете поместить символы Unicode, такие как Katagana или Hiragana, в однобайтовый строковый литерал, вы вряд ли получите то, что ожидаете.

Двухбайтовые (Unicode) строковые литералы

Двухбайтовые (Unicode) строковые литералы определяются таким же образом, за исключением того, что литерал имеет префикс N чтобы указать, что это особенное:

`N'That''s crazy!'

снова имеет лексическое значение

That's crazy!

но в этом случае каждый символ занимает два байта и кодируется в Unicode UCS-2.

И снова такое выражение, как

select *
from foo
where some_column = N'That''s crazy!'

точно так же, как

declare @temp nchar(13) = 'That''s crazy!'

select *
from foo
where some_column = @temp

Итак... ваш вопрос "Как я могу добавить N?" не имеет смысла. N не функция, которая что-то меняет. Вы не можете применить его к переменной (вы уже сделали это, объявив переменную типа nchar или же nvarchar,

Ваша проблема заключается в том, как вы читаете свой CSV-файл и как вы получаете данные в свой @str переменная.

Другие вопросы по тегам