好的,这就是我的查询......我刚刚添加了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来进行插入
答案 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并使用插入中的变量。