Wim*_*ink 3 sql-server insert multi-table
我有四个表:Messages,MessageCategory,MessageStatus和MessageLevel.
MessageCategory,MessageStatus和MessageLevel都只有三个字段:Identity(主键),Code和Description.消息引用这三个字段并具有一些其他数据字段,包括Identity(主键)MessageText和Order.标识字段是自动递增的字段.
我现在需要编写一个SQL脚本来向所有四个表添加一些默认数据.问题是,我需要创建一个脚本,该脚本将发送给客户,然后客户将执行此脚本.我不能写一些更智能的代码来完成整个更新.虽然三个表只是简单的插入语句,但是Messages表会引起一些额外的麻烦.
我无法删除任何索引,我不能假设它从1开始计算主键.
所以,作为一个例子,她的一些数据:
INSERT INTO MessageCategory (Code) Values ('Cat01');
INSERT INTO MessageStatus (Code) Values ('Status01');
INSERT INTO MessageLevel (Code) Values ('Level01');
Run Code Online (Sandbox Code Playgroud)
消息需要这样的东西:
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
);
Run Code Online (Sandbox Code Playgroud)
但这不起作用.那么,让这个工作的诀窍是什么?(保持代码可读......)
不幸的是,我无法访问其他数据库.我可以测试它,但一旦它似乎工作,它只是发送和祈祷它的工作...
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]
Run Code Online (Sandbox Code Playgroud)
以上将适用于SQL Server.注意,这两个Identity和Order保留T-SQL关键字,不应该被用于列名.另请注意,子查询不能返回多行以使其正常工作,以确保我已包含TOP 1语句.
接下来要注意的是列别名(AS Category等)并不是绝对必要的.他们的订单非常重要.我会将它们包括在内以便于阅读,特别是当SELECT列表变长时.
| 归档时间: |
|
| 查看次数: |
11774 次 |
| 最近记录: |