2016-02-04 25 views
1

我得到它的身体内我AddPartner存储过程:为什么我得到“必须声明表变量...”的错误吗?

-- Create stored procedure for inserting a partner and returning the id of that inserted partner 
CREATE PROCEDURE AddPartner (@name  NVARCHAR(50), 
          @email NVARCHAR(254), 
          @new_guid UNIQUEIDENTIFIER OUTPUT) 
AS 
BEGIN 
    SET NOCOUNT ON 

    INSERT INTO Partners (name, email) 
    OUTPUT INSERTED.id INTO @new_guid 
    VALUES (@name, @email) 
END 

再后来我越来越

未能找到存储过程“AddPartner”。

但我假定这与前面提到的错误?我试图使用它,这样我可以得到新插入的项目的id和使用,在一个相关的表中插入:

DECLARE @first_partner_id AS UNIQUEIDENTIFIER 

EXEC AddPartner 'Haliburton', '[email protected]', @first_partner_id OUTPUT; 

INSERT INTO Partners (name, email) 
VALUES ('Berkshire Hathaway', '[email protected]'); 

INSERT INTO Partners (name, email) 
VALUES ('Jason', '[email protected]'); 

--     Partners 
-- ============================================================ 
--  id | name     | email 
-- ============================================================ 
--  1 | 'Haliburton'   | '[email protected]' 
--  2 | 'Berkshire Hathaway' | '[email protected]' 
--  3 | 'Jason'    | '[email protected]' 


INSERT INTO Answers (question_id, partner_id, val) 
VALUES (1, @first_partner_id, 24); 

INSERT INTO Answers (question_id, partner_id, val) 
VALUES (1, @first_partner_id, 50); 

INSERT INTO Answers (question_id, partner_id, val) 
VALUES (3, @first_partner_id, 90); 

我要去哪里错了吗?

+0

尝试包括架构:'EXEC dbo.AddPartner。 。 。 '。 –

+0

使用错误信息就像你的标题可以使用动态sql来解决它。但是因为你找不到存储过程'AddPartner'。我想你应该首先尝试戈登的建议 –

回答

2

基于下面的文档,输出变量必须是可变

<OUTPUT_CLAUSE> ::= 
{ 
    [ OUTPUT <dml_select_list> INTO { @table_variable | output_table } [ (column_list) ] ] 
    [ OUTPUT <dml_select_list> ] 
} 

Output INSER

5

一个表如@MohammadSanati答案所述,OUTPUT只能插入到一个表或表变量。

则认为@new_guid是表变量,但无法找到它宣布。 (其声明为UNIQUEIDENTIFIER而不是表格)。因此您CREATE PROC失败。随后,当您尝试并调用它,它不能找到它,你会得到“找不到存储过程....

所以,你需要你的BEGIN后申报表变量,是这样的:

DECLARE @OutputTable TABLE (AColumn UNIQUEIDENTIFIER) 

然后使用它是这样的:

OUTPUT INSERTED.id INTO @OutputTable (AColumn) 

然后将其加载到你的输出变量是这样的:

SELECT TOP 1 @new_guid = AColumn FROM @OutputTable 

注:如果产生这样一个以上的记录只是挑选任意一个。

+0

的'TOP'是放错了地方:'SELECT TOP 1 @new_guid = [将aColumn] FROM @ OutputTable' – naXa

+0

哦谢谢 - 我会解决它。虽然我认为OP已经放弃 –

相关问题