2010-08-02 17 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