2012-12-18 39 views
1

如何更新行如果存在A,B,Tarih和Not exists如何插入?如何添加或更新臨時表中的新值?

我原來的代碼:

Insert X(A,B,C,D,E,Tarih) 
select substring(dosya,2,25) as A, 
substring(dosya,27,15) as B, 
substring(dosya,70,40) as C, 
CONVERT(DECIMAL(17,2),substring(dosya,52,17)) as D, 
case when substring(dosya,124,2)='00' then 'TL' 
    when substring(dosya,124,2)='01' then 'USD' 
    when substring(dosya,124,2)='02' then 'CHF' 
    when substring(dosya,124,2)='03' then 'CAD' 
    when substring(dosya,124,2)='04' then 'KWD' 

    when substring(dosya,124,2)='05' then 'GBP' 
    when substring(dosya,124,2)='06' then 'SAR' 
    when substring(dosya,124,2)='07' then 'JPY' 
    when substring(dosya,124,2)='08' then 'EUR' 

    when substring(dosya,124,2)='09' then 'AUD' 
    when substring(dosya,124,2)='10' then 'IRR' 
    when substring(dosya,124,2)='11' then 'DK' 
    when substring(dosya,124,2)='12' then 'SEK' 
else 'Döviz' end as E, 
@tarih as Tarih 
from #TempLog

我想更新現有價值

僞代碼:

if exist (A,B,C in BankaEntegrasyonLog) 

{ 

     Update Row! 

} 

else 

{ 

Insert 

X(A,B,C,D,E,Tarih) 

select substring(dosya,2,25) as . . . . . 

} 
+2

您需要'merge'命令。我建議你在SQL Server文檔中查找它。 –

回答

2

你要使用MERGE語句。

首先,讓我們創建一個測試表:

CREATE TABLE TestLog(SomeKey INTEGER, SomeAttribute VARCHAR(80)); 

而且我們可以插入一些值:

INSERT INTO TestLog(SomeKey, SomeAttribute) VALUES (43, 'Something'); 
INSERT INTO TestLog(SomeKey, SomeAttribute) VALUES (55, 'Another'); 
INSERT INTO TestLog(SomeKey, SomeAttribute) VALUES (77, 'Demo'); 

現在,讓我們使用與已經存在的關鍵字合併。如果我們應該更新'某些'到'更新!'對於SomeKey = 43:

MERGE TestLog AS TARGET 
USING (SELECT 43 AS SomeKey, 'Updated!' AS SomeAttribute) 
AS SOURCE(SomeKey, SomeAttribute) 
ON (TARGET.SomeKey = SOURCE.SomeKey) 
WHEN MATCHED THEN 
    UPDATE SET SomeAttribute = Source.SomeAttribute 
WHEN NOT MATCHED THEN 
    INSERT (SomeKey, SomeAttribute) 
    VALUES (SOURCE.SomeKey, SOURCE.SomeAttribute); 

我們可以檢查它的工作:

SELECT * FROM TESTLOG WHERE SomeKey = 43;

我們的確看到「更新!」爲SomeAttribute。我們可以嘗試一種新的價值:

MERGE TestLog AS TARGET 
USING (SELECT 22 AS SomeKey, 'Newone!' AS SomeAttribute) 
AS SOURCE(SomeKey, SomeAttribute) 
ON (TARGET.SomeKey = SOURCE.SomeKey) 
WHEN MATCHED THEN 
    UPDATE SET SomeAttribute = Source.SomeAttribute 
WHEN NOT MATCHED THEN 
    INSERT (SomeKey, SomeAttribute) 
    VALUES (SOURCE.SomeKey, SOURCE.SomeAttribute); 

,並檢查它:

SELECT * FROM TestLog; 

我們確實看到了新的第四行與(22 'Newone!')。把這個例子擴展到你的特定表並插入模式不應該很難。讓我知道你是否需要更多的幫助。

0

事情是這樣的:

