尝试从 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
。如果你想这样做,你必须 CONVERT
或 CAST
将 @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
这是我的程序:
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
。如果你想这样做,你必须 CONVERT
或 CAST
将 @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