Я получаю эту ошибку в своем простом операторе 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
Другие вопросы по тегам