以下是需要完成的任务:
我有一个文本文件,它有三列:PID, X, Y
.
现在我的数据库中有两个表:
Table 1
包含4列:UID, PID, X, Y
Table 2
包含多列,必要的列是UID, X, Y
我需要用相应的X和Y值更新Table 2
。
我认为我们可以使用BULK INSERT
来更新table 1
,然后使用一些WHILE
循环或其他方法。
但我无法准确地理解它们之间的关系。
以下是需要完成的任务:
我有一个文本文件,它有三列:PID, X, Y
.
现在我的数据库中有两个表:
Table 1
包含4列:UID, PID, X, Y
Table 2
包含多列,必要的列是UID, X, Y
我需要用相应的X和Y值更新Table 2
。
我认为我们可以使用BULK INSERT
来更新table 1
,然后使用一些WHILE
循环或其他方法。
但我无法准确地理解它们之间的关系。
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
您可以使用上述方法解决您的问题。希望这有所帮助。 :)你将如何运行它?从存储过程中运行吗?
为了提高性能,我会使用BULK INSERT
到临时表中,然后从临时表插入到Table 1和2。
应该是这个样子的。
INSERT INTO Table1 ( PID, X, Y)
SELECT PID, X, Y
FROM #tempTable
有人会说临时表不好,但这取决于实际情况——如果文件很大,从磁盘读取需要时间,而且您不想重复执行此操作。
uid
和pid
之间的链接,这对于无论如何加载表2都是必要的。 - user1919238insert
即可。update
查询。查看这个问题以获取示例。X
和Y
;它们只应该被存储在一个表中,如果你需要与其他数据结合使用它们,你应该连接到这个表。如果你这样做了,你就不必担心保持两个表同步的混乱问题。