Frage

Ich versuche, einige varbinäre Daten aus der Tabelle (Datenvarbarbin (2048)) für meine .NET -DLL ohne Polsterung auszuwählen. Alle meine Aufzeichnungen sind derzeit 64 Bytes lang, können jedoch in Zukunft variieren.

Ich benutze eine gespeicherte Prozedur, die dies ausführt:

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

Ich würde erwarten, dass dies funktioniert, aber der Strom, den ich in meine DLL bekomme, ist 2050 (2048 + 2) Bytes lang.

Wenn ich den Wert hart codiere (select substring(DATA, 1, 64) as DATA from TABLE) Es gibt 66 Bytes zurück, wie ich es erwarten würde.

Vermisse ich etwas (Offensichtliches)?

War es hilfreich?

Lösung

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

Dies ist ein Missverständnis von SQL -Servertypen. Wenn Sie mit einer Varbarinary (2048) -Spalte beginnen, bleibt sie bei 2048, sofern Sie sie nicht länger machen, und kollabiert nicht, selbst wenn Sie den tatsächlichen Dateninhalt reduzieren.

Dies zeigt Ihnen, dass die Datenlänge in Temptbl immer noch 2048 beträgt, obwohl es in der Quellentabelle nur einen Datensatz gibt und 64 Länge enthält.

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

Wenn Sie es wirklich wollten, müssten Sie dynamische SQL verwenden, um die Ausgangsspalte zu gründen, aber es besteht sehr selten, dass so etwas unternommen wird.

declare @nsql nvarchar(max)
set @nsql = 'select convert(varbinary(' +
 right((select max(datalength(Data)) as MaxLen from tbl),12) +
 '), data) as Data from tbl'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top