您可以在默认约束中使用插入的变量吗

Vah*_*ian 6 join sql-server default-value cast

在 SQL Server 中工作,假设我有一个包含两个表的数据库:eventscompetitors.

events 有以下列:

[event_id] [event_name] [winner_id] [loser_id]
Run Code Online (Sandbox Code Playgroud)

competitors 有以下列:

[comp_id] [comp_name]
Run Code Online (Sandbox Code Playgroud)

我想添加一个默认约束以[event_name]在插入新事件时节省我的时间。类似于:

ALTER TABLE [events]
ADD CONSTRAINT DF_event_name
DEFAULT CAST([winner_id] AS varchar(10)) + ' vs ' + CAST([loser_id] AS varchar(10)) FOR [event_name]
Run Code Online (Sandbox Code Playgroud)

当然,这是一个简化版本,它还需要使用competitors ON comp_id = winner_id and comp_id = loser_id.

当我尝试设置上述默认约束时,我得到了您可能期望的响应:

在此上下文中不允许使用名称“winner_id”。有效的表达式是常量、常量表达式和(在某些上下文中)变量。不允许使用列名。

那么有什么办法可以解决我想要做的事情吗?
有没有办法自动将单元格的值设置为实现从同一行插入的数据的字符串?如果可能的话,是否也可以使用 join 语句来完成?我的下一个想法是触发器。

Paw*_*ajs 2

是的,有几种方法可以做到这一点。

计算列

在简化版本中,如果您只需要事件表中的 id,则可以使用computed column.

像这样的东西:

CREATE TABLE events (
    event_id INT,
    winer_id INT,
    loser_id INT,
    event_name AS CAST(winer_id AS VARCHAR(16)) + ' vs ' + CAST(loser_id AS VARCHAR(16))
)
Run Code Online (Sandbox Code Playgroud)

触发器

但是,如果您必须从其他表插入名称,则可以使用INSTEAD OF INSERTINSTEAD OF UPDATE 触发器

下面的例子:

CREATE TRIGGER events1_insteadOfInsert ON events2
INSTEAD OF INSERT
AS
    INSERT INTO events
    SELECT event_id,winer_id,loser_id,c_win.comp_name+ ' vs ' + c_loss.comp_name
    FROM inserted i
    JOIN competitors c_win ON i.winer_id=c_win.comp_id
    JOIN competitors c_loss ON i.winer_id=c_loss.comp_id
Run Code Online (Sandbox Code Playgroud)

看法

最后一个选项可以创建一个视图来根据需要显示结果。在这种情况下,您不需要event_name表定义中的列。

视图示例:

CREATE VIEW vw_events
AS
    SELECT event_id,winer_id,loser_id,c_win.comp_name+ ' vs ' + c_loss.comp_name AS event_name
    FROM events e
    JOIN competitors c_win ON e.winer_id=c_win.comp_id
    JOIN competitors c_loss ON e.winer_id=c_loss.comp_id
Run Code Online (Sandbox Code Playgroud)

在这种情况下,视图看起来是最好的选择。