2012-02-28 17 views
0

我已經在SQL Server克隆自動識別到SQL Server的另一場

CREATE TABLE [dbo].[SimpleTable](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [varchar](50) NOT NULL, 
    [OtherField] [varchar](50) NOT NULL, 
    [Position] [int] NULL, 
CONSTRAINT [PK_SimpleTable] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

當一個新的記錄被插入我想更新從IDENTITY列中的值的位置字段創建在下表中,主想法是記錄應該放在最後,但用戶以後可以改變這個位置。

我想過創建一個觸發器並在插入後更新位置字段,但是我會有很多這些表,我真的想盡量遠離觸發器,如果​​可以的話。

有沒有人有更優雅的解決方案?

+0

觸發似乎像這個最合適的解決方案 - 除非你能忍受只更新'位置'列,例如每隔一小時;那麼你可以有一個SQL工作,只會更新那些沒有價值的行... – 2012-02-28 15:20:17

+0

我可以,但我不認爲它的必要性,他的消息,他總是想要的位置等於ID – Diego 2012-02-28 19:45:06

回答

1

這應該在存儲過程中工作。

CREATE PROCEDURE [dbo].[InsertIntoSimpleTable] 
    @Name varchar(50) 
, @OtherField varchar(50) 
AS 
BEGIN 
    DECLARE @Id INT; 

    --- Do your insert here. 
    INSERT INTO SimpleTable (Name, OtherField) 
    SELECT @Name, @OtherField 
    ; 

    SELECT @Id = SCOPE_IDENTITY(); 

    UPDATE SimpleTable SET Position = @Id WHERE Id = @Id; 
END 
0

觸發器並沒有那麼糟糕。 希臘的解決方案是好的,但我張貼引發劑溶液怎麼會是如果你不通過程序將數據插入到表中

create trigger TR_SetDefaultValue 
on [SimpleTable] 
after insert 
as 
begin 
    UPDATE [SimpleTable] 
    SET [Position] = I.[ID] 
    FROM INSERTED AS I 
    WHERE [SimpleTable].ID=I.ID 
end 
+0

在觸發器中更新之前,您可能需要檢查插入的[位置]列未被明確設置。 – 2012-02-28 17:48:06