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)。

在存储过程中,我@str从 CSV 中获取了值,它是双字节(中文/日文),保存正确),我想N在将其插入 DB 表之前添加(没有N,它显示为??在表中。 )

我怎样才能添加N?

4

1 回答 1

3

好的。

N你所说的不是一个做任何事情的函数。它是定义字符串文字的 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 字符(例如片假名或平假名)放入单字节字符串文字中,但您不太可能得到您期望的结果。

双字节 (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 不是一个可以改变任何东西的函数。您不能将其应用于变量(您已经将变量声明为类型ncharnvarchar.

您的问题在于您如何读取 CSV 文件以及如何将数据放入@str变量中。

于 2014-03-03T22:54:22.570 回答