2013-11-25 3 views
1

Я объявила переменную и хочу установить ее значение с помощью запроса выбора.Переменный вывод пуст при выполнении процедуры

У меня есть таблица:

fileNameGenerator 
------------------- 
(pk)fileSymbol | bc 

Вот моя процедура:

alter procedure bcSymbol 
(
@bc decimal(18,15) 
) 
AS 
/* SET NOCOUNT ON */ 
Declare @bcSymbol varchar(50) 
Select @bcSymbol = (SELECT fileSymbol From fileNameGenerator WHERE bc = @bc) 
RETURN 

По какой-то причине, это выход я получаю ...

Запуск [dbo].[bcSymbol] (@bc = 8.550000000000000) я получаю:

No rows affected. 
(0 row(s) returned) 
@RETURN_VALUE = 0 
Finished running [dbo].[tempFileName]. 

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

+0

извините за это. sql server 2008 r2 – user2369145

ответ

4

Все, что вы сделали, назначается переменной. Вы не выбрали его или не использовали в выходном параметре. Аналогично, если вы это сделаете, что вы ожидаете от вывода? Нет выхода!

DECLARE @x INT = 1; 

Возможно, вы имели в виду, чтобы сделать это:

ALTER PROCEDURE dbo.bcSymbol -- schema prefix, always 
    @bc decimal(18,15), 
    @bcSymbol VARCHAR(50) = NULL OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; -- why did you comment this out? 

    SELECT @bcSymbol = fileSymbol 
    FROM dbo.fileNameGenerator -- again, schema prefix 
    WHERE bc = @bc; 
END 
GO 

Теперь вы можете называть это так:

DECLARE @bcSymbol VARCHAR(50); 
EXEC dbo.bcSymbol @bc = 8.550000000000000, @bcSymbol = @bcSymbol OUTPUT; 
PRINT @bcSymbol; 

То, что это не обрабатывает случай, когда есть несколько одинаковых значения в столбце bc. Если две строки соответствуют предложению WHERE, какой из них вы ожидаете присвоить переменной? Пожалуйста, не говорите «первый» или «последний», потому что нет такой вещи, если у вас нет особых критериев.

Есть несколько простых способов сделать это (и этот вид устраняет проблему, если ваш клиент готов принимать несколько строк на выходе), но у них больше накладных расходов, например. вы можете просто выбрать непосредственно, не потрудившись переменными:

ALTER PROCEDURE dbo.bcSymbol -- schema prefix, always 
    @bc decimal(18,15) 
AS 
BEGIN 
    SET NOCOUNT ON; -- why did you comment this out? 

    SELECT bcSymbol = fileSymbol 
    FROM dbo.fileNameGenerator -- again, schema prefix 
    WHERE bc = @bc; 
END 
GO 

И тогда вызов проще (но немного более запутанным, скажем, C#):

EXEC dbo.bcSymbol @bc = 8.550000000000000; 

И here is why you want to not be lazy about schema prefix.

+0

Большое спасибо. мы генерируем имена файлов, используя несколько переменных, все из которых уникальны, и единственным «ключом», который они разделяют, является столбец символов. так например ... если у меня есть таблица: fileSymbol | bc | var1 | var2 ... и т. д. , тогда имя файла является bcsybol + var1symbol + var2symbol ... concantenated string. моя надежда состояла в том, чтобы вернуть это имя файла как строку, и у меня есть 8 переменных. – user2369145

+0

@ user2369145 это звучит очень много, как то, что вы хотели бы сделать на уровне приложения, а не в T-SQL. И это своего рода ползучесть по этому вопросу IMHO, который был, по сути, почему назначение переменной не приводит к каким-либо выводам? –

+0

извините за это. мои инструменты немного ограничены, и сейчас я просто хочу, чтобы эта функция функционировала. имена файлов были сгенерированы с помощью vlookups, подобных этому в excel, и я пытаюсь сохранить аналогичную логику именования. самый простой способ, которым я мог думать, это было в sproc.я попытался внести некоторые изменения в соответствии с вашими рекомендациями ... теперь он запрашивает ввод для выходного параметра. Процедура или функция 'test' ожидает параметра '@outputVal', который не был предоставлен. – user2369145

Смежные вопросы