Использование длины данных(varbinary datatype) в подстроке

StackOverflow https://stackoverflow.com/questions/4865956

Вопрос

Я пытаюсь выбрать некоторые переменные данные из ТАБЛИЦЫ (DATA varbinary (2048)) в мою .NET dll без каких-либо дополнений.Все мои записи в настоящее время имеют длину 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 Server.Когда вы начинаете с столбца varbinary (2048), если вы не сделаете его длиннее, он останется на уровне 2048 и не свернется, даже если вы уменьшите фактическое содержимое данных.

Это показывает вам, что длина ДАННЫХ в temptbl по-прежнему равна 2048, хотя в исходной таблице есть только одна запись, и она имеет длину 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

Если бы вы действительно хотели, вам нужно было бы использовать динамический 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