2017-02-08 6 views
1

Я хочу объявить новую переменную с длиной, определяемой переменной, что-то вроде этого:Передача переменной длины, чтобы объявить новый VARCHAR в SQL Server

DECLARE @trimStringLength INT; 
SET @trimStringLength = 48; 

DECLARE @trimString VARCHAR(@trimStringLength); 

SET @trimStringLength = ''; 

Но я получаю сообщение об ошибке

Неверный синтаксис рядом с @trimStringLength. Ожидание идентификатора, целого или QUOTED_ID

+3

Что воспринимаемое преимущество здесь более просто объявить 'VARCHAR (макс) '? Это не похоже на то, что вы должны заплатить за дополнительное пространство, которое остается неиспользованным. –

ответ

1

К сожалению, нет простого способа динамического указания типа переменной в MS SQL Server. Лучшее, что можно сделать, это динамически создавать/изменять User-Defined Type и использовать это в коде.

Если вам просто нужно обрезать строку на несколько символов, правильный подход будет манипулировать VARCHAR (4000)/VARCHAR (макс) переменные с помощью строковых функций:

DECLARE @oldValue varchar(4000) = '123456789'; 
DECLARE @newValue varchar(4000) = LEFT(@oldValue, LEN(@oldValue)-1); 
SELECT @newValue; 
-- Result: 12345678 
+0

означает, что я не могу объявить новое поле на допустимую длину –

+0

, если я использую DECLARE @trimString Varchar (48); SET @ trimStringLength = ''; , тогда работайте идеально –

+0

Вы можете поместить весь блок кода в строку, изменить параметры (включая длину) и запустить его как динамический SQL, но обычно это не очень хорошая идея. –

1

В SQL Server для VARCHAR (n)

Размер хранилища - фактическая длина в байтах введенных данных, а не n байт.

Так что, если вы не уверены в размере, просто объявить VARCHAR (макс)

удалить последний символ

SET @trimString = SUBSTRING(@have, 0, LEN(@have)-1) 
+0

'DECLARE @trimString VARCHAR (max)'; затем установите его значение, размер ячейки данных будет перенастраиваться в соответствии с размером переменной '@ have' значения –

+0

. Я хочу скопировать значение переменной« have », которая является длинной строкой . Я хочу скопировать ее в« trimString », но пренебрегать последний символ @have есть ли какой-либо вариант. –

+0

'SET @trimString = SUBSTRING (@have, 0, LEN (@have))' –