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

use*_*283 1 sql t-sql sql-server 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 
Run Code Online (Sandbox Code Playgroud)

后来我得到了

找不到存储过程'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);
Run Code Online (Sandbox Code Playgroud)

我在哪里错了?

Nic*_*aid 5

如@MohammadSanati所述,OUTPUT只能插入表或表变量.

所以它假定@new_guid是一个表变量但无法找到它声明.(它声明为UNIQUEIDENTIFIER而非表格).因此你CREATE PROC失败..随后当你尝试调用它时它无法找到它而你得到'找不到存储过程....

所以你需要在你之后声明一个表变量BEGIN,如下所示:

DECLARE @OutputTable TABLE (AColumn UNIQUEIDENTIFIER)
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

OUTPUT INSERTED.id INTO @OutputTable (AColumn)
Run Code Online (Sandbox Code Playgroud)

然后将它加载到输出变量中,如下所示:

SELECT TOP 1 @new_guid = AColumn FROM @OutputTable
Run Code Online (Sandbox Code Playgroud)

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