这是我的程序:
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。
有谁知道为什么?
答案 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
。如果您希望这样做,则必须CONVERT
或CAST
将@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