我在Linq2SQL上阅读了一些旧的ScottGu博客。现在我正在做SPROC部分。我想知道@variable的确切含义是什么。
从ScottGu的博客
中看到这一点ALTER PROCEDURE dbo.GetCustomersDetails
(
@customerID nchar(5),
@companyName nvarchar(40) output
)
AS
SELECT @companyName = CompanyName FROM Customers
WHERE CustomerID = @customerID
SELECT *
FROM Orders
WHERE CustomerID = @customerID
ORDER BY OrderID
我有点迷茫,因为到目前为止,我有任何事先以“@”作为用户输入的占位符。但是,在上面的示例中,看起来像'@ companyName'用作常规变量,例如在C#中( SELECT @companyName = ... )。但是,@companyName还不知道。
那么,上面的'@'之前的真实性质是什么?一个变化?一个简单的占位符,以适应用户输入的值?
感谢您的帮助
答案 0 :(得分:7)
这只是一个变量。
请记住,存储过程可以包含输入和输出参数。在这种情况下,@companyName
是一个变量,其中包含调用过程GetCustomersDetails
时将输出的值(请注意参数声明后的output
)。
除了输出参数之外,此过程还返回结果集。如果愿意,您还可以选择设置return code,因此there are at least three ways of returning data from a stored procedure可以同时使用:输出参数,结果集和返回代码。
答案 1 :(得分:1)
见内联评论:
ALTER PROCEDURE dbo.GetCustomersDetails
(
@customerID nchar(5), --input parameter to stored procedure
@companyName nvarchar(40) output --output parameter to stored procedure, can be changed by the procedure and the value retrieved by the caller
)
AS
SELECT @companyName = CompanyName FROM Customers --set the output parameter as the last row from this query
WHERE CustomerID = @customerID --use the input parameter to filter the query
SELECT *
FROM Orders
WHERE CustomerID = @customerID --filter this query on the input parameter
ORDER BY OrderID
您可以声明局部变量,它们不仅仅是存储过程的参数:
DECLARE @localVariable int --integer local variable
,@Another char(1) --multiple on one DECLARE
通常是@@ ....是系统值,比如@@ ROWCOUNT和@@ SPID,但你可以做一些疯狂的事情:
DECLARE @@@@wtf int --this is valid, and works