दिलचस्प पोस्ट
उत्पादों को Google Play और इन-ऐप बिलिंग बनाएं पायथन में पिंगिंग सर्वर एनजी-क्लिक एक निर्देश के टेम्पलेट के भीतर काम नहीं करता सी # में छवियों की एसआरसी पाने के लिए नियमित अभिव्यक्ति सी # – एचटीटीपी वेबबर्स्ट पोस्ट (फेसबुक पर लॉग इन करें) सत्र की समय सीमा समाप्त होने से पहले विधि डालें स्ट्रीम से वीडियो चलाने के लिए मीडियाएलेमेंट का उपयोग करना डायरेक्टएक्स फुल-स्क्रीन एप्लिकेशन का स्क्रीनशॉट लें मूल्य बनाम वस्तु वस्तुएं (डोमेन प्रेरित डिजाइन) कैसे एपीके डीबग रिहाई के लिए हस्ताक्षर किए? एसआईसीपी में विपक्ष / कार / सीडीआर परिभाषा के लिए लैम्ब्डा का उपयोग क्या केस-स्विच इस तरह काम करता है? ओएस में क्या होता है जब हम सी में एक नल सूचक को dereference? संक्षिप्त वेक्टर पायथन में जोड़ने? एक ही विमान में एक ही मूल के साथ दो 3D वैक्टर के बीच हस्ताक्षरित कोण

Source.id और target.id के बीच मानचित्रण प्राप्त करने के लिए मर्ज..आउटपुट का उपयोग करना

बहुत सरलीकृत, मेरे पास दो टेबल स्रोत और लक्ष्य हैं

declare @Source table (SourceID int identity(1,2), SourceName varchar(50)) declare @Target table (TargetID int identity(2,2), TargetName varchar(50)) insert into @Source values ('Row 1'), ('Row 2') 

मैं @Source से @Source तक सभी पंक्तियों को स्थानांतरित करना चाहूंगा और प्रत्येक TargetID लिए TargetID को जानना SourceID क्योंकि वहां भी SourceChild और TargetChild को कॉपी किया जाना आवश्यक है और मुझे TargetID में नए TargetID को जोड़ने की आवश्यकता है। TargetChild.TargetID FK कॉलम ।

इसमें कुछ समाधान दिए गए हैं

  1. एक समय लूप या कर्सर का उपयोग एक समय में लक्ष्य करने के लिए एक पंक्ति (आरबीएआर) को सम्मिलित करने के लिए करें और लक्षित scope_identity() के एफके को भरने के लिए scope_identity() का उपयोग करें।
  2. SourceID लिए एक SourceID कॉलम जोड़ें और SourceID डालें आप TargetID में TargetID को TargetID लाने के लिए उस कॉलम में शामिल हो सकते हैं।
  3. @Target लिए SET IDENTITY_INSERT OFF और अपने आप को नए मूल्यों को सौंपने का संचालन करें। आपको एक श्रेणी मिलती है जिसे आप TargetChild.TargetID में उपयोग TargetChild.TargetID

मैं उनमें से किसी के शौकीन नहीं हूं। जो मैंने इस्तेमाल किया है वह अब तक कर्सर है I

मैं वास्तव में क्या करना चाहता हूं, सम्मिलित वक्तव्य के output का उपयोग करना है।

 insert into @Target(TargetName) output inserted.TargetID, S.SourceID select SourceName from @Source as S 

लेकिन यह संभव नहीं है

 The multi-part identifier "S.SourceID" could not be bound. 

लेकिन मर्ज के साथ संभव है।

 merge @Target as T using @Source as S on 0=1 when not matched then insert (TargetName) values (SourceName) output inserted.TargetID, S.SourceID; 

परिणाम

 TargetID SourceID ----------- ----------- 2 1 4 3 

मैं जानना चाहता हूं कि आपने इसका इस्तेमाल किया है? यदि आपके पास समाधान के बारे में कोई विचार है या इसके साथ कोई समस्या है? यह सरल परिदृश्यों में ठीक काम करता है लेकिन शायद कुछ बदसूरत हो सकता है जब एक जटिल स्रोत क्वेरी के कारण क्वेरी प्लान वास्तव में जटिल हो जाता है सबसे खराब स्थिति यह होगी कि लक्ष्यआईडी / स्रोतआईडी जोड़े वास्तव में एक मैच नहीं हैं

एमएसडीएन को आउटपुट क्लॉज के from_table_name के बारे में यह from_table_name के लिए है

एक स्तंभ उपसर्ग है जो तालिका को निर्दिष्ट करता है जिसमें किसी DELETE, UPDATE, या MERGE कथन के FROM खंड में शामिल किया गया है जो कि अद्यतन या हटाने के लिए पंक्तियों को निर्दिष्ट करने के लिए उपयोग किया जाता है

कुछ कारणों से वे "पंक्तियाँ डालें, अपडेट या हटाएं" केवल "अपडेट करने या हटाने के लिए पंक्तियां" नहीं कहती हैं

किसी भी विचार का स्वागत है और मूल समस्या के पूरी तरह से अलग समाधान बहुत सराहना की है।

Solutions Collecting From Web of "Source.id और target.id के बीच मानचित्रण प्राप्त करने के लिए मर्ज..आउटपुट का उपयोग करना"

