按照您的请求使用INSTEAD触发这个SQL代码可以让你开始。
CREATE TABLE dbo.SampleTable
(
ID INT,
SomeOtherValue VARCHAR(100) NULL
)
GO
CREATE TRIGGER dbo.TR_SampleTable_Insert
ON dbo.SampleTable
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
-- Inserting rows with IDs
INSERT INTO dbo.SampleTable (
ID,
SomeOtherValue)
SELECT
ID,
SomeOtherValue
FROM
Inserted
WHERE
ID IS NOT NULL
-- Now inserting rows without IDs
INSERT INTO dbo.SampleTable (
ID,
SomeOtherValue)
SELECT
(SELECT ISNULL(MAX(ID), 0) FROM dbo.SampleTable)
+ ROW_NUMBER() OVER(ORDER BY ID DESC),
SomeOtherValue
FROM
Inserted
WHERE
ID IS NULL
END
GO
INSERT INTO dbo.SampleTable
SELECT 1, 'First record with id'
UNION
SELECT NULL, 'First record without id'
UNION
SELECT 2, 'Second record with id'
UNION
SELECT NULL, 'Second record without id'
GO
SELECT * FROM dbo.SampleTable
GO
我完全同意以前的意见,不推荐将旧ID与新ID混合。 – JCallico 2010-07-14 16:14:26
谢谢 - 只是我正在寻找的那种例子:-) 关于ID的混合,我看到了不足之处 - 但是这个项目也给这个方法带来了一些缺点,与这个技术问题无关。 – 2010-07-15 07:26:01
很高兴我能够帮助。这就是为什么我实现了你原来所要求的,而不是立即建议一种替代方法,只是为了跳跃才能获得积分。这些日子似乎是StackOverflow的趋势。 – JCallico 2010-07-15 17:10:53