Transact-SQL中@的真正本质是什么

时间:2010-04-20 20:53:20

标签: sql sql-server-2008

我在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还不知道。

那么,上面的'@'之前的真实性质是什么?一个变化?一个简单的占位符,以适应用户输入的值?

感谢您的帮助

2 个答案:

答案 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