サブストリングでDatalength(Varbinary Datatype)を使用します
-
28-10-2019 - |
質問
私は、パディングなしでテーブル(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'
所属していません StackOverflow