Использование длины данных(varbinary datatype) в подстроке
-
28-10-2019 - |
Вопрос
Я пытаюсь выбрать некоторые переменные данные из ТАБЛИЦЫ (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'