尝试从表中检索列时,我在简单的SQL语句中出现此错误

时间:2016-09-07 06:05:21

标签: sql-server sql-server-2008 tsql sql-server-2014-localdb

这是我的程序:

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
  转换varchar值时转换失败&#39; [&#39;数据类型int。

有谁知道为什么?

3 个答案:

答案 0 :(得分:1)

如果要将所有@LoopCounter值作为字符串获取。在while循环中声明@value,并在while循环之后放置select语句。

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。如果您希望这样做,则必须CONVERTCAST@LoopCounter变量改为varchar

如果你有一个较旧版本的SQL Server,你可以采用传统的方式附加和创建所需的字符串格式,如下所示:

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

答案 1 :(得分:0)

考虑你的输出,考虑在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

答案 2 :(得分:0)

得到预期的结果[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