SQL - 从另一个表

时间:2015-11-18 19:49:26

标签: sql-server

抱歉新手问题。我是SQL的新手,并且正在努力解决一些应该非常简单的事情。只需尝试将一个表(本例中为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列中引用的公司名称填充新创建的商店的名称。假设最终用户最终会在必要时将商店名称设置为更具体的名称。

2 个答案:

答案 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

根据MSDNdefault关键字的语法有限:

  

指定值不为列时提供的值   在插入期间明确提供。 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