如何在sql server上传的每个批处理文件中检索上传/当前时间

时间:2014-06-18 07:20:52

标签: sql sql-server batch-file

我想在cake.php中进行批量csv文件上传过程并在sql server中保存数据。我成功上传了csv文件并获取了当前时间。每批文件包含7行数据。当每批文件保存到名为" RAS_Off_Upload"的表中时,我遇到问题,Up_Time列(来自当前上载过程的getdate)将更新/替换Up_Time的所有先前批次行当前时间。所以,我无法识别每个批次是在什么时间上传的,因为每个批次已经同时出现。

数据库专栏:

   [No]
  ,[RAS_Code]
  ,[Value]
  ,[Remark]
  ,[SOF]
  ,[Created_by]
  ,[CLN_No]
  ,[Lot_No]
  ,[Prod]
  ,[Date]
  ,[Time]
  ,[id]
  ,[Line]
  ,[Up_Time]
  ,[BatchLoadID]

我已经创建了SP

CREATE PROCEDURE [dbo].[test]

@Up_Time varchar(50)
AS
SET NOCOUNT ON;


UPDATE dbo.RAS_Off_Upload
SET dbo.RAS_Off_Upload.Up_Time = GETDATE()
提前谢谢!感谢所有的评论。

2 个答案:

答案 0 :(得分:1)

您可以跳过运行存储过程,只需更改表定义并默认在Up_Time中存储创建记录的当前系统日期(导入.csv批处理)。

您可以使用以下代码执行此操作。如果在INSERT查询中没有为此列指定值,则会更改表的定义以使用系统日期填充Up_Time列。

ALTER TABLE dbo.RAS_Off_Upload
ADD CONSTRAINT col_UpTime
DEFAULT GETDATE() FOR Up_Time

因此,在向表中插入数据时,您所要做的就是插入除Up_Time之外的所有其他列,默认情况下会自动填充创建记录时的系统日期。

<强>更新

要删除表中已存在的约束,请使用code below

DECLARE @table_name NVARCHAR(256)
DECLARE @col_name NVARCHAR(256)
DECLARE @Command NVARCHAR(1000)

SET @table_name = 'dbo.RAS_Off_Upload'
SET @col_name = 'Up_Time'

SELECT @Command = 'ALTER TABLE ' + @table_name + ' drop constraint ' + d.NAME
FROM sys.tables t
JOIN sys.default_constraints d ON d.parent_object_id = t.object_id
JOIN sys.columns c ON c.object_id = t.object_id
    AND c.column_id = d.parent_column_id
WHERE t.NAME = @table_name
    AND c.NAME = @col_name

--print @Command
EXECUTE (@Command)

执行此代码段后,只需在我更新答案之前运行第一个查询。

答案 1 :(得分:0)

首先,您在sproc中缺少WHERE子句。因此,它始终更新dbo.RAS_Off_Upload中的所有记录 如果您真的想继续使用sproc,则需要添加WHERE RAS_Off_Upload.No = <the No of the record to be updated>

之类的内容

但更好的是改变你的桌子的设计 如果您将默认值getdate()sysdatetimeoffset()添加到列Up_Time,则会在插入记录后自动添加当前日期时间。那你根本就不需要一个sproc。