2016-05-03 141 views
0

我试过在本网站上发现的不同解决方案,当它更新或插入使用SQL代码,我得到更新工作,但不能实现工作插入如果行不存在,在(更新)代码正在这个样子的,如何让它也插入会很高兴,因为我是一个* SQL新手任何帮助,那么这里是工作代码:SQL UPDATE或INSERT

select top 0 * into #tmp_x from TTT; 
select * from #tmp_x; 
BULK INSERT #tmp_x FROM 'path\to\file1.csv' WITH (FIELDTERMINATOR =';',ROWTERMINATOR ='\n' ,FIRSTROW = 2); 
UPDATE TTT 
SET TTT.[Artikelbenämning] = #tmp_x.[Artikelbenämning],TTT.[Count of Ordernummer] = #tmp_x.[Count of Ordernummer],TTT.[Sum of Antal beställda] = #tmp_x.[Sum of Antal beställda],TTT.[Min of Skapat Datum] = #tmp_x.[Min of Skapat Datum],TTT.[Max of Planerat Plockdatum] = #tmp_x.[Max of Planerat Plockdatum],TTT.[Kommentar Inköpsplanerare] = #tmp_x.[Kommentar Inköpsplanerare] 
FROM #tmp_x 
WHERE TTT.Artikelnummer = #tmp_x.Artikelnummer; 
drop table #tmp_x; 
print 'dropped table'; 
+0

将WHERE语句改为INNER JOIN,看看它是否适用于您 –

回答

3

如果您有SQL Server 2008或更高版本,则可以使用MERGE语句。下面的Microsoft TechNet文章介绍了MERGE语句相当不错: https://technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx

您的查询应该是这个样子:

BULK INSERT #tmp_x FROM 'path\to\file1.csv' WITH (FIELDTERMINATOR =';',ROWTERMINATOR ='\n' ,FIRSTROW = 2); 

    MERGE TTT AS T 
    USING #tmp_x AS S 
    ON (T.Artikelnummer = S.Artikelnummer) 
    WHEN NOT MATCHED BY TARGET 
     THEN INSERT(
        [Artikelnummer] 
        ,[Artikelbenämning] 
        ,[Count of Ordernummer] 
        ,[Sum of Antal beställda] 
        ,[Min of Skapat Datum] 
        ,[Max of Planerat Plockdatum] 
        ,[Kommentar Inköpsplanerare] 
        ) 
      VALUES( 
        S.[Artikelnummer] 
        ,S.[Artikelbenämning] 
        ,S.[Count of Ordernummer] 
        ,S.[Sum of Antal beställda] 
        ,S.[Min of Skapat Datum] 
        ,S.[Max of Planerat Plockdatum] 
        ,S.[Kommentar Inköpsplanerare] 
       ) 
    WHEN MATCHED 
     THEN UPDATE 
      SET  T.[Artikelbenämning] = S.[Artikelbenämning] 
        ,T.[Count of Ordernummer] = S.[Count of Ordernummer] 
        ,T.[Sum of Antal beställda] = S.[Sum of Antal beställda] 
        ,T.[Min of Skapat Datum] = S.[Min of Skapat Datum] 
        ,T.[Max of Planerat Plockdatum] = S.[Max of Planerat Plockdatum] 
        ,T.[Kommentar Inköpsplanerare] = S.[Kommentar Inköpsplanerare]; 

       ,T.[Kommentar Inköpsplanerare] = ISNULL(S.[Kommentar Inköpsplanerare], T.[Kommentar Inköpsplanerare]); 

-- Example exludes records where [Kommentar Inköpsplanerare] IS NULL from the merge 
MERGE TTT AS T 
USING (
     SELECT 
       [Artikelnummer] 
       ,[Artikelbenämning] 
       ,[Count of Ordernummer] 
       ,[Sum of Antal beställda] 
       ,[Min of Skapat Datum] 
       ,[Max of Planerat Plockdatum] 
       ,[Kommentar Inköpsplanerare] 
     FROM  #tmp_x 
     WHERE [Kommentar Inköpsplanerare] IS NOT NULL 
    )AS S 
ON (T.Artikelnummer = S.Artikelnummer) 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT(
       [Artikelnummer] 
       ,[Artikelbenämning] 
       ,[Count of Ordernummer] 
       ,[Sum of Antal beställda] 
       ,[Min of Skapat Datum] 
       ,[Max of Planerat Plockdatum] 
       ,[Kommentar Inköpsplanerare] 
       ) 
     VALUES( 
       S.[Artikelnummer] 
       ,S.[Artikelbenämning] 
       ,S.[Count of Ordernummer] 
       ,S.[Sum of Antal beställda] 
       ,S.[Min of Skapat Datum] 
       ,S.[Max of Planerat Plockdatum] 
       ,S.[Kommentar Inköpsplanerare] 
      ) 
