我有四个表:消息,MessageCategory,MessageStatus和MessageLevel

MessageCategory,MessageStatus和MessageLevel都只是具有三个字段:标识(主键),码和说明。消息指这三个领域,并有一些其他的数据字段,包括标识(主键)和MessageText中订购。标识字段是自动递增字段。

我现在需要写一个SQL脚本一些默认的数据添加到所有四个表。问题是,我需要建立一个将被发送给客户谁就会执行这个脚本的脚本。我不能写一点更智能的代码做整体更新。虽然三个表只是简单的插入语句,它是引起了我一些额外的头痛消息表。

我无法除去任何指数和我不能假设它在1对主键开始计数。

所以,作为一个例子,她的是一些数据:

INSERT INTO MessageCategory (Code) Values ('Cat01');
INSERT INTO MessageStatus (Code) Values ('Status01');
INSERT INTO MessageLevel (Code) Values ('Level01');

和消息将需要的东西是这样的:

INSERT INTO Messages(Category, Status, Level, MessageText, Order) 
VALUES(
  (SELECT Identity from MessageCategory where Code='Cat01'), 
  (SELECT Identity from MessageStatus where Code='Status01'), 
  (SELECT Identity from MessageLevel where Code='Level01'), 
  'Just some message', 
  1
);

这是行不通的,虽然。那么,有什么问题,就可以得到这个工作? (保持代码可读太...)

不幸的是,我没有访问其它数据库。我可以测试它,但一旦它似乎工作,它只是一个物质的发送和祈祷它,工作...

有帮助吗?

解决方案

INSERT INTO Messages 
  (Category, Status, Level, MessageText, [Order]) 
SELECT
  (SELECT TOP 1 [Identity] from MessageCategory where Code='Cat01')  AS Category,
  (SELECT TOP 1 [Identity] from MessageStatus where Code='Status01') AS Status,
  (SELECT TOP 1 [Identity] from MessageLevel where Code='Level01')   AS Level,
  (SELECT 'Just some message')   AS MessageText, 
  (SELECT 1)                     AS [Order]

上面将工作用于SQL Server。请注意这两个IdentityOrder保留T-SQL关键字,不应该被用于列名。还要注意,子查询必须不是该返回多行工作,以确保我已经包括TOP 1语句。

接下来的一点要注意的是,列别名(AS Category等)是不是严格必需的。它们的顺序是最重要的。我就包括他们的可读性,尤其是当SELECT列表变得更长。

其他提示

如果这是一个脚本,存储您的身份变量:

declare MessageCategoryID int;
declare MessageStatusID int;
declare MessageLevel int;
INSERT INTO MessageCategory (Code) Values ('Cat01');
set @MessageCategoryID=scope_identity();
INSERT INTO MessageStatus (Code) Values ('Status01');
set @MessageStatudID=scope_identity();
INSERT INTO MessageLevel (Code) Values ('Level01');
set @MessageLevelID=scope_identity();

INSERT INTO Messages(Category, Status, Level, MessageText, Order) 
    VALUES(
        @MessageCAtegoryID,
        @MessageStatusID,
        @MessageLevelID,
        'Just some message',
        1);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top