插入具有复杂性的现有表

时间:2015-09-16 03:18:51

标签: sql-server

我正在尝试将已正确设置的表中的一些信息复制到另一个正在配置的表中。有问题的表存储由Active Directory用户识别的用户设置(对于正在访问数据库的程序)。

我不能只是复制表格,因为每个表格中有不同的用户使用不同的设置。我只关心具体的标准。

表格设置如下: 序号(SeqNum) 用户 数据1 数据2 数据3 DATA4

SeqNum和User在表之间会有所不同,行必须是新的,而不是修改现有的。我想要做的是插入新行与下一个可用的SeqNum和一个SPECIFIED用户(我可以指定),然后将列Data1-Data4复制到各自的列中。要插入的行数会有所不同。有没有人有关于实现这一目标的最佳方法的建议?我不认为我可以做一个简单的插入,因为它不会解释SeqNum和User中的变量。

为了使这一点更加清晰,我附上了一张图片,显示了表1和表2中的一个例子,并添加了表2中的三个新行。

希望这种方式有道理。将需要完成数百行和数十个用户。

T.I.A。

enter image description here

http://i.stack.imgur.com/t0VtH.png

1 个答案:

答案 0 :(得分:0)

这可以通过简单的INSERT INTO解决,但是你指出的两个问题必须解决:

  • 插入时如何计算seqno
  • 插入时如何替换用户名

虽然identity column / autoincrement列可以解决对seqno的需求,但我认为架构更改不是您想要的。我将组合一个子查询,选择seqno的当前最大值和ROW_NUMBER来计算值,如下所示:

ROW_NUMBER() OVER (ORDER BY SeqNum) + (SELECT MAX(SeqNum) FROM Table2) AS SeqNum

至于用手动设置的内容替换用户名,这一切都取决于你想要如何执行它。如果手动查询满足您的需求,则可以像在查询中设置设置字符串一样简单:

'ManuallySetUserName' AS [User]

将此结合到查询中将产生:

INSERT INTO Table2 (SeqNum, [User], Data1, Data2, Data3, Data4)
SELECT ROW_NUMBER() OVER (ORDER BY SeqNum) + (SELECT MAX(SeqNum) FROM Table2) AS SeqNum,
  'ManuallySetUserName' AS [User],
  Data1, 
  Data2, 
  Data3, 
  Data4
FROM Table1
WHERE [SomeCondition...];

假设复制的条件为给定用户名的所有设置行,您可以将其包装在存储过程中,添加要复制的用户名的输入参数和要设置的用户名,如下所示:

CREATE PROCEDURE CopyUserSettings (@UserNameFrom varchar(200), @UserNameTo varchar(200))
AS
BEGIN
    INSERT INTO Table2 (SeqNum, [User], Data1, Data2, Data3, Data4)
    SELECT ROW_NUMBER() OVER (ORDER BY SeqNum) + (SELECT MAX(SeqNum) FROM Table2) AS SeqNum,
      @UserNameTo AS [User],
      Data1, 
      Data2, 
      Data3, 
      Data4
    FROM Table1
    WHERE [User] = @UserNameFrom
END

SQL Fiddle