0

パディングなしで、TABLE(DATA varbinary(2048)) から .NET dll にいくつかの varbinary データを選択しようとしています。現在、すべてのレコードの長さは 64 バイトですが、将来的には変わる可能性があります。

これを行うストアド プロシージャを使用します。

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

これでうまくいくと思いますが、dll で取得するストリームの長さは 2050(2048 + 2) バイトです。

値 ( ) をハードコーディングすると、select substring(DATA, 1, 64) as DATA from TABLE予想どおり 66 バイトが返されます。

私は何かが欠けていますか(明らかです)?

4

1 に答える 1

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

これは、SQL Server の型に対する誤解です。varbinary(2048) 列から始めると、長くしなければ 2048 のままで、実際のデータの内容を減らしても崩れません。

これは、ソース テーブルにレコードが 1 つしかなく、長さが 64 であるにもかかわらず、temptbl の DATA の長さが 2048 のままであることを示しています。

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'
于 2011-02-01T18:24:41.850 に答える