0

这是我的程序:

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 时转换失败。

有谁知道为什么?

4

3 回答 3

1

如果要将所有@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,'')我们用空格替换第一个逗号。

您收到转换错误,因为@LoopCounteris 类型INT并且您试图将其附加到varchar. 如果你想这样做,你必须CONVERT或变量CAST@LoopCountervarchar

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

set @value=@value + ',[' + CONVERT(VARCHAR(100),@LoopCounter) + ']'
于 2016-09-07T06:08:54.770 回答
0

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

尝试更换线路:

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

有了这个:

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

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

Select UserID,UserName, substring(@value, 1, (len(@value) - 1)) as Value
于 2016-09-07T06:10:19.280 回答
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
于 2016-09-07T06:17:24.380 回答