执行过程时变量输出为空

时间:2013-11-25 18:41:19

标签: sql sql-server sql-server-2008-r2

我已经声明了一个变量,并希望通过选择查询来设置它的值。

我有一张桌子:

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。

1 个答案:

答案 0 :(得分: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