将 varchar 值“xxx”转换为数据类型 int 时,函数错误中的光标转换失败
Posted
技术标签:
【中文标题】将 varchar 值“xxx”转换为数据类型 int 时,函数错误中的光标转换失败【英文标题】:Cursor in function error Conversion failed when converting the varchar value 'xxx' to data type int 【发布时间】:2018-06-05 10:18:15 【问题描述】:当我尝试使用我的 udf 时,我收到一条错误消息:
将 varchar 值“Mar A”转换为数据类型 int 时转换失败。
我使用北风数据库,这是我的代码:
alter function test_fu (@city varchar(70))
returns varchar(70)
as
begin
declare @name varchar(70)
declare kursor cursor
for (select [ContactName]
from Contacts
where City = @city)
open kursor
fetch next from kursor into @name
set @name=@name+1
while @@FETCH_STATUS=0
close kursor
Deallocate kursor
return @name
end
【问题讨论】:
set @name=@name+1
???
当我删除此行时,我收到一条错误消息,提示“光标未打开”。所以我认为这是必需的
您应该准确描述您想要做什么,光标可能不是您问题的正确解决方案,而且很难看到您当前的代码正在尝试做什么。
我正在尝试使用用户定义的函数从分配给指定城市的联系人表中获取每个联系人姓名
【参考方案1】:
首先,你的光标有逻辑错误,在光标打开后马上移动while @@FETCH_STATUS=0
,然后执行一些东西并移动到下一个值
begin
print 'your current selected name is: '+@name
fetch next from kursor into @name
end
检查编辑:
使用 AdventureWorks2017
declare @name varchar(70)
declare kursor cursor
for (
select firstname
from Person.Person
where Person.Title = 'Mr.'
)
open kursor
fetch next from kursor into @name
while @@FETCH_STATUS=0
begin
print 'your current selected name is: '+@name
-- your statement goes here
fetch next from kursor into @name
end
close kursor
Deallocate kursor
但无论如何我同意戈登的回答:还有其他几种方法(实际上是更好的方法)来避免在描述的情况下使用光标
【讨论】:
【参考方案2】:您为什么要为此使用光标?
alter function test_fu (@city varchar(70))
returns varchar(70)
as
begin
declare @name varchar(70)
select top (1) @name = ContactName
from Contacts
where City = @city;
return @name;
end;
这个结构提出了一个关于数据结构的基本问题:每个城市真的只有一个联系人吗?如果没有,你想要哪一个?我怀疑这个函数实际上并没有做任何特别有用的事情,即使它正在工作。
【讨论】:
一开始我也想过这个,但是我想通过那个函数来获取多个变量。这甚至可能吗? @Rocket128 。 . .这与光标无关。您应该查看内联表值函数:sqlservergeeks.com/…。以上是关于将 varchar 值“xxx”转换为数据类型 int 时,函数错误中的光标转换失败的主要内容,如果未能解决你的问题,请参考以下文章
将 varchar 数据类型转换为 datetime 数据类型导致值超出范围的问题
将varchar值'N'转换为数据类型smallint时,转换失败。
将 varchar 值“AND ID =”转换为数据类型 int 时转换失败