Я получаю эту ошибку в своем простом операторе SQL при попытке извлечь столбец из таблицы
Это моя процедура:
create proc spasdf
@sdate int,
@edate int
as
DECLARE @LoopCounter INT = @sdate
WHILE @LoopCounter <= @edate)
BEGIN
SET @LoopCounter = @LoopCounter + 1
declare @value varchar(30)
set @value = '['+@LoopCounter+']'
select UserID, UserName, @value
from vwfinal
END
Я запускаю его, используя:
spasdf 1,5
Мой ожидаемый результат:
@value=[1],[2],[3],[4],[5]
Когда я передаю параметр в мою хранимую процедуру, он показывает эту ошибку
Сообщение 245, Уровень 16, Состояние 1, Процедура spasdf, Строка 40
Ошибка преобразования при преобразовании значения varchar '[' в тип данных int.
Кто-нибудь знает почему?
3 ответа
Если вы хотите получить все @LoopCounter
значения в виде строки. Объявить @value
за пределами цикла while и поместите оператор select после цикла while.
create proc spasdf
@sdate int,
@edate int
as
DECLARE @value varchar(30)=''
DECLARE @LoopCounter INT = @sdate
WHILE ( @LoopCounter <= @edate)
BEGIN
SET
@LoopCounter = @LoopCounter + 1
set @value=@value + ',' + QUOTENAME(@LoopCounter)
END
set @value=STUFF(@value,1,1,'')
select UserID,UserName,@value from vwfinal
Приведенный выше код добавит все @LoopCounter
переменная как строка вместе с запятой вначале.
с помощью set @value=STUFF(@value,1,1,'')
мы заменяем первую запятую на пустой пробел.
Вы получаете ошибку преобразования, потому что @LoopCounter
имеет тип INT
и вы пытаетесь добавить его к varchar
, Если вы хотите сделать это, вы должны CONVERT
или же CAST
@LoopCounter
переменная к varchar
Если у вас более старая версия SQL Server, вы можете перейти к традиционному способу добавления и создания необходимого формата строки, как показано ниже:
set @value=@value + ',[' + CONVERT(VARCHAR(100),@LoopCounter) + ']'
Чтобы получить ожидаемый результат [1],[2],[3],[4],[5] вам нужно что-то вроде:
create proc spasdf
@sdate int,
@edate int
as
declare @value varchar(300) = ''
DECLARE @LoopCounter INT = @sdate
WHILE ( @LoopCounter <= @edate)
BEGIN
SET @LoopCounter = @LoopCounter + 1
set @value= @value + ',['+ CAST(@LoopCounter AS VARCHAR(50)) +']'
END
select UserID,UserName,STUFF(@value,1,1,'') as Value from vwfinal
Учитывая ваш вывод, рассмотрите возможность объявления @value и выбора оператора вне цикла while.
Попробуйте заменить строку:
set @value='['+@LoopCounter+']'
С этим:
set @value= CONCAT(@value,'['+cast(@LoopCounter as varchar)+'],')
И чтобы удалить последнюю запятую из значения, вы можете использовать что-то вроде:
Select UserID,UserName, substring(@value, 1, (len(@value) - 1)) as Value