2014-03-03 61 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