【问题标题】:Converting Oracle upsert to AzureSQL(T-SQL) prepared statement将 Oracle upsert 转换为 Azure SQL(MSSQL) 准备好的语句
【发布时间】:2021-11-11 03:34:57
【问题描述】:

我想将 upsert 查询从 Oracle DB 迁移到 AzureSQL。下面显示了一个 Oracle 准备好的语句,它从 dual 中获取值并对 DUMMY 表执行 upsert 操作。

MERGE INTO DUMMY a
USING (SELECT ? ID,
              ? NAME,
              ? SIZE from dual) b
ON (a.ID = b.ID)
WHEN MATCHED THEN
    UPDATE
    SET a.ID = b.ID,
        a.NAME = b.NAME,
        a.SIZE = b.SIZE
WHEN NOT MATCHED THEN
    INSERT(a.ID,
           a.NAME,
           a.SIZE)
    VALUES ( b.ID,
             b.NAME,
             b.SIZE)

我之前还要求从 Oracle 迁移到 Postgres。 This 是我询问的 PostgreSQL 版本。我现在正在寻找一种转换成 AzureSQL 的方法。

【问题讨论】:

  • 不知道,我不了解 Azure,但是您编写的 MERGE 将不起作用,因为您无法更新 ON 子句中引用的列(本例中为 ID)。
  • Oracle upserts 现在可以在实时系统上正常工作。需要 T-SQL 版本。

标签: tsql jdbc azure-sql-database prepared-statement upsert


【解决方案1】:

T-SQL 的更新插入。

MERGE dbo.table_name AS [Target]
USING (SELECT 1 AS Id, 'name' as t_name, 1 as size) AS [Source] 
   ON [Target].Id = [Source].Id
WHEN MATCHED THEN
  UPDATE SET [Target].name = [Source].t_name, [Target].size = [Source].size
WHEN NOT MATCHED THEN
  INSERT (Id, name, size) VALUES ([Source].Id, [Source].t_name, [Source].size); 

使用参数值准备源表

DECLARE @id int = 1,
        @name varchar(10) = 'ABC',
        @size int = 5

MERGE dbo.table_name AS [Target]
USING (SELECT @id AS Id, @name as t_name, @size as size) AS [Source] 
   ON [Target].Id = [Source].Id
WHEN MATCHED THEN
  UPDATE SET [Target].name = [Source].t_name, [Target].size = [Source].size
WHEN NOT MATCHED THEN
  INSERT (Id, name, size) VALUES ([Source].Id, [Source].t_name, [Source].size);

请查看网址https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=13d32c099991dc3001fe4a8cd0b3fc77

【讨论】:

  • 你能说出第2行的逻辑吗?为什么我们要写“USING (SELECT 1 AS Id, 'name' as t_name, 1 as size) AS [Source]”?值应取自准备好的语句。你知道那个角色吗?例如在 oracle 中:“?”在 postgres 中:“排除”
  • 我准备了一个虚拟表作为源表。您可以使用数据库表而不是虚拟表作为源。我遵循了上面的例子,这就是我准备虚拟表的原因。如果我的回答对您有帮助,请将其标记为已接受并点赞,以便任何人毫无疑问地选择该答案。
  • 谢谢,它对数据库 upsert 查询有帮助,并且具有魔力。唯一的事情是,我们如何将这些值作为参数,而不是提供像“1 AS Id,'name' as t_name ...”这样的自定义值?我将使用 jdbcprepared-statement 传递值。
  • 请检查这个新查询,其中使用参数准备了虚拟表。
猜你喜欢
  • 1970-01-01
  • 2021-05-09
  • 2013-07-29
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
相关资源
最近更新 更多