Sql server SQL Server表中的第二个计数器

Sql server SQL Server表中的第二个计数器,sql-server,counter,Sql Server,Counter,我需要一张这样的桌子: CLIENT_ID ID CONTENT -------------------- 1 1 abc 1 2 abc 1 3 abc 2 1 abc 2 2 abc 2 3 abc client_id和id是表的主键。在应用程序端,只知道客户端client\u id和content,所以我想有一个插入后触发器,根据需要更新id列,但我遇到了麻烦。有什么帮助吗?谢谢

我需要一张这样的桌子:

CLIENT_ID ID CONTENT
--------------------
1         1  abc
1         2  abc
1         3  abc
2         1  abc
2         2  abc
2         3  abc
client_id
id
是表的主键。在应用程序端,只知道客户端
client\u id
content
,所以我想有一个插入后触发器,根据需要更新
id
列,但我遇到了麻烦。有什么帮助吗?谢谢

我的第一次尝试是:

CREATE TRIGGER test
ON [dbo].[table]
AFTER INSERT
AS 
BEGIN
    DECLARE @client_id INT;
    DECLARE @id INT;

    SELECT @client_id = client_id 
    FROM inserted;

    SELECT @id = ISNULL(MAX(clifor_id), 0) + 1 
    FROM table
    WHERE client_id = @client_id

    UPDATE [dbo].[table]
    SET [id] = @id
    WHERE ?????
END
但我不知道如何完成它


ps:对不起我的英语

@Squirrel为你指出了一个好的方向-而不是触发器是一种方法。S.t.像这样:

CREATE TRIGGER test
ON [dbo].[table]
INSTEAD OF INSERT
AS 
BEGIN
    UPDATE inserted
    SET id = (select 1+max(id) from dbo.table where client_id = inserted.client_id)

    INSERT INTO dbo.table
    SELECT * FROM inserted --note - you should rewrite this block so it will be with explicit list of columns
END

请注意,如果您可以在一个查询中为同一客户机插入多个条目,则此操作将失败。

触发什么事件?“第二个计数器”与您显示的表有什么关系?请重新考虑你的问题,因为你问的不是很清楚。请看一些提示,因为你说你正在尝试,你所尝试的代码是什么,你得到了什么错误?你需要使用<代码>而不是< /代码>触发器,而不是<>代码> 触发器。如果您不提供
id
列,则插入将失败。您的触发器有一个主要缺陷,您似乎认为它每行调用一次,但事实并非如此。触发器将对每条语句触发一次,因此,如果导致此触发器触发的
INSERT
插入了25行,则触发器将触发一次,而
Inserted
伪表将包含25行。您的代码将从插入的
中选择这25行中的哪一行?这是不确定的,您将得到一个任意行,而忽略所有其他行。你需要重写你的触发器来考虑这一点!