为什么我得到"必须声明表变量..."错误在这里?

时间:2016-02-04 02:28:57

标签: sql sql-server tsql database-design

我在我的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', 'DCheney@Haliburton.org', @first_partner_id OUTPUT;

INSERT INTO Partners (name, email) 
VALUES ('Berkshire Hathaway', 'WarrenBridgemaster@bershire.org');

INSERT INTO Partners (name, email) 
VALUES ('Jason', 'jason89@gmail.com');

--                  Partners 
-- ============================================================
--     id  | name                  | email
-- ============================================================
--      1  | 'Haliburton'          | 'DCheney@Haliburton.org'
--      2  | 'Berkshire Hathaway'  | 'WarrenBridgemaster@bershire.org'
--      3  | 'Jason'               | 'jason89@gmail.com'


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);

我在哪里错了?

2 个答案:

答案 0 :(得分: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

注意:如果生成了多条记录,则只选择一条记录。

答案 1 :(得分:2)

基于以下文档,输出变量必须是表变量

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

Output INSER