Question

Je suis en train de sélectionner des données varbinary de TABLE (DATA varbinary (2048)) à mon dll .NET sans rembourrage. Tous mes dossiers sont actuellement 64 octets, mais ils peuvent varier à l'avenir.

J'utilise une procédure stockée qui fait cela:

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

J'attendre que cela fonctionne, mais le courant que je reçois dans mon dll est 2050 (2048 + 2) octets.

Quand je coder en dur la valeur (select substring(DATA, 1, 64) as DATA from TABLE), elle retourne 66 octets que j'attendre.

Am quelque chose que je manque (évident)?

Était-ce utile?

La solution

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

Ceci est une mauvaise compréhension de types SQL Server. Lorsque vous commencez avec un varbinary (2048) colonne, à moins que vous le faites plus, il restera à 2048 et ne cédera pas même si vous réduisez le contenu des données réelles.

Cela vous montre que la longueur des données dans temptbl est encore 2048, même si il n'y a qu'un seul enregistrement de la table source et il est de longueur 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

Si vous avez vraiment voulu, vous devez utiliser SQL dynamique à la taille de la colonne de sortie, mais il est très rarement besoin de faire une telle chose.

declare @nsql nvarchar(max)
set @nsql = 'select convert(varbinary(' +
 right((select max(datalength(Data)) as MaxLen from tbl),12) +
 '), data) as Data from tbl'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top