MERGE [dbo].[X] AS TARGET 
USING (
    SELECT 
     SUBSTRING([dosya],2,25) AS [A], 
     SUBSTRING([dosya],27,15) AS [B], 
     SUBSTRING([dosya],70,40) AS [C], 
     CONVERT(DECIMAL(17,2),SUBSTRING([dosya],52,17)) AS [D], 
     CASE 
      WHEN SUBSTRING([dosya],124,2)='00' THEN 'TL' 
      WHEN SUBSTRING([dosya],124,2)='01' THEN 'USD' 
      WHEN SUBSTRING([dosya],124,2)='02' THEN 'CHF' 
      WHEN SUBSTRING([dosya],124,2)='03' THEN 'CAD' 
      WHEN SUBSTRING([dosya],124,2)='04' THEN 'KWD' 
      WHEN SUBSTRING([dosya],124,2)='05' THEN 'GBP' 
      WHEN SUBSTRING([dosya],124,2)='06' THEN 'SAR' 
      WHEN SUBSTRING([dosya],124,2)='07' THEN 'JPY' 
      WHEN SUBSTRING([dosya],124,2)='08' THEN 'EUR' 
      WHEN SUBSTRING([dosya],124,2)='09' THEN 'AUD' 
      WHEN SUBSTRING([dosya],124,2)='10' THEN 'IRR' 
      WHEN SUBSTRING([dosya],124,2)='11' THEN 'DK' 
      WHEN SUBSTRING([dosya],124,2)='12' THEN 'SEK' 
      ELSE 'Döviz' 
     END AS [E], 
     @tarih AS [Tarih] 
    FROM #TempLog 
) AS SOURCE 
    ON SOURCE.[A] = TARGET.[A] 
    AND SOURCE.[B] = TARGET.[B] 
    AND SOURCE.[Tarih] = TARGET.[Tarih] 
WHEN NOT MATCHED THEN 
    INSERT (
     [A], 
     [B], 
     [C], 
     [D], 
     [E], 
     [Tarih] 
    ) 
    VALUES (
     SOURCE.[A], 
     SOURCE.[B], 
     SOURCE.[C], 
     SOURCE.[D], 
     SOURCE.[E], 
     SOURCE.[Tarih] 
    ) 
WHEN MATCHED THEN 
    UPDATE 
    SET [C] = SOURCE.[C], 
     [D] = SOURCE.[D], 
     [E] = SOURCE.[E]; 

我也會考慮創建一個查找表來替換case語句。這可能會使未來的維護更容易。根據建議

+0

Msg 102,Level 15,State 1,Procedure sel_mrtg_bankaentegrasyondosyaolustur,Line 772 'MERGE'附近語法不正確。 Msg 156,Level 15,State 1,Procedure sel_mrtg_bankaentegrasyondosyaolustur,Line 797 關鍵字'AS'附近的語法不正確。 – programmerist

0

戈登·利諾夫

MERGE X AS target 
USING 
(
    select Id, 
     substring(dosya,2,25) as A, 
     substring(dosya,27,15) as B, 
     substring(dosya,70,40) as C, 
     CONVERT(DECIMAL(17,2),substring(dosya,52,17)) as D, 
     case when substring(dosya,124,2)='00' then 'TL' 
       when substring(dosya,124,2)='01' then 'USD' 
       when substring(dosya,124,2)='02' then 'CHF' 
       when substring(dosya,124,2)='03' then 'CAD' 
       when substring(dosya,124,2)='04' then 'KWD' 
       when substring(dosya,124,2)='05' then 'GBP' 
       when substring(dosya,124,2)='06' then 'SAR' 
       when substring(dosya,124,2)='07' then 'JPY' 
       when substring(dosya,124,2)='08' then 'EUR' 
       when substring(dosya,124,2)='09' then 'AUD' 
       when substring(dosya,124,2)='10' then 'IRR' 
       when substring(dosya,124,2)='11' then 'DK' 
       when substring(dosya,124,2)='12' then 'SEK' 
       else 'Döviz' end as TutarParaBrimi, @tarih as Tarih 
    from #TempLog 
) AS source 
ON target.Id = source.Id 
WHEN MATCHED THEN 
    UPDATE SET A = source.A, 
      B = source.B, 
      C = source.C, 
      D = source.D, 
      E = source.E, 
      Tarih = source.Tarih 
WHEN NOT MATCHED THEN 
    INSERT (A, B, C, D, E, Tarih) 
    VALUES (source.A, source.B, source.C, source.D, source.E, source.Tarih); 

如果沒有ID列然後更換target.Id = source.Id上
A = source.A AND target.B = source.B 和target.C =由source.c AND target.D = source.D
和target.E = source.E AND target.Tarih = source.Tarih