SQl:从文本文件更新表

时间:2013-06-07 08:46:08

标签: sql sql-server tsql

以下是我必须做的事情:

我有一个包含3列的文本文件:PID, X, Y

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

  • Table 1包含4列:UID, PID, X, Y
  • Table 2包含多个列,必需的列为UID, X, Y

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

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

但我无法弄清楚确切的事情。

3 个答案:

答案 0 :(得分:9)

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  

您可以使用上述方法来解决您的问题。希望这可以帮助。 :)

答案 1 :(得分:2)

你打算怎么跑?从存储过程?

为了节省一些性能,我会对临时表进行BULK INSERT,然后从临时表插入到表1和表中。 2。

看起来应该是这样的

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

有些人会说临时表不好,但它确实依赖 - 如果你的文件很大,从磁盘读取它需要时间,你不想做两次。

答案 2 :(得分:1)

您不需要任何循环来更新表2;您只需要表1中的insert

或者,如果您尝试更新表2中的现有行,请使用加入表1的update查询。See this question for an example

但是,您应该考虑更改数据库设计,因为它似乎不正确:您将XY存储在两个位置;它们只应存储在一个表中,如果需要将它们与其他数据结合使用,则应加入此表。如果你这样做,你就不必担心让两个表保持同步的混乱问题。