2012-01-04 68 views
3

我有一个现有的表,由于某种原因,设计者决定通过将最后一次使用的值存储在单独的表中来手动控制主键值(更改要使用的表的身份不是选项现在)。SQL:在插入过程中自动增量值

我现在需要做一个大规模更新这个表如下:

DECLARE @NeedFieldID int 
SET @NeedFieldID = 62034 

    INSERT INTO T_L_NeedField (NeedID, NeedFieldID, FieldName, Sequence, DisplayAs, FieldPrompt, DataType, ValidOptions, IsRequiredForSale) 
    (
     SELECT 
      DISTINCT n.NeedID, 
       @NeedFieldID + 1,   
      'DetailedOutcome', 
      999, 
      'Detailed Outcome', 
      'Select appropriate reason for a No Sale outcome', 
      'T', 
      'Pricing, Appointment Date/Time Not Available, Will Call Back, Declined', 
      0 
     FROM T_L_Need n 
      INNER JOIN T_L_NeedField nf 
       ON n.NeedID = nf.NeedID 
     WHERE (n.Need LIKE 'Schedule%' AND n.Disabled = 0) 
    ) 

显然“@NeedFieldID + 1”不(只是用它来展示一下我想要做的)工作。我如何增加@NeedFieldID作为SQL插入每个不同的NeedId的值?我使用SQL Server 2008的

回答

5

你想row_number()

DECLARE @NeedFieldID int 
SET @NeedFieldID = 62034 

    INSERT INTO T_L_NeedField (NeedID, NeedFieldID, FieldName, Sequence, DisplayAs, FieldPrompt, DataType, ValidOptions, IsRequiredForSale) 
    (
     SELECT 
      DISTINCT n.NeedID, 
       @NeedFieldID + row_number() over (order by n.NeedID),   
      'DetailedOutcome', 
      999, 
      'Detailed Outcome', 
      'Select appropriate reason for a No Sale outcome', 
      'T', 
      'Pricing, Appointment Date/Time Not Available, Will Call Back, Declined', 
      0 
     FROM T_L_Need n 
      INNER JOIN T_L_NeedField nf 
       ON n.NeedID = nf.NeedID 
     WHERE (n.Need LIKE 'Schedule%' AND n.Disabled = 0) 
    ) 

然而,最好的办法就是让NeedFieldID标识列,只是让SQL服务器做的工作适合你。

+0

谢谢,这个伎俩! – BrianKE 2012-01-04 19:19:38