尝试从 table 中检索列时,我在简单的 SQL 语句中遇到此错误

I get this error in my simple SQL statement when trying to retrieve a column from a table

这是我的程序:

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]

当我将参数传递给我的存储过程时,它显示此错误

Msg 245, Level 16, State 1, Procedure spasdf, Line 40
Conversion failed when converting the varchar value '[' to data type int.

有人知道为什么吗?

如果你想得到所有的@LoopCounter值作为一个字符串。在 while 循环外声明 @value 并将 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,'') 我们将第一个逗号替换为空 space。

您收到转换错误,因为 @LoopCounter 的类型为 INT,而您正试图将其附加到 varchar。如果你想这样做,你必须 CONVERTCAST@LoopCounter 变量设置为 varchar

如果您使用的是旧版本的 SQL 服务器,您可以采用传统的方式来附加和创建所需的字符串格式,如下所示:

set @value=@value + ',[' + CONVERT(VARCHAR(100),@LoopCounter) + ']'

考虑到您的输出,考虑在 while 循环外声明@value 和 select 语句。

尝试替换行:

set @value='['+@LoopCounter+']' 

有了这个:

set @value= CONCAT(@value,'['+cast(@LoopCounter as varchar)+'],')

要从值中删除最后一个逗号,您可以使用如下内容:

Select UserID,UserName, substring(@value, 1, (len(@value) - 1)) as Value

要获得预期结果 [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