2014-03-13 47 views
0

我使用SQL Server 2005的追加新的记录,使用T-SQL

我填充这个查询表中的数据表:

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

SQL Server 2005尚未具有MERGE语句 - 这是SQL Server ** 2008中的新功能** –

+1

您是否拥有唯一的主键?你如何识别什么是新行? – ScubaManDan

+0

谢谢marc_s。我很担心这一点。 – barna10

回答

1

如果问题是检测该行是否为新行,您可以尝试向表(或等值表)添加哈希列,取决于您如何执行该插入操作。

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

另外一个更好的方法是创建一个覆盖所有列的唯一约束。这样可以有更多performatic但你生病需要处理由违反约束