具有以下过程:
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
我该如何正确实现?
答案 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
中。这是另一种最佳实践。