質問

私は、パディングなしでテーブル(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バイトを返します。

私は何かが足りませんか(明らかです)?

役に立ちましたか?

解決

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

これは、SQLサーバータイプの誤解です。 Varbinary(2048)列から始めて、長くしない限り、2048年に留まり、実際のデータコンテンツを減らしても崩壊しません。

これは、ソーステーブルに1つのレコードしかなく、長さ64であるにもかかわらず、Temptblのデータの長さがまだ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'
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top