【问题标题】:How to add or update new value from temp table?如何从临时表中添加或更新新值?
【发布时间】:2012-12-18 15:27:20
【问题描述】:

如果存在A,B,Tarih和不存在如何更新行如何插入?

我的原始代码:

 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   . . . . .  

}

【问题讨论】:

  • 您需要merge 命令。我建议您在 SQL Server 文档中查找它。

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

您需要使用 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' );

现在,让我们对已经存在的键使用 MERGE。如果我们应该将“某事”更新为“更新!”对于 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;

我们确实看到了“更新!”对于某些属性。我们可以尝试一个新的值:

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!')。将此示例扩展到您的特定表和插入模式应该不难。如果您需要更多帮助,请告诉我。

【讨论】:

    【解决方案2】:

    根据戈登·林诺夫的建议

    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 on
    A = 来源.A AND 目标.B = 源.B AND 目标.C = 源.C AND 目标.D = 源.D
    AND 目标.E = 源.E AND target.Tarih = source.Tarih

    【讨论】:

      【解决方案3】:

      类似这样的:

      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 语句。这可能会使以后的维护更容易。

      【讨论】:

      • Msg 102,级别 15,状态 1,过程 sel_mrtg_bankaentegrasyondosyaolustur,第 772 行“合并”附近的语法不正确。消息 156,级别 15,状态 1,程序 sel_mrtg_bankaentegrasyondosyaolustur,第 797 行关键字“AS”附近的语法不正确。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      相关资源
      最近更新 更多