2014-03-03 102 views
0

很多人说你可以这样做:如何插入双字节到DB不加正进入字面

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的@str值,它是双字节(中国/日本),这是正确保存),我想在数据库表(插入它没有N前加N,它在表中显示为??)。

如何添加N?

回答

2

好的。

你在说的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字符,如Katagana或平假名在一个单字节字符串文字,你不可能得到你所期望的。

双字节(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变量

+0

我把'@str'的值放在一个csv文件中并保存为unicode txt,然后将扩展名改回csv,然后用pentaho kettle进行处理,一个转换文件与一个SP ,在SP'@str'中有来自csv文件的值并将其插入到db中。 – Kurt