Microsoft SQL 服务器 - 存储过程提供的默认值

Microsoft SQL Server - default value provided by stored procedure

是否可以有一个非空列,其中值是通过调用存储过程在插入时生成的,其参数是传递给插入行的值?

比如我有 table User:

| username | name | surname | id |

插入看起来像这样:

INSERT INTO USER (username, name, surname) 
VALUES ('myusername', 'myname', 'mysurname');

id 列填充了一个(整数)值,该值是通过使用参数 myusernamemynamemysurname 调用存储过程 mystoredproc 检索到的。

另一个问题是,这个存储过程是在每一行上调用,还是可以分组调用。例如,我希望我的存储过程采用 name 并向其附加一个随机整数,这样如果我插入 100 个名为 'David' 的用户,他们将得到相同的 [=14] =] 并且存储过程将只被调用一次。第二点有点不好的例子。

DECLARE @rc INT = 0,
  @UserID INT = ABS(CHECKSUM(NEWID())) % 1000000 + 1;

WHILE @rc = 0
BEGIN
  IF NOT EXISTS (SELECT 1 FROM dbo.Users WHERE UserId= @UserId)
  BEGIN
    INSERT dbo.Users(UserId) WHERE Username = @UserName SELECT @UserId;
    SET @rc = 1; 
  END
  ELSE
  BEGIN
    SELECT @UserId = ABS(CHECKSUM(NEWID())) % 1000000 + 1,
      @rc = 0;
  END
END

美好的一天,

Is it possible to have a non-null column where the value is generated at insert by calling a stored procedure

选项 1:请检查这是否适合您

  1. 为列指定默认值并使用 "NOT NULL"
  2. 在 table AFTER INSERT
  3. 上创建触发器
  4. 在触发器内部,您可以使用虚拟 table "inserted" 来获取插入的值。
  5. 使用这些值(使用插入的 table),您可以使用所有行所需的逻辑一次更新列

** 可能不需要使用外部 SP,但如果需要,您可以从触发器执行 SP

** 触发器执行的所有操作都与原始查询在同一个事务中。

would this stored procedure be called on each row

不!对于您在同一语句中插入的所有行,触发器将执行 一次。 inserted table 包括所有插入的行。在您的更新部分(第 4 步),您可以更新一次插入的所有行,而无需为每一行执行某些操作

** 如果您确实使用了从触发器执行的外部 SP,那么您可以将所有插入的 table 作为一个 using Table-Valued Parameter

传递

--------------------更新----------------

这是使用此逻辑的完整示例:

drop table if exists T;
CREATE TABLE T (id int identity(2,2), c int NOT NULL default 1)
GO

CREATE TRIGGER tr ON T AFTER INSERT
AS BEGIN
    SET NOCOUNT ON;

    UPDATE T SET T.c = T2.C + 1
    FROM inserted T2
    INNER JOIN T T1 ON T1.id = T2.id

END

INSERT T(c) values (1) -- I insert the value 1 but the trigger will change it to 1+1=2
select * from T
GO

-- test multiple rows:
INSERT T(c) values (10),(20),(30),(40)
select * from T
GO