Ошибка курсора в функции Преобразование не удалось при преобразовании значения varchar 'xxx' в тип данных int - PullRequest
0 голосов
/ 05 июня 2018

, когда я пытаюсь использовать свой 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 голосов
/ 05 июня 2018

Прежде всего, ваш курсор имеет логические ошибки, переместите 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

Но в любом случае я согласен с ответом Гордона: есть несколько других способов (на самом деле, более эффективных), чтобы избежать использования курсора в описанной ситуации

0 голосов
/ 05 июня 2018

Зачем вам использовать курсор для этого?

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;

Эта структура поднимает фундаментальный вопрос о структуре данных: действительно ли в каждом городе есть только один контакт?Если нет, какой вы хотите?Я подозреваю, что эта функция на самом деле не делает ничего особенно полезного, даже если бы она работала.

...