9

这是我必须做的:

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

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

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

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

我认为我们可以BULK INSERT用于更新table 1,然后是一些WHILE循环或其他东西。

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

4

3 回答 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  

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

于 2013-06-07T09:28:43.707 回答
2

你打算如何运行它?从存储过程?

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

它应该看起来像这样

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

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

于 2013-06-07T08:51:34.213 回答
1

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

或者,如果您尝试更新表 2 中的现有行,请使用update连接表 1 的查询。 有关示例,请参阅此问题

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

于 2013-06-07T08:54:13.130 回答