0

多くの人がこれを行うことができると言います:

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)からのものであるためです。

ストアド プロシージャで、CSV から値を取得しました。これは 2 バイト (中国語/日本語) であり、正しく保存されています)、DB テーブルに挿入する前@strに追加したい( . )NN??

N を追加するにはどうすればよいですか?

4

1 に答える 1

3

わかった。

Nあなたが話しているのは、何かをする機能ではありません。これは、文字列リテラルを定義する SQL の構文の一部です。

半角文字列リテラル

1 バイトの文字列リテラルは、先頭の一重引用符 ( ') と、その後に一重引用符以外の 0 個以上の文字が続き、その後に先頭の一重引用符 ( ') が続きます。あいまいさを取り除くために、埋め込まれた一重引用符は二重にすることでエスケープされます。文字列リテラルの字句値には、リードイン/リードアウトの引用符も二重の内部エスケープも含まれないため、文字列リテラルは

'That''s crazy!`

語彙値を持つ

That's crazy!

このような文字列リテラルは、データベースの既定の照合順序で解釈される 1 バイト文字列として定義されます。さらに、各文字は 1 バイトを占有します。

したがって、次のような式

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

まったく同じです

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

select *
from foo
where some_column = @temp

注: 片仮名やひらがななどの Unicode 文字を 1 バイトの文字列リテラルに入れることはできますが、期待どおりの結果が得られる可能性は低いです。

2 バイト (Unicode) 文字列リテラル

2 バイト (Unicode) 文字列リテラルは同じ方法で定義されますが、リテラルにはN特殊であることを示すためにがプレフィックスとして付けられます。

`N'That''s crazy!'

再び語彙値を持つ

That's crazy!

ただし、この場合、各文字は2 バイトを占有し、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 は、何かを変更する関数ではありません。変数に適用することはできません (変数をncharor型として宣言するのは既に行っています) nvarchar

問題は、CSV ファイルの読み取り方法と@str変数へのデータの取得方法にあります。

于 2014-03-03T22:54:22.570 に答える