Как передать длину для CAST динамически - PullRequest
3 голосов
/ 19 января 2012

Это похоже на тривиальную проблему синтаксиса, о которой я не знаю. Я хотел бы определить функцию обрезки некоторых данных на основе допустимого предела для столбца.

Вот пример кода, который работает.

DECLARE @value nvarchar(max) = ' Test string abc '
DECLARE @length integer = 10
DECLARE @trimValue nvarchar(max) = @value
SELECT @trimValue = LTRIM(RTRIM(CAST(@value AS nvarchar(10))))
SELECT @trimValue

возвращает 'Test str'

Теперь я хочу передать эту длину приведения динамически. Как я могу это сделать?

 SELECT @trimValue = LTRIM(RTRIM(CAST(@value AS nvarchar(@length))))

Ответы [ 3 ]

3 голосов
/ 19 января 2012

вы можете использовать LEFT в этом случае, поскольку это строка, в противном случае вам нужно сделать это динамически

DECLARE @value nvarchar(max) = ' Test string abc '
DECLARE @length integer = 10

DECLARE @trimValue nvarchar(max) = @value
SELECT @trimValue = LEFT(LTRIM(RTRIM(@value)),@length)
SELECT @trimValue
0 голосов
/ 19 января 2012

пример использования sp_executesql для динамического задания размера:

DECLARE @value nvarchar(max) = ' Test string abc '
DECLARE @length integer = 10
DECLARE @trimValue nvarchar(max) = @value
DECLARE @parameters NVARCHAR(100)

declare @sql nvarchar(200)
set @sql = N'select @trimValueOUT = LTRIM(RTRIM(CAST(''' + @value + ''' AS nvarchar(' + cast(@length as varchar(15)) + '))))'
SET @parameters = N'@trimValueOUT nvarchar(' + cast(@length as varchar(15)) + ') output'

--print @sql
--print @parameters
execute sp_executesql @sql, @parameters, @trimValueOUT = @trimValue output
SELECT @trimValue
0 голосов
/ 19 января 2012

Почему вы хотите это сделать? Накладные расходы для всех VARCHAR и NVARCHAR одинаковы, вплоть до длин 8000 и 4000 соответственно.

Настоящая проблема в том, что само приведение не будет работать, потому что оно будет преобразовано в длину переменной, как объявлено.

...