【问题标题】:Populating the primary ID column with a sequential number in an SQL Server table在 SQL Server 表中使用序号填充主 ID 列
【发布时间】:2012-09-24 11:46:05
【问题描述】:

我浏览了论坛,但找不到完全符合我的问题的任何内容。此查询应该为员工添加定期假期。如果我排除 PL_ID 变量并且只有一个没有主键的表,则代码会添加在 case 语句中定义的正确日期假期,这是在测试表上,但需要添加到具有超过 25,000 个条目的表中。

表格包括PL_ID、Log_Date、Out_Time、In_Time

我目前有这个代码:

DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
DECLARE @DateVar DateTime
DECLARE @PL_ID int

SET @StartDate = '1/10/2012'
SET @EndDate = '1/11/2012'
SET @DateVar = @StartDate
SET @PL_ID = 0

WHILE @DateVar <= @EndDate

BEGIN 
 INSERT INTO Logger_test2(PL_ID,Log_Date,In_Time,Out_Time)
 SELECT @PL_ID,@DateVar,
        CASE WHEN DATENAME(dw,@DateVar) = 'Thursday' THEN '9'
             WHEN DATENAME(dw,@DateVar) = 'Monday' THEN '12'
         END AS In_Time,
        CASE WHEN DATENAME(dw,@DateVar) = 'Thursday' THEN 'After 5'
             WHEN DATENAME(dw,@DateVar) = 'Monday' THEN 'After 5'
         END AS Out_Time      
  WHERE DATENAME(dw,@DateVar) IN ('Thursday','Monday')

 SET @DateVar = DATEADD(d,1,@DateVar)
 UPDATE Logger_test2 set @PL_ID = PL_ID = @PL_ID +1
 END

使用此代码,它只会在具有最大 PL_ID 的表中添加一行,但我需要它为每个条目创建一个新 ID,抱歉,它有点模糊。非常感谢您的帮助!

现在离获得它更近了!但是,如果我将日期更改为下个月,则会出现重复的键错误:消息 2627,级别 14,状态 1,第 15 行违反主键约束“PK_Logger_test2”。无法在对象“dbo.Logger_test2”中插入重复键。重复键值为 (4) - 是否有其他方法可以避免插入重复键?

已解决: 这是完整的代码:),很有魅力,让我的生活更轻松!只需更改用户ID,即可输入大家预定的明年假期:

DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
DECLARE @DateVar DateTime
DECLARE @PL_ID int
DECLARE @User_ID int
DECLARE @Reason nvarchar(50)
DECLARE @Details nvarchar (500)

SET @StartDate = '30/09/2012'
SET @EndDate = '24/12/2012'
SET @DateVar = @StartDate
SET @User_ID = 55
SET @Reason = 'Day off'
SET @Details = 'Day off' 

--SET @PL_ID = 0
SELECT @PL_ID = max(PL_ID) from People_Logger

WHILE @DateVar <= @EndDate

BEGIN
 select @PL_ID = @PL_ID +1
 SET IDENTITY_INSERT dbo.People_logger ON;
 INSERT INTO People_Logger(PL_ID,LOG_Date,User_ID,Reason,Details,In_Time,Out_Time)
 SELECT @PL_ID,@DateVar,@User_ID,@Reason,@Details,
        CASE WHEN DATENAME(dw,@DateVar) = 'Thursday' THEN 'After 5'
             WHEN DATENAME(dw,@DateVar) = 'Friday' THEN 'After 5'
         END AS In_Time,
        CASE WHEN DATENAME(dw,@DateVar) = 'Thursday' THEN '9'
             WHEN DATENAME(dw,@DateVar) = 'Friday' THEN '9'
         END AS Out_Time
  WHERE DATENAME(dw,@DateVar) IN ('Thursday','Friday')
SET IDENTITY_INSERT dbo.People_Logger OFF; 
 SET @DateVar = DATEADD(d,1,@DateVar)
END

【问题讨论】:

  • 我该怎么做?你能把它包括在我给出的例子中吗? :)
  • 打开Logger_test2表的属性,设置PL_ID列的IDENTITY。然后它会在每次插入时自动增加 ID。
  • 我正在处理的数据库被锁定,一旦创建表我就没有权限编辑它们,我只能创建和删除它们:/
  • 您使用的是哪个版本的 Sql Server?
  • 2008 R2,我很困惑为什么我不能改变任何东西,因为我有足够的权利......奇怪:S

标签: sql sql-server case dateadd


【解决方案1】:

好的,我认为您只需要在插入之前增加变量的值。像这样

WHILE @DateVar <= @EndDate
BEGIN

  select @PL_ID = @PL_ID + 1

  INSERT INTO Logger_test2(PL_ID,Log_Date,In_Time,Out_Time)
  SELECT @PL_ID,@DateVar,
  etc etc

  Set @DateVar= DATEADD(d,1,@DateVar)
  -- NO Update statement
END

【讨论】:

  • 现在离获得它更近了!但是,如果我将日期更改为下个月,则会出现重复的键错误:消息 2627,级别 14,状态 1,第 15 行违反主键约束“PK_Logger_test2”。无法在对象“dbo.Logger_test2”中插入重复键。重复键值为 (4) - 是否有其他方法可以避免插入重复键?
  • 好的。在你的过程开始时,而不是做 SET @PL_ID = 0
  • 好的。在你的过程的开始,而不是做` SET @PL_ID = 0`做SELECT @PL_ID = max(PL_ID) from Logger_test2
  • 谢谢文尼!有效 :D 这会让我的工作轻松很多!
【解决方案2】:
DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
DECLARE @DateVar DateTime
DECLARE @PL_ID int

SET @StartDate = '1/10/2012'
SET @EndDate = '1/11/2012'
SET @DateVar = @StartDate
SET @PL_ID = 0

WHILE @DateVar <= @EndDate

BEGIN 
 INSERT INTO Logger_test2(PL_ID,Log_Date,In_Time,Out_Time)
 SELECT @PL_ID,@DateVar,
        CASE WHEN DATENAME(dw,@DateVar) = 'Thursday' THEN '9'
             WHEN DATENAME(dw,@DateVar) = 'Monday' THEN '12'
         END AS In_Time,
        CASE WHEN DATENAME(dw,@DateVar) = 'Thursday' THEN 'After 5'
             WHEN DATENAME(dw,@DateVar) = 'Monday' THEN 'After 5'
         END AS Out_Time      
  WHERE DATENAME(dw,@DateVar) IN ('Thursday','Monday')

 SET @DateVar = DATEADD(d,1,@DateVar)
 SET @PL_ID = @PL_ID +1
 END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多