使用T-SQL将新记录附加到数据库表

时间:2014-03-13 16:10:46

标签: tsql sql-server-2005

我正在使用SQL Server 2005

我使用此查询填充表格:

USE [MyDB]
INSERT INTO dbo.Summaries
   SELECT DISTINCT TOP (100) PERCENT 
      s.Kiosk_ID, k.kioskName, u.Owner_id, o.DisplayName, u.value,  
      COUNT(u.value) AS ValueCount, k.KioskGroup_ID, 
      CONVERT(varchar, u.DateTime, 112) as date, 
      'Marketing' AS DBName
   FROM         
      dbo.k_UsageLog AS u 
   INNER JOIN
      dbo.K_Owner AS o ON o.Owner_id = u.Owner_id 
   INNER JOIN
      dbo.k_Session AS s ON u.Session_id = s.Session_id 
   INNER JOIN
      dbo.Kiosk AS k ON k.Kiosk_ID = s.Kiosk_ID
   WHERE        
     (o.Owner_id > 12) 
   GROUP BY 
      s.Kiosk_ID, u.Owner_id, u.value, k.KioskGroup_ID, o.DisplayName,    
      CONVERT(varchar, u.DateTime, 112), k.kioskName
   ORDER BY 
      s.Kiosk_ID

我需要每晚运行一次,只添加新行。

我想过简单地使用一个时间戳并只添加昨天的数据,但是一些向数据库报告的单位可能一次离线几天,并且在最终连接时会发送几天的数据。

我知道我需要像MERGE这样的东西(感谢marc_s我现在知道它不包含在MS SQL Server 2005中),但我无法弄清楚如何让它工作。非常感谢帮助。

2 个答案:

答案 0 :(得分:1)

如果问题是检测行是否是新行,您可以尝试向表中添加哈希列(或者表格,取决于您是如何进行插入的。)

我们将CHECKSUM(*),BINARY_CHECKSUM(*)和CHECKSUM_AGG作为哈希函数。也许你可以添加一个持久的计算列。

另外一种更好的方法就是创建一个覆盖所有列的唯一约束。这种方式可以更具性能,但你不需要处理由约束违规产生的异常

答案 1 :(得分:1)

也许您可以使用SELECT EXCEPT

http://technet.microsoft.com/en-us/library/ms188055.aspx

进入临时表,然后将结果插入目标表。