2016-11-07 3 views
1

Я новичок в SQL Server, и у меня есть эта ошибка, что я был не в состоянии исправить:SQL вывода сервера и возвращаемое значение в процедуре

Msg 245, Level 16, State 1, процедура информации, Строка 11
Конверсия удалось при преобразовании значения VARCHAR «Steven» для типа междунар

данных можете ли вы показать мне, где ошибка, и как я могу это исправить?

Код выглядит следующим образом.

CREATE PROCEDURE info (@id int, @howMuch int OUTPUT) 
AS 
    SELECT * 
    FROM emp 
    WHERE empno = @id; 

    SELECT @howMuch = COUNT(*) 
    FROM emp; 

    DECLARE @name varchar(100) 

    SELECT @name = ename 
    FROM emp 
    WHERE empno = @id 

    RETURN @name 

-- execute the procedure. It throws error. 
DECLARE @num_rows int, @who varchar(100) 
EXECUTE @who = info 100, @num_rows OUTPUT 

SELECT @num_rows, @who 
+0

Я заметил, что: Если вместо «возврата» Я использую «печать» для визуализации «@name», процедура работает, и я вижу «@name». Он также хорошо работает, если вместо «return» я помещаю «@name» в качестве выходного параметра. Похоже, что ошибка возникает только при использовании «return» для возврата @name. Почему это? Что мне не хватает, чтобы понять? – andrea

+0

Вы неправильно понимаете, что делает PRINT и RETURN. Печать передает значение компилятору, в то время как RETURN подталкивает значение вызывающему, например, определяемое запросом. Эти правила определены в [документации MSDN] (https://msdn.microsoft.com/en-us/library/ms187926.aspx). Обычно использование FUNCTION было бы уместным, но вы также можете использовать инструкцию OUPUT в своем proc возвращает значение вызывающему. –

+1

Да, теперь я понимаю. Я не понял, как использовать возврат. Я думал, что могу использовать возврат со всеми типами данных, а не только как int. Теперь понятно. Спасибо. – andrea

ответ

2

Возвращаемое значение хранимой процедуры всегда должно быть целочисленным типом данных. Если вы используете функцию, вы можете вернуть другие типы данных, но вы можете вернуть только одно значение.

Как вам нужно два значения из хранимой процедуры, вы можете использовать два выходных параметра ...

CREATE PROCEDURE info2 (@id int , @howMuch int OUTPUT, @name varchar(100) OUTPUT) AS 
+1

Да, теперь я понимаю. Я не понял, как использовать возврат. Я думал, что могу использовать возврат со всеми типами данных, а не только как int. Теперь понятно. Спасибо. – andrea

+0

Эта страница содержит информацию об обоих подходах к перенастройке данных из хранимой процедуры: https://msdn.microsoft.com/en-us/library/ms188655.aspx Хотя многие из обычаев, которые я видел, ссылаются на «return 'для возврата кода ошибки, но это не обязательно должен быть единственный случай. В вашем примере вы можете вернуть значение @howmuch как возвращаемое значение вместо выходного параметра. Часто я использую код возврата для возврата удаленного счета, вставленного счета и т. Д. – Nayak