Sql 从INSERT到存储过程的输出

Sql 从INSERT到存储过程的输出,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我正在编写一个存储过程,首先在表中插入新行。然后,另一个查询需要此查询生成的ID。是否可以使用输出访问先前生成的ID 这就是我到目前为止所做的,这几乎是一个猜测,没有工作 ALTER PROCEDURE [dbo].[addApp] @Name varchar(50) , @logoUrl varchar(150) , @siteUrl varchar(150) , @userId int , @canvasWidth int , @can

我正在编写一个存储过程,首先在表中插入新行。然后,另一个查询需要此查询生成的ID。是否可以使用输出访问先前生成的ID

这就是我到目前为止所做的,这几乎是一个猜测,没有工作

ALTER PROCEDURE [dbo].[addApp]

      @Name varchar(50) 
    , @logoUrl varchar(150)
    , @siteUrl varchar(150)
    , @userId int
    , @canvasWidth int
    , @canvasHeight int

AS
DECLARE @tempId INT
SET @tempid = INSERT INTO AppInfo (name, logoUrl, userId) 
              OUTPUT inserted.id 
              VALUES(@Name, @logoUrl, @userId);
INSERT INTO CanvasApps (id, siteUrl, canvasWidth, canvasHeight)
OUTPUT inserted.id
VALUES(@tempid, @siteUrl, @logoUrl, @userId);

只需使用以下变量:

@@IDENTITY
declare @tempId table (
    id int
)

INSERT INTO AppInfo (name, logoUrl, userId) 
       OUTPUT inserted.id into @tempId 
              VALUES(@Name, @logoUrl, @userId);

您需要将
输出的结果
放入一个表中,而不仅仅是一个标量变量:

@@IDENTITY
declare @tempId table (
    id int
)

INSERT INTO AppInfo (name, logoUrl, userId) 
       OUTPUT inserted.id into @tempId 
              VALUES(@Name, @logoUrl, @userId);
试试这个-

ALTER PROCEDURE [dbo].[addApp] 

      @Name VARCHAR(50)
    , @logoUrl VARCHAR(150)
    , @siteUrl VARCHAR(150)
    , @userId INT
    , @canvasWidth INT
    , @canvasHeight INT

AS BEGIN

    DECLARE @tempId INT

    INSERT INTO dbo.AppInfo (name, logoUrl, userId) 
    SELECT @Name, @logoUrl, @userId

    SELECT @tempId = SCOPE_IDENTITY()

    INSERT INTO dbo.CanvasApps (id, siteUrl, canvasWidth, canvasHeight) 
    SELECT @tempId, @siteUrl, @logoUrl, @userId

END 

只需在insert语句之后尝试此操作,并在第二个insert语句中使用此变量即可。:-

SET @BVar=SCOPE_IDENTITY() 

您甚至可以在一条语句中执行此操作:

ALTER PROCEDURE [dbo].[addApp] 

      @Name VARCHAR(50)
    , @logoUrl VARCHAR(150)
    , @siteUrl VARCHAR(150)
    , @userId INT
    , @canvasWidth INT
    , @canvasHeight INT

AS BEGIN

    INSERT INTO dbo.AppInfo (name, logoUrl, userId) 
    OUTPUT Inserted.ID, @siteUrl, @canvasWidth , @canvasHeight
       INTO dbo.CanvasApps (id, siteUrl, canvasWidth, canvasHeight)
    VALUES (@Name, @logoUrl, @userId)

END 

您应该使用,因为这仅限于As
@@Identity
不是的当前范围。我想除了为哈希创建salt之外,我从来没有见过一个地方可以用
@@Identity
作为解决方案
Scope_Identity()
据称是固定的,
OUTPUT
通常更有用。奇怪的是,你在说了
OUTPUT
不能转到变量之后,创建了一个变量表来演示。标量变量和表变量之间存在差异。同意。你回答的第一行应该说明这一点。当有文档和数百个示例时,你为什么要猜?很抱歉,我没有找到任何关于如何在这种情况下使用输出的好示例。现在我得到了一个完美的答案,希望它也能帮助其他人。和平