有没有办法在插入查询中进行另一个查询?

Mat*_*iby -2 sql sql-server insert sql-server-2008

好的,这就是我的查询......我刚刚添加了ACCOUNTID和@accountID部分,这显然不起作用

INSERT INTO Leads (
    LEADID,
    CREATEUSER,
    CREATEDATE,
    FIRSTNAME,
    MODIFYDATE,
        ACCOUNTID
) 
SELECT 
       'Q' + cast(floor(999997 * RAND(convert(varbinary, newid()))) as varchar(20)) 
       ,'U6UJ9000S'
       ,CURRENT_TIMESTAMP
       ,'U6UJ9000S'    
       ,name
       ,@accountID

  FROM Temp
Run Code Online (Sandbox Code Playgroud)

我想要做的是先在帐户表中插入并获取该ID,并将插入ID添加到此插入引导表中.这甚至是可能的

基本上对于Temp表中的每条记录,我需要在帐户表中插入一条记录,没有值只需要account_id所以当我在lead表中插入时,我有了帐号id来进行插入

Aar*_*and 6

建立:

USE TempDB;
GO

CREATE TABLE dbo.Leads
(
    LeadID VARCHAR(64),
    CreateUser VARCHAR(32),
    CreateDate DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    FirstName VARCHAR(32),
    AccountID INT
);

CREATE TABLE dbo.Accounts
(
    AccountID INT IDENTITY(1,1),
    name VARCHAR(32) /* , ... other columns ... */
);

CREATE TABLE dbo.Temp(name VARCHAR(32));

INSERT dbo.Temp SELECT 'foo'
UNION SELECT 'bar';
Run Code Online (Sandbox Code Playgroud)

查询:

INSERT dbo.Accounts
(
    name
)
OUTPUT
    'Q' + cast(floor(999997 * RAND(convert(varbinary, newid()))) as varchar(20)),
    'U6UJ9000S',
    CURRENT_TIMESTAMP,
    inserted.name,
    inserted.AccountID
INTO dbo.Leads
SELECT name
FROM dbo.Temp;
Run Code Online (Sandbox Code Playgroud)

校验:

SELECT * FROM dbo.Accounts;
SELECT * FROM dbo.Leads;
Run Code Online (Sandbox Code Playgroud)

清理:

USE tempdb;
GO
DROP TABLE dbo.Temp, dbo.Accounts, dbo.Leads;
Run Code Online (Sandbox Code Playgroud)


Mar*_*ith 5

在 Aaron 使用可组合 DML 的实践中,您可能最终会遇到的问题是,实际上您可能会定义一个 FK 来约束Leads(AccountId)有效值,在这种情况下您将遇到错误。

OUTPUT INTO 子句的目标表“dbo.Leads”不能位于(主键、外键)关系的任一侧。找到参考约束“FK_foo”。

为了避免这个问题,您可以使用

INSERT INTO dbo.Leads
EXEC('
INSERT INTO dbo.Accounts
OUTPUT
    ''Q'' + cast(floor(999997 * RAND(convert(varbinary, newid()))) as varchar(20)),
    ''U6UJ9000S'',
    CURRENT_TIMESTAMP,
    inserted.name,
    inserted.AccountID
SELECT name
FROM dbo.Temp;
')
Run Code Online (Sandbox Code Playgroud)