2011-09-13 100 views
-2

好,所以這是查詢我...我只是添加了ACCOUNTID和被obviosly不工作有沒有辦法在插入查詢中做另一個查詢?

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 

我所試圖做的是做一個插入到該帳戶表第一@accountID部分並獲取該ID並將此插入ID添加到此引入表中。是,甚至有可能

所以基本上在臨時表,我需要插入一條記錄在賬戶表中沒有值只需要ACCOUNT_ID所以,當我在引線表中插入我有帳戶ID,使每個記錄插入

+0

? – Wil

+0

SQL Server 2008中 – Trace

+2

看看了'OUTPUT'條款http://msdn.microsoft.com/en-us/library/ms177564.aspx –

回答

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; 
+0

這種方式也有效,我沒有意識到INSERTS可以像這樣串聯起來。 – Wil

+0

@它不是微不足道的,尤其是如果你需要源表中的數據最終在第二個表中,而不是*第一個......但在這種情況下(假設名稱和名字應該是相同的) ... –

+0

@Aaron你能解釋一下這對我有點...對不起我是一個PHP的MySQL的開發人員,我真的沒有一個總的瞭解什麼在這裏做的 – Trace

1

設置一個變量來SCOPE_IDENTITY()(返回已創建的最後一個ID),並使用該

+0

怎麼會怎麼做...我是一個MySQL的PHP​​開發人員和SQL服務器是我的專長 – Trace

+1

好吧沒有冒犯,但如果SQL Server是「你的專業」,那麼你爲什麼要做SQL Server的工作?如果您需要使用SQL Server,那麼您應該承諾學習SQL Server如何工作或僱傭已知的人。 –

0

你可以聲明一個變量,將其設置爲所需的ID和使用中插入變量。

+0

我將如何聲明一個變量...你能告訴我一個例子 – Trace

+1

Alex,在SQL Server Management studio中按F1。點擊搜索標籤。 – Wil

+0

DECLARE @variable AS INT; –

3

這是行不通的,因爲你插入6個值,但你只指定了5列:

這是5列:

LEADID, 
    CREATEUSER, 
    CREATEDATE, 
    FIRSTNAME, 
     ACCOUNTID 

螞蟻這6個數值:

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

我不知道你從哪裏得到@accountID,但我想你可以在上面的其他地方定義它。

你可以得到@accountID如下,你插入到Account表後:

select @accountID=scope_identity() 

然後執行插入到信息表。

UPDATE:例子:

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 
) 
+1

不,我有6和6這是一個錯字.... accountid是我的問題是所有關於...在我的問題的頂部,你會看到我說它顯然不工作 – Trace

+0

你可以解釋這裏選擇@帳戶ID = SCOPE_IDENTITY()變爲我的腳本 – Trace

+0

的選擇@帳戶ID = SCOPE_IDENTITY()應該是第一行你就INSERT INTO帳戶後,(你在你的問題,你做一個INSERT INTO帳戶表中提到,不是嗎? )SCOPE_IDENTITY()函數返回在當前範圍內插入到Account表中的最後一條記錄的最後一個id。在這裏閱讀更多:http://msdn.microsoft.com/en-us/library/ms190315.aspx – Icarus

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 
+0

你能解釋一下#Inserted部分和這是什麼 – Trace

+0

這是一個臨時表。這些是非常基本的SQL Server概念(臨時表,變量)。該腳本正在做的是創建一個臨時表來存放插入的AccountID。 INSERT之後的OUTPUT子句將輸出accountid和name到#Inserted中。從那裏你可以將新插入的accountids返回到Temp中的賬戶名(我假設存在),以便插入到Leads表中。 – Wil

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; 
') 
您正在使用什麼版本的SQL Server
相關問題