2013-06-07 8 views
5

यहाँ से अद्यतन करें मैं क्या करना है है।एसक्यूएल: <code>PID, X, Y</code>:</p> <p>मैं एक पाठ फ़ाइल जिसमें 3 स्तंभ है: एक पाठ फ़ाइल

  • Table 1 4 कॉलम होते हैं::

    अब मैं अपने डेटाबेस में दो तालिकाओं है UID, PID, X, Y

  • Table 2 एकाधिक स्तंभों, आवश्यक लोगों को किया जा रहा है UID, X, Y

मैं इसी के साथ Table 2 अद्यतन करने की आवश्यकता शामिल एक्स और वाई मान।

मुझे लगता है कि हम का उपयोग table 1 को अपडेट करने के लिए कर सकते हैं, फिर कुछ WHILE लूप या कुछ।

लेकिन मुझे सटीक चीज़ नहीं पता है।

+0

स्पष्ट नहीं है - आप 'तालिका 1' में टेक्स्ट फ़ाइल को 'BULK INSERT' करना चाहते हैं और फिर उस से 'तालिका 2' अपडेट करना चाहते हैं? और क्या? साथ ही: उन स्तंभों के ** डेटा प्रकार ** क्या हैं? क्या आप हमें ** नमूना पाठ फ़ाइल ** दिखा सकते हैं? –

+0

कृपया SQL सर्वर के अपने संस्करण को उद्धृत करें (आप एक और विशिष्ट टैग जोड़ सकते हैं) – Paul

उत्तर

8
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 

आप अपनी समस्या का समाधान करने के लिए इस उपरोक्त दृष्टिकोण का उपयोग कर सकते हैं। उम्मीद है की यह मदद करेगा। :)

+0

इच्छा है कि मैं आपको धन्यवाद देने के लिए शब्द ... – Spandan

+0

यह मेरे लिए पर्याप्त है ... :) –

2

आप इसे कैसे चलाने जा रहे हैं? एक संग्रहीत प्रक्रिया से?

कुछ प्रदर्शन बचाने के लिए, मैं अस्थायी मेज पर BULK INSERT किया होता, तो तालिका 1 & 2.

को अस्थायी मेज से सम्मिलित यह इस

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

कुछ है कि अस्थायी बता देंगे की तरह दिखना चाहिए तालिका अच्छी नहीं है, लेकिन यह वास्तव में निर्भर है - यदि आप फ़ाइल बड़ी हैं, तो डिस्क से इसे पढ़ने में समय लगेगा और आप इसे दो बार नहीं करना चाहते हैं।

+0

हां एक संग्रहित proc बनाते हैं ... मैं जानना चाहता हूं कि आप चरण 2 को कैसे प्राप्त करते हैं, temp तालिका से तालिका 2 में डालें? – Spandan

+0

पहले तालिका 1 लोड करने के लिए बेहतर है, फिर तालिका 1 का उपयोग स्रोत के रूप में तालिका 2 का उपयोग करें। तालिका 1 में 'uid' और' pid' के बीच लिंक है जो तालिका 2 को लोड करने के लिए आवश्यक है। –

1

आपको टेबल 2 अपडेट करने के लिए किसी भी लूप की आवश्यकता नहीं है; आप सभी की जरूरत तालिका 1.

से insert है या, यदि आप तालिका 2 में मौजूदा पंक्तियों को अद्यतन करने के प्रयास कर रहे हैं, एक update क्वेरी कि तालिका 1. See this question for an example पर मिलती है का उपयोग करें।

हालांकि, आपको अपने डेटाबेस डिज़ाइन को बदलने पर विचार करना चाहिए, क्योंकि यह गलत लगता है: आप X और Y को दो स्थानों पर संग्रहीत कर रहे हैं; उन्हें केवल एक टेबल में ही संग्रहित किया जाना चाहिए, और यदि आपको अन्य डेटा के संयोजन के साथ उपयोग करने की आवश्यकता है तो आपको इस तालिका में शामिल होना चाहिए। यदि आपने ऐसा किया है, तो आपको दो तालिकाओं को सिंक में रखने के गन्दा मुद्दों के बारे में चिंता करने की आवश्यकता नहीं होगी।

संबंधित मुद्दे