这是我必须做的:
我有一个包含 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
循环或其他东西。
但我无法弄清楚确切的事情。
这是我必须做的:
我有一个包含 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
循环或其他东西。
但我无法弄清楚确切的事情。
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
临时表进行操作,然后从临时表插入到表 1 和表 2。
它应该看起来像这样
INSERT INTO Table1 ( PID, X, Y)
SELECT PID, X, Y
FROM #tempTable
有些人会说临时表不好,但这真的取决于 - 如果你的文件很大,从磁盘读取它需要时间,你不想做两次。
您不需要任何循环来更新表 2;您所需要的只是insert
表 1。
或者,如果您尝试更新表 2 中的现有行,请使用update
连接表 1 的查询。 有关示例,请参阅此问题。
但是,您应该考虑更改您的数据库设计,因为它似乎是不正确的:您存储X
在Y
两个地方;它们应该只存储在一个表中,如果您需要将它们与其他数据一起使用,则应该加入该表。如果你这样做了,你就不必担心保持两个表同步的混乱问题。