2017-04-12 3 views
0

Ich versuche, MERGE-Anweisung zu verwenden, um Daten in einer Tabelle mit Änderungen zu aktualisieren und Daten einzufügen, wenn die Zeile nicht vorhanden ist. Obwohl die Zusammenführungsbedingungen erfüllt sind, haben die Daten, die eingefügt werden, falsche Daten. MERGE-Anweisung fügt falsche Daten TSQL

Dies sind die Beispieldaten, die eingefügt werden soll ::

PrimaryFundName SsFundCode PortfolioName DataSourceName AssetClass SubAssetClass Strategy SubStrategy DataSourceFundName  CodeRedFundName 
Ventures   33EU  Endowment  SS_Private Edge  Fixed Income Private Equity Venture Capital Growth Equity 137 Ventures III 137 Ventures III 
Ventures   33EU  Endowment  SS_Accounting  Equity Private Equity Venture Capital Growth Equity  137 VENTURES III LP 137 Ventures III 

Aber die eingefügten Daten war unter ::

PrimaryFundName SsFundCode PortfolioName DataSourceName AssetClass SubAssetClass Strategy SubStrategy DataSourceFundName  CodeRedFundName 
Ventures   33EU  Endowment  SS_Private Perf  Fixed Income Private Equity Venture Capital Growth Equity 137 Ventures III 137 Ventures III 
Ventures   33EU  Endowment  SS_Accounting  Equity Private Equity Venture Capital Growth Equity  137 VENTURES III 137 Ventures III 

Datasource und Datasource Fondsname nicht korrekt war. Unten ist meine MERGE-Anweisung ::

MERGE FundRel FR 
USING #FundTemp Tmp 
ON (FR.DataSourceFundName = Tmp.DataSourceFundName AND FR.PortFolioID = 
Tmp.PortFolioID AND FR.DataSourceID = Tmp.DataSourceID) 
WHEN MATCHED THEN 
    UPDATE SET FR.DataSourceFundName = Tmp.NewDataSourceFundName 
    , FR.CodeRedFundName = Tmp.NewCodeRedFundName 
    , FR.AssetClassID = Tmp.AssetClassID 
    , FR.SubAssetClassID = Tmp.SubAssetClassID 
    , FR.StrategyID = Tmp.StrategyID 
, FR.SubStrategyID = Tmp.SubStrategyID 

WHEN NOT MATCHED BY TARGET THEN 
INSERT ([PortfolioID] 
    ,[DataSourceID] 
    ,[PrimaryFundID] 
    ,[DataSourceFundName] 
    ,[FundNumber] 
    ,[AssetClassID] 
    ,[SubAssetClassID] 
    ,[StrategyID] 
    ,[SubStrategyID] 
    ,[CodeRedFundName]) 
    VALUES (Tmp.[PortfolioID] 
    ,Tmp.[DataSourceID] 
    ,Tmp.[PrimaryFundID] 
    ,Tmp.[DataSourceFundName] 
    ,Tmp.FundCode 
    ,Tmp.[AssetClassID] 
    ,Tmp.[SubAssetClassID] 
    ,Tmp.[StrategyID] 
    ,Tmp.[SubStrategyID] 
    ,Tmp.[CodeRedFundName]); 

Bitte beraten, was ich falsch mache. Vielen Dank!

Update: Ich bin auf das Problem gekommen. Die falschen Daten kamen aus einem funkigen JOIN.

Antwort

2

Ihr Problem hat nichts mit merge zu tun

und wie können wir sagen, warum Sie falsches Ergebnis erhalten, wenn Sie nicht andere Details wie Tabelle Beispieldaten und Struktur liefern können.

oder Sie können Ihre eigene wie diese debuggen, Vielen Dank für Ihre Antwort @ Matt M.

select tmp.* 
from FundRel FR 
inner join #FundTemp Tmp 
ON (FR.DataSourceFundName = Tmp.DataSourceFundName 
AND FR.PortFolioID = Tmp.PortFolioID 
AND FR.DataSourceID = Tmp.DataSourceID) 
+0

Sie haben Recht @KumarHarsh. Die schlechten Daten kamen von einem funkigen Join, den ich habe. Ich versuche das zu korrigieren. Schätze deine Hilfe – Ramya

1

Überprüfen Sie den WHEN MATCHED-Block. FR.CodeRedFundName = Tmp.NewCodeRedFundName Die Spaltennamen unterscheiden sich von den Beispieldaten, die Sie oben angegeben haben.

+0

Die Bedingung Sie ist für meine Datenstruktur angemessen erwähnt. – Ramya