9

これが私がしなければならないことです:

3 つの列を持つテキスト ファイルがあります: PID, X, Y.

現在、データベースに 2 つのテーブルがあります。

  • 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

一時テーブルが良くないと言う人もいますが、それは本当に依存します-ファイルが大きい場合、ディスクからの読み取りに時間がかかり、2回やりたくないでしょう.

于 2013-06-07T08:51:34.213 に答える
1

テーブル 2 を更新するためのループは必要ありません。必要なのはinsert表 1 だけです。

または、テーブル 2 の既存の行を更新しようとしている場合は、updateテーブル 1 で結合するクエリを 使用します。例については、この質問を参照してください

ただし、データベースの設計は正しくないように思われるため、変更を検討する必要がありXますY。これらは 1 つのテーブルにのみ格納する必要があり、他のデータと組み合わせて使用​​する必要がある場合は、このテーブルに結合する必要があります。これを行うと、2 つのテーブルの同期を維持するという厄介な問題について心配する必要がなくなります。

于 2013-06-07T08:54:13.130 に答える