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