以下是我必须做的事情:
我有一个包含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
循环或其他内容。
但我无法弄清楚确切的事情。
答案 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。
但是,您应该考虑更改数据库设计,因为它似乎不正确:您将X
和Y
存储在两个位置;它们只应存储在一个表中,如果需要将它们与其他数据结合使用,则应加入此表。如果你这样做,你就不必担心让两个表保持同步的混乱问题。