【问题标题】:How to make this code more professional look?如何让这段代码看起来更专业?
【发布时间】:2016-06-25 10:21:30
【问题描述】:
DECLARE @Coid INT
DECLARE @DTRID INT
DECLARE @EMPID INT
DECLARE @DATE datetime

SELECT TOP 1 @EMPID = tblEmployees.Id, @Coid = tblEmployees.CompanyId, @DATE = tblDailyTimeRecord.TimeIn, @DTRID = tblDailyTimeRecord.Id   FROM tblEmployees INNER JOIN tblDailyTimeRecord ON tblEmployees.Id = tblDailyTimeRecord.EmployeeId WHERE tblDailyTimeRecord.Date = CONVERT(date, GETDATE()) AND tblDailyTimeRecord.TimeOut IS NULL ORDER BY tblDailyTimeRecord.ID DESC
IF @Coid IS NULL
BEGIN
DECLARE @IdentityValue TABLE ( ContactID int,EmpId int,DATE datetime)
INSERT INTO [tblDailyTimeRecord]([EmployeeId],[Date],[TimeOut],[IsModified],[CompanyId])
OUTPUT INSERTED.Id,INSERTED.EmployeeId,INSERTED.TimeOut INTO @IdentityValue
Select Id,CONVERT(date, GETDATE()),GETDATE(),0,CompanyId From tblEmployees Where AccessCode = 'GI0056'
INSERT INTO tblTimeLog([EmployeeId],[Time],[Type],[TimeLogSourceId],[CreationDate])
Select EmpId,DATE,2,11,GETDATE() From @IdentityValue
END
ELSE
BEGIN
    DECLARE @PAIR int
    DECLARE @TIMEOUT datetime
    SET @TIMEOUT = GETDATE()
    IF @DATE IS NULL
        SET @PAIR = 0
    ELSE
        SET @PAIR = 1

    UPDATE [tblDailyTimeRecord] SET TimeOut = @TIMEOUT, PairNo = @PAIR WHERE ID = @DTRID
    INSERT INTO tblTimeLog([EmployeeId],[Time],[Type],[TimeLogSourceId],[CreationDate])
    VALUES (@EMPID,@TIMEOUT,2,11,@TIMEOUT)
END

【问题讨论】:

  • @Arulkumar 我投票结束这个问题,因为它不清楚,因为它没有解释代码的作用,并且将在代码审查中被关闭和否决。
  • 更多的空格会更容易阅读。

标签: sql sql-server


【解决方案1】:

只是一般的格式规则:
1. 最好的声明都在开头。
2.保持一致:所有保留字大写
3. 列名不要使用保留字。
4. 注释您的代码。
5. 使用统一的意图。
6. 用分号结束语句。
7. 如果可以,请使用CASE 而不是IF SET
8. 为表和视图使用短别名。
9.在SELECT语句中命名变量,然后就清楚了。
我忘记了什么吗?

逻辑/设计
1.您可以使用临时表变量或只是临时表,而不是多个变量。这将使代码更短、更易读。
2. 首先SELECT 返回一行,但在INSERT 语句中您可能会插入一些完全不相关的内容。
3. 两个表中的数据相同可能是设计不佳的标志。
4. 同一行的同一事件的日期和日期时间非常可疑。

可能是下面的代码。希望对您有所帮助。

DECLARE @Coid INT;
DECLARE @DTRID INT;
DECLARE @EMPID INT;
DECLARE @DATE DATETIME;
DECLARE @PAIR INT;
DECLARE @TIMEOUT DATETIME;

DECLARE @IdentityValue TABLE ( 
    ContactID int,
    EmpId int, 
    ContactDate DATETIME
);

-- Select ONLY one row
SELECT TOP 1 
    @EMPID = e.Id, 
    @Coid = e.CompanyId, 
    @DATE = tr.TimeIn, 
    @DTRID = tr.Id,
    @TIMEOUT = GETDATE(),
    @PAIR = CASE WHEN tr.TimeIn IS NULL THEN 0 ELSE 1 END
FROM tblEmployees as e
INNER JOIN tblDailyTimeRecord as tr
    ON e.Id = tr.EmployeeId 
WHERE tr.Date = CONVERT(DATE, GETDATE()) 
    AND tr.TimeOut IS NULL 
ORDER BY tr.ID DESC;

IF @Coid IS NULL
BEGIN
    -- Insert more than one row or might insert nothing
    INSERT INTO [tblDailyTimeRecord] (
        [EmployeeId],
        [Date],
        [TimeOut],
        [IsModified],
        [CompanyId]
    )
    OUTPUT INSERTED.Id, 
            INSERTED.EmployeeId, 
            INSERTED.TimeOut 
        INTO @IdentityValue
    SELECT Id as [EmployeeId], 
        CONVERT(DATE, GETDATE()) as [Date],
        @TIMEOUT as [TimeOut],
        0 as [IsModified],
        CompanyId 
    FROM tblEmployees 
    WHERE AccessCode = 'GI0056';

    INSERT INTO tblTimeLog(
        [EmployeeId],
        [Time],
        [Type],
        [TimeLogSourceId],
        [CreationDate])
    SELECT EmpId as [EmployeeId],
        ContactDate as [Time],
        2 as [Type],
        11 as [TimeLogSourceId],
        @TIMEOUT as [CreationDate]
    FROM @IdentityValue;
END
ELSE
BEGIN
    UPDATE [tblDailyTimeRecord] 
    SET TimeOut = @TIMEOUT, 
        PairNo = @PAIR 
    WHERE ID = @DTRID

    INSERT INTO tblTimeLog(
        [EmployeeId],
        [Time],
        [Type],
        [TimeLogSourceId],
        [CreationDate]
    ) VALUES (
        @EMPID, 
        @TIMEOUT,
        2,
        11,
        @TIMEOUT
    );
END

【讨论】:

  • 感谢 Slava 的解释。
猜你喜欢
  • 2011-05-03
  • 1970-01-01
  • 2012-12-23
  • 2011-01-18
  • 2010-11-03
  • 2015-08-31
  • 2014-08-24
  • 2013-06-13
  • 1970-01-01
相关资源
最近更新 更多