Все, что вы сделали, назначается переменной. Вы не выбрали его или не использовали в выходном параметре. Аналогично, если вы это сделаете, что вы ожидаете от вывода? Нет выхода!
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.
извините за это. sql server 2008 r2 – user2369145