2009-10-19 120 views
3

我有四個表:消息,MessageCategory,MessageStatus和MessageLevel。插入來自多個表的數據

MessageCategory,MessageStatus和MessageLevel都只有三個字段:標識(主鍵),代碼和描述。消息引用這三個字段,並有幾個其他數據字段,包括標識(主鍵)MessageText和Order。身份字段是自動遞增的字段。

我現在需要編寫一個SQL腳本來爲所有四個表添加一些默認數據。問題是,我需要創建一個腳本,將其發送給將執行此腳本的客戶。我無法編寫更智能的代碼來完成整個更新。雖然三個表只是簡單的插入語句,但它是Messages表,這引起我一些額外的麻煩。

我不能刪除任何指標,我不能假設它開始從1開始爲主鍵計數。

所以,作爲一個例子,她的一些數據:

INSERT INTO MessageCategory (Code) Values ('Cat01'); 
INSERT INTO MessageStatus (Code) Values ('Status01'); 
INSERT INTO MessageLevel (Code) Values ('Level01'); 

而且消息將需要的東西是這樣的:

INSERT INTO Messages(Category, Status, Level, MessageText, Order) 
VALUES(
    (SELECT Identity from MessageCategory where Code='Cat01'), 
    (SELECT Identity from MessageStatus where Code='Status01'), 
    (SELECT Identity from MessageLevel where Code='Level01'), 
    'Just some message', 
    1 
); 

這是行不通的,雖然。那麼,有什麼訣竅讓這個工作? (保持代碼的可讀性...)

不幸的是,我沒有訪問其他數據庫。我可以測試它,但一旦它似乎工作,這只是一個發送和祈禱它的工作的問題...

回答

6
INSERT INTO Messages 
    (Category, Status, Level, MessageText, [Order]) 
SELECT 
    (SELECT TOP 1 [Identity] from MessageCategory where Code='Cat01') AS Category, 
    (SELECT TOP 1 [Identity] from MessageStatus where Code='Status01') AS Status, 
    (SELECT TOP 1 [Identity] from MessageLevel where Code='Level01') AS Level, 
    (SELECT 'Just some message') AS MessageText, 
    (SELECT 1)      AS [Order] 

以上將適用於SQL Server。請注意,IdentityOrder都是保留的T-SQL關鍵字,不應用於列名。還要注意,子查詢不得返回多於一行,以確保我已包含TOP 1語句。

接下來要注意的是,列別名(AS Category等)不是嚴格必要的。他們的順序是重中之重。爲了便於閱讀,我會包括它們,尤其是當SELECT列表變長時。

+0

我傾向於在我的SQL腳本用方括號[]周圍的所有表和字段名稱。這解決了可能的衝突。我傾向於使用更多的保留字作爲字段和表名,因此添加括號對我來說是一種自動操作。 :-) – 2009-10-19 12:58:26

+0

所以你應該在你的示例代碼中做到這一點。以及。 ;-) – Tomalak 2009-10-19 13:01:55

+0

是的,我希望那些括號會混淆一些,所以我實際上刪除了它們。 :-) – 2009-10-19 14:45:03

4

如果它是一個腳本,存儲您的身份變量:

declare MessageCategoryID int; 
declare MessageStatusID int; 
declare MessageLevel int; 
INSERT INTO MessageCategory (Code) Values ('Cat01'); 
set @MessageCategoryID=scope_identity(); 
INSERT INTO MessageStatus (Code) Values ('Status01'); 
set @MessageStatudID=scope_identity(); 
INSERT INTO MessageLevel (Code) Values ('Level01'); 
set @MessageLevelID=scope_identity(); 

INSERT INTO Messages(Category, Status, Level, MessageText, Order) 
    VALUES(
     @MessageCAtegoryID, 
     @MessageStatusID, 
     @MessageLevelID, 
     'Just some message', 
     1); 
+0

它是一個單獨的腳本,但在Messages表中會有幾十個記錄。 – 2009-10-19 12:55:07

+4

而不是使用@@ identity使用scope_identity。如果將觸發器添加到表中,@@身份可能會導致嚴重的數據完整性問題。 – HLGEM 2009-10-19 13:10:47

+0

從未使用scope_identity(),但從現在開始。謝謝你的提示! – Kendrick 2009-10-19 15:45:55