将变量和表参数之间的结果插入表

时间:2019-01-11 11:04:17

标签: sql sql-server

具有以下过程:

CREATE PROCEDURE [dbo].[Gest_Doc_SampleProc] 
    @Nome nvarchar(255), 
    @Descritivo nvarchar(255), 
    @SampleTable AS dbo.IDList READONLY
AS

DECLARE @foo int;

SELECT @foo=a.bar FROM TableA a WHERE a.Nome=@Nome

IF NOT EXISTS (SELECT a.bar FROM TableA a WHERE a.Nome=@Nome)
BEGIN
    INSERT INTO TableA VALUES (@Nome,@Descritivo)
    INSERT INTO TableB VALUES (scope_identity(),@SampleTable)
END

如图所示,我正在尝试将TableB的所有值以及SampleTable插入到scope_identity中。

SampleTable如下:

CREATE TYPE dbo.SampleTable
AS TABLE
(
  ID INT
);
GO

我该如何正确实现?

1 个答案:

答案 0 :(得分:2)

进行此类工作的正确方法是OUTPUT子句。尽管从技术上讲,单行插入并不需要,但是您也可以学习如何正确进行插入。甚至看起来像是单行插入的东西都可以有一个insert触发器来执行意外的操作。

PROCEDURE [dbo].[Gest_Doc_SampleProc] (
    @Nome nvarchar(255),
    @Descritivo nvarchar(255), 
    @SampleTable AS dbo.IDList
) READONLY AS
BEGIN
    DECLARE @ids TABLE (id int);
    DECLARE @foo int;

    SELECT @foo = a.bar
    FROM TableA a
    WHERE a.Nome = @Nome;

    IF NOT EXISTS (SELECT 1 FROM TableA a WHERE a.Nome = @Nome)
    BEGIN
       INSERT INTO TableA (Nome, Descritive)
            OUTPUT Inserted.id  -- or whatever the id is called
            INTO @ids;
           VALUES (@Nome,@Descritivo)


       INSERT INTO TableB (id, sampletable)
           SELECT id, @SampleTable
           FROM @ids;
    END;
END;  -- Gest_Doc_SampleProc

除了使用OUTPUT,此代码还将列列表添加到INSERT中。这是另一种最佳实践。