我已经声明了一个变量,并希望通过选择查询来设置它的值。
我有一张桌子:
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 :(得分: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;