将数据从临时表传输到物理表

时间:2015-08-04 06:25:06

标签: sql sql-server sql-server-2008

我将此表命名为 table1

id   uniquefield    field1        field2
1     11            test          test2
2     12            test2         test3

我在临时表 #temp1

中有这个值
id   uniquefield    field1        field2
1     11            test          test2
2     12            test2         test3
3     13            test4         test5
4     14            test5         test6

现在,我想要发生的是我想从#temp1表传输所有数据。如果table1表中不存在数据,它将插入,如果存在则会更新。

有人知道如何使用SQL Server或动态SQL吗?

希望能找到你的回复。

6 个答案:

答案 0 :(得分:3)

在你提到的情况下,临时表也没有什么不同。不同之处在于它们仅适用于用户的当前连接;当用户与实例断开连接时,它们会自动删除。因此,您可以像处理任何其他SQL表一样处理这些表,并使用MERGE查询来实现此数据操作。

假设可以将uniquefield列视为这些表之间的链接。

MERGE table1 t
USING #temp1 t1
ON t.uniquefield = t1.uniquefield
WHEN MATCHED THEN
  UPDATE
  SET t.id = t1.id,
t.field1 = t1.field1,
t.field2 = t1.field2
WHEN NOT MATCHED BY TARGET THEN
  INSERT (id, uniquefield, field1, field2)
  VALUES (t1.id, t1.uniquefield, t1.field1, t1.field2 );

您可以在此之后DROP #temp1执行SELECT * FROM table1检查更新/插入的数据。

答案 1 :(得分:2)

在你提到的情况下,

Temp tables没有什么不同。不同之处在于它们仅适用于用户的当前连接;当用户与实例断开连接时,它们会自动删除。因此,您可以像处理任何其他SQL表一样处理这些表。

假设可以将uniquefield列视为这些表之间的链接。

更新statemant:

update table1
set
t.id = t1.id,
t.field1 = t1.field1,
t.field2 = t1.field2
from table1 t
join #temp1 t1
on t.uniquefield = t1.uniquefield

插入声明:

insert into table1(id, uniquefield, field1, field2)
select t1.id, t1.uniquefield, t1.field1, t1.field2 
from table1 t
join #temp1 t1
on t.uniquefield != t1.uniquefield

答案 2 :(得分:2)

假设2个表格行与id相同,不插入exists()

-- Append missing row to table1
INSERT table1 
SELECT * FROM #temp1 t WHERE NOT EXISTS(SELECT * FROM table1 WHERE id = t.id)

答案 3 :(得分:1)

这假设id是表主键。否则适当更换。

UPDATE Table1
SET id= T.id,
    Uniquefield = T.Uniquefield,
    Field1 = T.field1,
    Field2 = T.field2
FROM Table1
INNER JOIN #temp1 T ON T.id = Table1.id;

INSERT INTO Table1 (id, uniquefield, field1, field2)
SELECT id, uniquefield, field1, field2
FROM #temp1
WHERE id NOT IN (SELECT id FROM Table1)

答案 4 :(得分:1)

我认为优雅的方法是在这里使用MERGE

SET IDENTITY_INSERT table1 ON;

MERGE INTO table1 AS T
USING #temp1 AS S 
     ON S.id = T.id
WHEN MATCHED THEN 
    UPDATE SET
        T.uniquefield = S.uniquefield,
        T.field1 = S.field1,
        T.field2 = S.field2
WHEN NOT MATCHED BY TARGET THEN
    INSERT (id, uniquefield, field1, field2)
    VALUES (S.id, S.uniquefield, S.field1, S.field2);

SET IDENTITY_INSERT table1 OFF;

我已经添加了IDENTITY_INSERT,以防你的table1中的ID列是IDENTITY,你可能想要保留#temp1表中的那个。如果您不需要/拥有IDENTITY,请删除这些行。

答案 5 :(得分:1)

您可以简单地使用此查询: -

using System;
using System.Xml;
using SampleWebserviceApp.net.myasp.deepakgaur;
namespace SampleWebserviceApp
{
 class Program
 {
    static void Main(string[] args)
    {
        InventoryWebservice Webservice = new InventoryWebservice();
        var value = Webservice.GetDataByID("1");
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(value);
        string id = doc.GetElementsByTagName("Id").ToString();
        Console.WriteLine(value);
        Console.WriteLine(id);
        Console.ReadKey();
       }
    }
}