0

SQL Server 2012 で (クラシック ASP ページのバックエンドとして) スクリプトを作成して、最初のテーブル ( ) からすべての行を選択し、それらを他の 3 つのテーブル ( 、、および)aaa_test_apに分配しています。 aaa_test_usersaaa_test_users_positionsaaa_test_users_education

aaa_test_users.ID行が挿入されたら、User_ID同じクエリ内で、他の 2 つのテーブル挿入で FK ( ) として使用するために、 の ID を取得したいと考えています。

INSERT INTO1 つのクエリ内 で、メソッドを使用して ID を取得することは可能ですか?

を使用してみましSCOPE_Identity()たが、最後の値しか返されません。

このOUTPUTメソッドでは、最初の挿入ステートメントによって生成された値が次の 2 つのステートメントに挿入され、それぞれ正しい挿入行に挿入されるように、生成されたテーブル値をどのように利用すればよいでしょうか?

まず、テーブル:

CREATE TABLE [dbo].[aaa_test_sp]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [UserName] [nvarchar](50) NULL,
    [first_name] [nvarchar](50) NULL,
    [last_name] [nvarchar](50) NULL,
    [position] [nvarchar](50) NULL,
    [phone] [nvarchar](50) NULL,
    [education] [nvarchar](50) NULL,
    [ListID] [int] NULL,

    CONSTRAINT [PK_aaa_test_sp] 
       PRIMARY KEY CLUSTERED ([ID] ASC)
 ) ON [PRIMARY]
 GO

CREATE TABLE [dbo].[aaa_test_users]
(
    [UserID] [int] IDENTITY(1,1) NOT NULL,
    [UserName] [nvarchar](50) NULL,
    [first_name] [nvarchar](50) NULL,
    [last_name] [nvarchar](50) NULL,

    CONSTRAINT [PK_aaa_test_users] 
       PRIMARY KEY CLUSTERED ([UserID] ASC)
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[aaa_test_users_positions]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [UserID] [int] NULL,
    [position] [nvarchar](50) NULL,
    [phone] [nvarchar](50) NULL,

    CONSTRAINT [PK_aaa_test_users_positions] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[aaa_test_users_education] 
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [UserID] [int] NULL,
    [education] [nvarchar](50) NULL,

    CONSTRAINT [PK_aaa_test_users_education] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
) ON [PRIMARY]
GO

これは私が取り組んできたクエリです:

--declare @NewUserID nvarchar(50)
DECLARE @InsertOutput1 table (UserID nvarchar(50));

--insert, first, rows from sp to users, and get the autoNumber'ed ID,
--"NewUserID"
INSERT INTO aaa_test_users (UserName, first_name, last_name)
OUTPUT inserted.UserID INTO @InsertOutput1
    SELECT 
        UserName, first_name, last_name
    FROM aaa_test_sp
    WHERE (ListId = '1')

--select * from @InsertOutput1
--SELECT SCOPE_IDENTITY() As NewUserID
--set @NewUserID=(SELECT SCOPE_IDENTITY() )

--now that the "NewUserID" has been generated,
--insert it, along with other columns,
--into the 'users_positions' table.
--print 'new user id is ' + @NewUserID
INSERT INTO aaa_test_users_positions (UserID, position, phone)
    (SELECT 
         @NewUserID, position, phone
     FROM aaa_test_sp
     WHERE (ListId = '1')
    )

--now that the "NewUserID" has been generated,
--insert it, along with other columns,
--into the 'users_education' table 
--print @NewUserID
INSERT INTO aaa_test_users_education (UserID, education)
   (SELECT @NewUserID, education
    FROM aaa_test_sp
    WHERE (ListId = '1'))
4

1 に答える 1

0

新しい ID があるテーブルに参加します。

2 番目の挿入の例として:

INSERT INTO aaa_test_users_positions(UserID, position, phone)
    SELECT io.UserID, position, phone
    FROM aaa_test_sp cross join
         @InsertOutput1 io
    WHERE ListId = '1';

注: 構造を考えると、おそらく には 1 行しか@InsertOutput1ないため、予想よりも多くの行が生成されることはありません。

于 2015-09-18T22:59:04.730 に答える