わかった。
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 は、何かを変更する関数ではありません。変数に適用することはできません (変数をnchar
or型として宣言するのは既に行っています) nvarchar
。
問題は、CSV ファイルの読み取り方法と@str
変数へのデータの取得方法にあります。