मेरी राय में यह मर्ज और आउटपुट का एक बड़ा उपयोग है। मैंने कई परिदृश्यों में उपयोग किया है और आज तक किसी भी विषमता का अनुभव नहीं किया है। उदाहरण के लिए, यहां एक परीक्षण सेटअप है जो कि एक फ़ोल्डर बनाते हैं और इसमें सभी फाइलें (पहचान) एक नए बनाए गए फ़ोल्डर (गाइड) में

 DECLARE @FolderIndex TABLE (FolderId UNIQUEIDENTIFIER PRIMARY KEY, FolderName varchar(25)); INSERT INTO @FolderIndex (FolderId, FolderName) VALUES(newid(), 'OriginalFolder'); DECLARE @FileIndex TABLE (FileId int identity(1,1) PRIMARY KEY, FileName varchar(10)); INSERT INTO @FileIndex (FileName) VALUES('test.txt'); DECLARE @FileFolder TABLE (FolderId UNIQUEIDENTIFIER, FileId int, PRIMARY KEY(FolderId, FileId)); INSERT INTO @FileFolder (FolderId, FileId) SELECT FolderId, FileId FROM @FolderIndex CROSS JOIN @FileIndex; -- just to illustrate DECLARE @sFolder TABLE (FromFolderId UNIQUEIDENTIFIER, ToFolderId UNIQUEIDENTIFIER); DECLARE @sFile TABLE (FromFileId int, ToFileId int); -- copy Folder Structure MERGE @FolderIndex fi USING ( SELECT 1 [Dummy], FolderId, FolderName FROM @FolderIndex [fi] WHERE FolderName = 'OriginalFolder' ) d ON d.Dummy = 0 WHEN NOT MATCHED THEN INSERT (FolderId, FolderName) VALUES (newid(), 'copy_'+FolderName) OUTPUT d.FolderId, INSERTED.FolderId INTO @sFolder (FromFolderId, toFolderId); -- copy File structure MERGE @FileIndex fi USING ( SELECT 1 [Dummy], fi.FileId, fi.[FileName] FROM @FileIndex fi INNER JOIN @FileFolder fm ON fi.FileId = fm.FileId INNER JOIN @FolderIndex fo ON fm.FolderId = fo.FolderId WHERE fo.FolderName = 'OriginalFolder' ) d ON d.Dummy = 0 WHEN NOT MATCHED THEN INSERT ([FileName]) VALUES ([FileName]) OUTPUT d.FileId, INSERTED.FileId INTO @sFile (FromFileId, toFileId); -- link new files to Folders INSERT INTO @FileFolder (FileId, FolderId) SELECT sfi.toFileId, sfo.toFolderId FROM @FileFolder fm INNER JOIN @sFile sfi ON fm.FileId = sfi.FromFileId INNER JOIN @sFolder sfo ON fm.FolderId = sfo.FromFolderId -- return SELECT * FROM @FileIndex fi JOIN @FileFolder ff ON fi.FileId = ff.FileId JOIN @FolderIndex fo ON ff.FolderId = fo.FolderId 

@ नाथन के उदाहरण को जोड़ने के लिए मैं एक और उदाहरण जोड़ना चाहूंगा, क्योंकि मुझे यह कुछ भ्रमित था।

मेरा अधिकांश भाग के लिए असली तालिकाओं का उपयोग करता है, और अस्थायी टेबल नहीं

मुझे यहां से मेरी प्रेरणा मिली: एक और उदाहरण

 -- Copy the FormSectionInstance DECLARE @FormSectionInstanceTable TABLE(OldFormSectionInstanceId INT, NewFormSectionInstanceId INT) ;MERGE INTO [dbo].[FormSectionInstance] USING ( SELECT fsi.FormSectionInstanceId [OldFormSectionInstanceId] , @NewFormHeaderId [NewFormHeaderId] , fsi.FormSectionId , fsi.IsClone , @UserId [NewCreatedByUserId] , GETDATE() NewCreatedDate , @UserId [NewUpdatedByUserId] , GETDATE() NewUpdatedDate FROM [dbo].[FormSectionInstance] fsi WHERE fsi.[FormHeaderId] = @FormHeaderId ) tblSource ON 1=0 -- use always false condition WHEN NOT MATCHED THEN INSERT ( [FormHeaderId], FormSectionId, IsClone, CreatedByUserId, CreatedDate, UpdatedByUserId, UpdatedDate) VALUES( [NewFormHeaderId], FormSectionId, IsClone, NewCreatedByUserId, NewCreatedDate, NewUpdatedByUserId, NewUpdatedDate) OUTPUT tblSource.[OldFormSectionInstanceId], INSERTED.FormSectionInstanceId INTO @FormSectionInstanceTable(OldFormSectionInstanceId, NewFormSectionInstanceId); -- Copy the FormDetail INSERT INTO [dbo].[FormDetail] (FormHeaderId, FormFieldId, FormSectionInstanceId, IsOther, Value, CreatedByUserId, CreatedDate, UpdatedByUserId, UpdatedDate) SELECT @NewFormHeaderId, FormFieldId, fsit.NewFormSectionInstanceId, IsOther, Value, @UserId, CreatedDate, @UserId, UpdatedDate FROM [dbo].[FormDetail] fd INNER JOIN @FormSectionInstanceTable fsit ON fsit.OldFormSectionInstanceId = fd.FormSectionInstanceId WHERE [FormHeaderId] = @FormHeaderId