功能错误中的光标转换varchar值时转换失败' xxx'到数据类型int

时间:2018-06-05 10:18:16

标签: sql sql-server cursor user-defined-functions

当我尝试使用我的udf时,我得到一个错误说:

  

转换varchar值时转换失败' Mar A'数据类型int。

我使用northwind数据库,这是我的代码:

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

2 个答案:

答案 0 :(得分:2)

首先,光标有逻辑错误,在光标打开后立即移动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

但无论如何我同意戈登的回答:还有其他几种方法(更好的方法)避免在描述的情况下使用光标

答案 1 :(得分:0)

为什么要使用游标?

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;

这种结构提出了一个关于数据结构的基本问题:每个城市真的只有一个联系人吗?如果没有,你想要哪一个?我怀疑这个函数并没有真正做任何特别有用的事情,即使它正在工作。