2011-06-15 68 views
4

我有一個存儲過程,它返回一個對象的所有字段。在sproc中返回OUTPUT參數中的值

CREATE PROCEDURE getCustomer 
(
    @CustomerId int OUTPUT 
) 
AS 
BEGIN 
    SELECT @CustomerId=CustomerId,FirstName,LastName FROM Customers 
END 

我希望能夠返回對象的id作爲輸出參數,以便另一個sproc可以使用它。我得到在本例中此錯誤:

A SELECT statement that assigns a value to a variable must not be combined with 
data-retrieval operations. 

CREATE PROCEDURE getCustomer_and_more 
AS 
BEGIN 
DECLARE @CustomerId int 

EXEC getCustomer @CustomerId OUTPUT 

-- call another sproc that requires this @CustomerId 
END 

回答

7

當您的SELECT語句分配變量值時,SELECT中的所有字段都必須分配給本地變量。

您的存儲過程更改爲

CREATE PROCEDURE getCustomer 
(
@CustomerId int OUTPUT 
) 
AS 
BEGIN 
    DECLARE @FirstName VARCHAR(50) 
    DECLARE @LastName VARCHAR(50) 

    SELECT @CustomerId=CustomerId, @FirstName = FirstName, @LastName =LastName 
    FROM Customers 

你不必使用它們的變量,但它們必須以這種方式進行分配。

你的BETTER選項是刪除字段。如果他們不需要,不要打擾選擇他們。

[編輯]對您的評論做出反應

所以,你可以做你要找通過拆分出來的變量的分配和選擇等領域做什麼如下:

CREATE PROCEDURE getCustomer 
(
@CustomerId int OUTPUT 
) 
AS 
BEGIN 

    SELECT @CustomerId=CustomerId FROM Customers 

    SELECT FirstName, LastName, {A_BUNCH_OF_OTHER_FIELDS} 
    FROM 
     Customers 

這將允許您獲取您的輸出參數並選擇所有其他數據,而無需爲每個字段定義參數。您必須權衡易用性(不必定義大量本地變量)與性能(不得不運行兩個語句而不是一個語句)。然而,這對我來說似乎有點奇怪。

我不太清楚你是否需要getCustomer_and_more中GetCustomer sproc的其他值。如果你這樣做,那麼是的,你必須爲你需要的每個值定義OUTPUT參數

+0

我需要所有的字段,其中有很多,因爲我需要在業務層中構建一個對象。所以你是說爲每個字段聲明變量是唯一的方法來做到這一點? – kateroh 2011-06-15 16:43:37

+0

我有一個可能的解決方案,但是當我嘗試編輯帖子時會出現問題。只要我能回覆,我會在我的主要回復中發帖。 – Khepri 2011-06-15 17:25:13

+0

我結束了使用2個查詢就像指出。謝謝! – kateroh 2011-06-16 17:35:04

4

有一個在查詢時出現錯誤:FirstNameLastName是多餘的。

SELECT @CustomerId = CustomerId 
FROM Customers 

而且我認爲你在Customers表多個客戶。所以這個查詢將返回最後一個CustomerId,我認爲這不是你想要的。所以你需要添加WHERE條件,或者TOP 1

事情是這樣的:

CREATE PROCEDURE getCustomer (@CustomerId int OUTPUT) 
AS 
BEGIN 
    select @CustomerId = id 
    from Customer 
    where <SomeCondition> 
END 

[編輯]當你的狀態,有錯誤是不是在SELECT聲明,它編譯和工作得很好,這裏是證明。請嘗試此代碼將工作沒有問題。

CREATE PROCEDURE getCustomer 
(
    @CustomerId int OUTPUT, 
    @CustomerName varchar(10) OUTPUT 
) 
AS 
BEGIN 
    SELECT @CustomerId = 666, @CustomerName = 'Test' 
END 
GO 

CREATE PROCEDURE getCustomer_and_more 
AS 
BEGIN 
    DECLARE @CustomerId int 
    DECLARE @CustomerName varchar(10) 

    EXEC getCustomer @CustomerId OUTPUT, @CustomerName OUTPUT 

    SELECT @CustomerId, @CustomerName 
END 
GO 

EXEC getCustomer_and_more 

這是導致你的錯誤代碼:

DECLARE @CustomerId int 

SELECT @CustomerId = CustomerId, FirstName, LastName 
FROM Customers 

這不是合法的SELECT聲明。試試這段代碼,你會看到與你在問題中顯示的完全相同的錯誤。

+0

查詢中沒有錯誤,我需要所有字段來構造業務層中的對象。另外,我需要從另一個存儲過程調用這個存儲過程,並在其中使用CustomerId。有一個'WHERE'子句保證返回0或1條記錄。這並不回答我的原始問題。 – kateroh 2011-06-15 06:18:03

+0

@kateroh您看到的錯誤是因爲您的第一個proc中的「SELECT」。第二個過程是正確的。你遇到的問題與輸出參數本身無關。 – 2011-06-15 06:28:04

+0

@kateroh - 在我的答案中添加了一個查詢來說明你的錯誤。 – 2011-06-15 06:40:20