SQL:从文本文件更新表格

9

以下是需要完成的任务:

我有一个文本文件,它有三列:PID, X, Y.

现在我的数据库中有两个表:

  • Table 1 包含4列:UID, PID, X, Y
  • Table 2 包含多列,必要的列是UID, X, Y

我需要用相应的X和Y值更新Table 2

我认为我们可以使用BULK INSERT来更新table 1,然后使用一些WHILE循环或其他方法。

但我无法准确地理解它们之间的关系。


不太清楚 - 你想将文本文件“BULK INSERT”到“Table1”中,然后从那里更新“Table2”吗?还有:这些列的数据类型是什么?你能给我们展示一个样本文本文件吗? - marc_s
请提供您使用的 SQL Server 版本(您可以添加更具体的标签)。 - Paul
3个回答

10
CREATE PROCEDURE [dbo].[BulkInsert]            
(            
@PID int  ,          
@x int,          
@y int,          

)            
AS            
BEGIN            
SET NOCOUNT ON;            

declare @query varchar(max)            


CREATE TABLE #TEMP            
(            
[PID] [int] NOT NULL ,          
[x] int NOT NULL,          
[y] int NOT NULL,             

)            


SET @query = 'BULK INSERT #TEMP FROM ''' + PathOfYourTextFile + ''' WITH ( FIELDTERMINATOR = '','',ROWTERMINATOR = ''\n'')'            
--print @query            
--return            
execute(@query)            


BEGIN TRAN;            

MERGE TableName AS Target            
USING (SELECT * FROM #TEMP) AS Source            
ON (Target.YourTableId = Source.YourTextFileFieldId)
-- In the above line we are checking if the particular row exists in the table(Table1)  then update the Table1 if not then insert the new row in Table-1.           

WHEN MATCHED THEN            
UPDATE SET             
Target.PID= Source.PID, Target.x= Source.x, Target.y= Source.y           
WHEN NOT MATCHED BY TARGET THEN            

-- Insert statement  
您可以使用上述方法解决您的问题。希望这有所帮助。 :)

2

你将如何运行它?从存储过程中运行吗?

为了提高性能,我会使用BULK INSERT到临时表中,然后从临时表插入到Table 1和2。

应该是这个样子的。

INSERT INTO Table1 ( PID, X, Y)
SELECT  PID, X, Y
FROM    #tempTable

有人会说临时表不好,但这取决于实际情况——如果文件很大,从磁盘读取需要时间,而且您不想重复执行此操作。


是的,从存储过程中创建...我想知道,你如何实现步骤2,从临时表插入到表2? - Spandan
最好先加载表1,然后使用表1作为源加载表2。表1具有uidpid之间的链接,这对于无论如何加载表2都是必要的。 - user1919238

1
你不需要任何循环来更新表2;你只需要从表1中插入insert即可。
或者,如果你想要更新表2中已有的行,请使用一个在表1上连接的update查询。查看这个问题以获取示例
然而,你应该考虑更改你的数据库设计,因为它似乎是不正确的:你正在两个地方存储XY;它们只应该被存储在一个表中,如果你需要与其他数据结合使用它们,你应该连接到这个表。如果你这样做了,你就不必担心保持两个表同步的混乱问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接