2011-02-01 100 views
0

我想從TABLE(DATA varbinary(2048))中選擇一些varbinary數據到我的.NET dll沒有任何填充。我所有的記錄目前都是64個字節,但它們在將來可能會有所不同。在子字符串中使用數據長度(varbinary數據類型)

我使用一個存儲過程,做到這一點:

select substring(DATA, 1, datalength(DATA)) as DATA from TABLE 

我希望這個工作,但我在DLL中獲得流是2050(2048 + 2)個字節。

當我硬編碼值(select substring(DATA, 1, 64) as DATA from TABLE)時,它會返回66個字節,如我所料。

我錯過了什麼(明顯的)?

回答

1
select substring(DATA, 1, datalength(DATA)) as DATA from TABLE 

這是對SQL Server類型的誤解。當你開始使用varbinary(2048)列時,除非再增加一點,否則它將保持在2048,即使減少實際數據內容也不會崩潰。

這說明你的數據在temptbl長度仍然是2048,即使是在源表只有一條記錄,它的長度爲64

create table tbl(data varbinary(2048)) 
; 
insert into tbl select convert(varbinary(2048),REPLICATE('a',64)) 
; 
select substring(DATA, 1, datalength(Data)) as DATA 
into temptbl 
from tbl 
; 
exec sp_help temptbl 

如果你真的想要,你將需要使用動態SQL來確定輸出列的大小,但很少有任何需要做這樣的事情。

declare @nsql nvarchar(max) 
set @nsql = 'select convert(varbinary(' + 
right((select max(datalength(Data)) as MaxLen from tbl),12) + 
'), data) as Data from tbl' 
+0

調整列的輸出正是我想要做的。我的數據是加密的文本,我需要發送給我的dll進行解密,因此需要大小完全相同,任何填充都會破壞數據。我將在明天嘗試動態SQL方法。謝謝。 – 2011-02-01 21:50:55

相關問題