WHEN MATCHED 
    THEN UPDATE 
     SET  T.[Artikelbenämning] = S.[Artikelbenämning] 
       ,T.[Count of Ordernummer] = S.[Count of Ordernummer] 
       ,T.[Sum of Antal beställda] = S.[Sum of Antal beställda] 
       ,T.[Min of Skapat Datum] = S.[Min of Skapat Datum] 
       ,T.[Max of Planerat Plockdatum] = S.[Max of Planerat Plockdatum] 
       ,T.[Kommentar Inköpsplanerare] = S.[Kommentar Inköpsplanerare]; 


-- Example ignores updates on the [Kommentar Inköpsplanerare] column if the [Kommentar Inköpsplanerare] IS NULL in the source dataset 
MERGE TTT AS T 
USING #tmp_x AS S 
ON (T.Artikelnummer = S.Artikelnummer) 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT(
       [Artikelnummer] 
       ,[Artikelbenämning] 
       ,[Count of Ordernummer] 
       ,[Sum of Antal beställda] 
       ,[Min of Skapat Datum] 
       ,[Max of Planerat Plockdatum] 
       ,[Kommentar Inköpsplanerare] 
       ) 
     VALUES( 
       S.[Artikelnummer] 
       ,S.[Artikelbenämning] 
       ,S.[Count of Ordernummer] 
       ,S.[Sum of Antal beställda] 
       ,S.[Min of Skapat Datum] 
       ,S.[Max of Planerat Plockdatum] 
       ,S.[Kommentar Inköpsplanerare] 
      ) 
WHEN MATCHED 
    THEN UPDATE 
     SET  T.[Artikelbenämning] = S.[Artikelbenämning] 
       ,T.[Count of Ordernummer] = S.[Count of Ordernummer] 
       ,T.[Sum of Antal beställda] = S.[Sum of Antal beställda] 
       ,T.[Min of Skapat Datum] = S.[Min of Skapat Datum] 
       ,T.[Max of Planerat Plockdatum] = S.[Max of Planerat Plockdatum] 
       ,T.[Kommentar Inköpsplanerare] = ISNULL(S.[Kommentar Inköpsplanerare], T.[Kommentar Inköpsplanerare]); 
+0

Worked Perfectly! Thanx十亿:) – Nia

+0

但我该如何检查S. [KommentarInköpsplanerare] = null并防止覆盖数据库中的现有值?或者不可能? – Nia

+0

这取决于你想要用NULL值做什么。例如,如果您只想从源集中排除具有NULL值的记录,则可以使用查询在using子句中更新源表。我已经更新了示例以说明如何完成此操作。 Alternativley如果您只是想要忽略特定字段(如果相应的源字段为空),则可以使用“ISNULL()”函数在源为空时简单地返回原始值。 –

1

在SQL Server ,您可以在同一语句中插入和更新,称为MERGE

MERGE TTT AS target 
USING #tmp_x AS source 
ON (target.Artikelnummer = source.Artikelnummer) 
WHEN MATCHED THEN 
    UPDATE SET [Artikelbenämning] = source.[Artikelbenämning], 
       [Count of Ordernummer] = source.[Count of Ordernummer], 
       [Sum of Antal beställda] = source.[Sum of Antal beställda].... 
WHEN NOT MATCHED THEN 
INSERT (<target's columns list>) -- I got a little lazy here... 
VALUES (<source's columns list>) 
0

的替代@Edmond昆顿会后删除匹配的行,并插入:

DELETE TTT 
FROM TTT 
INNER JOIN #tmp_x 
ON TTT.Artikelnummer = #tmp_x.Artikelnummer 

INSERT INTO TTT 
SELECT * FROM #tmp_x 
+0

这是一个坏主意。如果TTT使用外键约束连接到表,它可能会引发错误或从这些表中删除记录(如果删除级联设置为true)。 – ATC

+0

这是正确的,这一切都归结为什么数据用于和依赖。这看起来像是一个分析表格(有些订单和东西永远不会投入生产),删除,插入是最快的选择。合并是2008+,特别是在有限制时较慢。为了专业目的,您将创建一个ETL过程。 –