2010-08-02 40 views
1

我有2個表問題與SQL表更新用

CREATE TABLE PODRAS_MS.tbl_FieldWorkers 
(
    [FWInsOnServerID] INT    NOT NULL IDENTITY(1,1), 
    [BaseStationID]  INT    NOT NULL, 
    [RefID]   INT      NOT NULL, 
    [DisSubInsID]  INT    NOT NULL, 
    [FieldWorkerID]  CHAR(7)     NOT NULL, 
    [LastRecDate]  DATETIME    NOT NULL, 
) 
ALTER TABLE PODRAS_MS.tbl_FieldWorkers ADD CONSTRAINT PK_FieldWorkers_FWInsOnServerID PRIMARY KEY([FWInsOnServerID]) 
ALTER TABLE PODRAS_MS.tbl_FieldWorkers ADD CONSTRAINT FK_FieldWorkers_DisSubInsID FOREIGN KEY([DisSubInsID]) REFERENCES PODRAS_MS.tbl_DisasterSubInstances([SubInsID]) ON UPDATE CASCADE ON DELETE NO ACTION 
ALTER TABLE PODRAS_MS.tbl_FieldWorkers ADD CONSTRAINT FK_FieldWorkers_BaseStationID FOREIGN KEY([BaseStationID]) REFERENCES PODRAS_MS.tbl_BaseStations([BaseStationID]) ON UPDATE CASCADE ON DELETE NO ACTION 
ALTER TABLE PODRAS_MS.tbl_FieldWorkers ADD CONSTRAINT DF_FieldWorkers_LastRecDate DEFAULT(GETDATE()) FOR [LastRecDate] 
GO 

CREATE TABLE PODRAS_MS.tbl_FieldWorkerNodeGPSLocations 
(
    [FWNStatID]   INT   NOT NULL IDENTITY(1,1), 
    [FWInsOnServerID]   INT   NOT NULL, 
    [Latitude]   DECIMAL(20,17)   NOT NULL, 
    [Longitude]   DECIMAL(20,17)   NOT NULL, 
    [UpdateOn]   DATETIME  NOT NULL, 
) 
ALTER TABLE PODRAS_MS.tbl_FieldWorkerNodeGPSLocations ADD CONSTRAINT PK_FieldWorkerNodeGPSLocations_FWNStatID PRIMARY KEY([FWNStatID]) 
ALTER TABLE PODRAS_MS.tbl_FieldWorkerNodeGPSLocations ADD CONSTRAINT FK_FieldWorkerNodeGPSLocations_FWInsOnServerID FOREIGN KEY([FWInsOnServerID]) REFERENCES PODRAS_MS.tbl_FieldWorkers([FWInsOnServerID]) ON UPDATE CASCADE ON DELETE NO ACTION 
ALTER TABLE PODRAS_MS.tbl_FieldWorkerNodeGPSLocations ADD CONSTRAINT DK_FieldWorkerNodeGPSLocations_UpdateOn DEFAULT(GETDATE()) FOR [UpdateOn] 
GO 

兩個表通過在所述第一表中的web服務的所有字段可以通過網絡服務被插入,但在第二個表僅數據[緯度更新],[經度],[UpdateOn]字段來自webservice.so我的問題是我如何插入值到[FWInsOnServerID]字段,因爲它沒有通過webservice和它的第一張表的參考?

回答

1

如果我正確理解你,第二個表中的插入取決於第一個表中插入的結果?

在這種情況下,您可以簡單地返回第一個表的生成ID並使用該結果插入到第二個表中。

類似於(如果您使用的是存儲過程)。

SELECT SCOPE_IDENTITY() 

在存儲過程結束時。然後在處理數據庫代碼的.NET代碼中,使用該數字執行第二次插入。

+0

邑這就是我要找4.thanks 4 DA的答覆! – chamara 2010-08-02 15:41:40

1

你可以做到這一切在這樣一個存儲過程:

CREATE PROCEDURE PODRAS_MS.insert_FieldWorker() 
    @BaseStationID INT, 
    @RefID INT, 
    @DisSubInsID INT, 
    @FieldWorkerID CHAR(7), 
    @Latitude DECIMAL(20,17), 
    @Longitude DECIMAL(20,17) 
AS 
BEGIN 

    INSERT INTO 
    PODRAS_MS.tbl_FieldWorkers 
    ([BaseStationID], [RefID], [DisSubInsID], [FieldWorkerID]) 
    VALUES (@BaseStationID, @RefID, @DisSubInsID, @FieldWorkerID) 

    DECLARE @FWInsOnServerID INT 
    SELECT @FWInsOnServerID = SCOPE_IDENTITY() 

    INSERT INTO PODRAS_MS.tbl_FieldWorkerNodeGPSLocations 
    ([FWInsOnServerID], [Latitude], [Longitude]) 
    VALUES (@FWInsOnServerID, @Latitude, @Longitude) 

END 

然後,您可以選擇同一個存儲過程的記錄,但更常見的是分離這一點到另一個存儲過程。

編輯:使用輸出參數

CREATE PROCEDURE PODRAS_MS.insert_FieldWorker() 
    @BaseStationID INT, 
    @RefID INT, 
    @DisSubInsID INT, 
    @FieldWorkerID CHAR(7), 
    @FWInsOnServerID INT output 
AS 
BEGIN 

    INSERT INTO 
    PODRAS_MS.tbl_FieldWorkers 
    ([BaseStationID], [RefID], [DisSubInsID], [FieldWorkerID]) 
    VALUES (@BaseStationID, @RefID, @DisSubInsID, @FieldWorkerID) 

    SELECT @FWInsOnServerID = SCOPE_IDENTITY() 

END 
+0

我希望能使用2個存儲過程。你能告訴我如何將第一個SP的返回值傳遞給第二個SP,以及如何在第二個SP中調用它。謝謝! – chamara 2010-08-02 15:39:58

+0

是的,看我的編輯。您必須傳入可在SP中設置的參數,然後在處理代碼中讀取它。有些人可能會建議一個返回值,但我建議您保存錯誤/成功處理的內容,當然您應該添加該內容。 ;) – 2010-08-02 15:52:25