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

时间:2011-09-13 20:41:30

标签: sql sql-server sql-server-2008 insert

好的,这就是我的查询......我刚刚添加了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

我要做的是先在帐户表中插入并获取该ID,然后将插入ID添加到引导表中。这是否可能

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

6 个答案:

答案 0 :(得分: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';

查询:

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;

检查:

SELECT * FROM dbo.Accounts;
SELECT * FROM dbo.Leads;

清理:

USE tempdb;
GO
DROP TABLE dbo.Temp, dbo.Accounts, dbo.Leads;

答案 1 :(得分:4)

你可能在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;
')

答案 2 :(得分:3)

它无法正常工作,因为您要插入6个值,但只指定了5列:

这些是5列:

LEADID,
    CREATEUSER,
    CREATEDATE,
    FIRSTNAME,
        ACCOUNTID

Ant这些是6个值:

'Q' + cast(floor(999997 * RAND(convert(varbinary, newid()))) as varchar(20)) 
       ,'U6UJ9000S'
       ,CURRENT_TIMESTAMP
       ,'U6UJ9000S'    
       ,name
       ,@accountID

我不知道你从哪里得到@accountID,但我想你在上面的其他地方定义它。

在您插入帐户表后,您可以按如下方式获取@accountID

select @accountID=scope_identity()

然后执行插入到Leads表中。

更新:示例:

declare @accountID int 
INSERT INTO Account (col1,col2,col...)
values ('foo','bar','baz')

select @accountID=SCOPE_IDENTITY()

INSERT INTO Leads (
    LEADID,
    CREATEUSER,
    CREATEDATE,
    FIRSTNAME,
        ACCOUNTID
) 
values 
(
      'Q' + cast(floor(999997 * RAND(convert(varbinary, newid()))) as varchar(20))  --leadid
       ,'U6UJ9000S' --createuser
       ,CURRENT_TIMESTAMP  --createdate
       ,t.name --firstname
       ,@accountID --accountID
)

答案 3 :(得分:1)

将一个变量设置为Scope_identity()(返回最后创建的id)并使用

答案 4 :(得分:1)

使用SQL Server 2005或更高版本,您可以使用OUTPUT子句。

CREATE TABLE #Inserted (AccountID, AccountName)

INSERT Account (AccountName)
OUTPUT Inserted.AccountID, Inserted.AccountName
INTO #Inserted

SELECT AccountName
FROM Temp

INSERT Leads (
    LEADID,
    CREATEUSER,
    CREATEDATE,
    FIRSTNAME,
        ACCOUNTID
) 
SELECT 
       'Q' + cast(floor(999997 * RAND(convert(varbinary, newid()))) as varchar(20)) 
       ,'U6UJ9000S'
       ,CURRENT_TIMESTAMP
       ,t.name
       ,i.AccountID

  FROM Temp AS t
  JOIN #Inserted AS i ON t.AccountName= i.AccountName

答案 5 :(得分:0)

您可以声明一个变量,将其设置为所需的id并使用插入中的变量。