Stores(Name)
)中的列的默认值设置为相关表(本例中为Company(Name)
)中列的值。
这两个表的定义:
CREATE TABLE Companies (
Id INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
Name VARCHAR(50) NOT NULL)
CREATE TABLE Stores (
Id INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
CompanyId INT NOT NULL FOREIGN KEY REFERENCE Companies(Id),
Name VARCHAR(50) NOT NULL DEFAULT [[unsure what to put here]] )
我想使用CompanyId
列中引用的公司名称填充新创建的商店的名称。假设最终用户最终会在必要时将商店名称设置为更具体的名称。
答案 0 :(得分:1)
我强烈建议让CRUD(CReate / Update / Delete)逻辑创建与Companies行同名的初始Stores行。如何执行此操作取决于您的实现,但这是一个示例:
declare @Name varchar(50), @CompanyId int
set @Name = 'XYZ Industries, Inc.'
insert into Companies (Name) select @Name
select @CompanyId = scope_identity()
if @CompanyId is null -- no rows inserted
return
insert into Stores (CompanyId, Name)
select @CompanyId, @Name
根据MSDN,default
关键字的语法有限:
指定值不为列时提供的值 在插入期间明确提供。 DEFAULT定义可以 应用于除定义为时间戳的列之外的任何列或那些列 使用IDENTITY属性。如果为a指定了默认值 用户定义的类型列,该类型应支持隐式 从constant_expression转换为用户定义的类型。默认 删除表时删除定义。 只有一个常数 值,例如字符串;标量函数(系统, 用户定义的,或CLR功能);或NULL可用作默认值。 To 保持与早期版本的SQL Server的兼容性,a 约束名称可以分配给DEFAULT。
您可以将标量函数指定为默认值,但不能将任何列值作为变量传递给它,否则会出现如下错误:
名称"字段"在这种情况下是不允许的。有效表达式是常量,常量表达式和(在某些上下文中)变量。不允许使用列名。
答案 1 :(得分:0)
我还没有这样做,但考虑INSTEAD OF INSERT触发器: https://technet.microsoft.com/en-us/library/ms175089%28v=sql.105%29.aspx