Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQl:从文本文件更新表_Sql_Sql Server_Tsql - Fatal编程技术网

SQl:从文本文件更新表

SQl:从文本文件更新表,sql,sql-server,tsql,Sql,Sql Server,Tsql,我要做的是: 我有一个文本文件,它有3列:PID,X,Y 现在,我的数据库中有两个表: 表1包含4列:UID、PID、X、Y 表2包含多个列,必填列为UID、X、Y 我需要用相应的X和Y值更新表2 我想我们可以使用批量插入来更新表1,然后在循环时使用一些 但我想不出确切的原因。你打算如何运行它?从存储过程 为了节省一些性能,我将对temp表执行批量插入,然后从temp表插入到表1和表2 应该是这样的 INSERT INTO Table1 ( PID, X, Y) SELECT PID, X

我要做的是:

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

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

  • 表1
    包含4列:
    UID、PID、X、Y
  • 表2
    包含多个列,必填列为
    UID、X、Y
我需要用相应的X和Y值更新表2

我想我们可以使用
批量插入
来更新
表1
,然后在
循环时使用一些


但我想不出确切的原因。

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

为了节省一些性能,我将对temp表执行
批量插入
,然后从temp表插入到表1和表2

应该是这样的

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

有些人会说临时表不好,但这确实取决于—如果文件很大,从磁盘读取它需要时间,而且您不想重复两次。

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

或者,如果您试图更新表2中的现有行,请使用连接表1的
update
查询

但是,您应该考虑更改数据库设计,因为它看起来不正确:您在两个地方存储了<代码> x<代码>和<代码> y>代码>;它们应该只存储在一个表中,如果需要将它们与其他数据结合使用,则应该连接到此表。如果这样做,就不必担心保持两个表同步的麻烦问题

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
?还是怎样另外:这些列的数据类型是什么?您能给我们看一个示例文本文件吗?请引用您的SQL Server版本(您可以添加进一步的特定标记)是的,形成一个存储过程…我想知道,您如何实现步骤2,从临时表插入表2?最好先加载表1,然后使用表1作为源加载表2。表1具有
uid
pid
之间的链接,这对于加载表2是必需的。