@@ -29,6 +29,7 @@ async function clipboardToSql(statement = null) {
2929 "INSERT INTO" ,
3030 "DELETE WHERE" ,
3131 "UPDATE WHERE" ,
32+ "MERGE INTO" ,
3233 "CREATE TABLE"
3334 ] ;
3435 statement = await vscode . window . showQuickPick (
@@ -44,7 +45,7 @@ async function clipboardToSql(statement = null) {
4445 }
4546
4647 let keyColumns = [ ] ;
47- if ( statement === "UPDATE WHERE" ) {
48+ if ( statement === "UPDATE WHERE" || statement === "MERGE INTO" ) {
4849 keyColumns = await vscode . window . showQuickPick (
4950 tableData . headers ,
5051 {
@@ -205,6 +206,23 @@ function createSql(tableData, statement, keyColumns) {
205206 return sql ;
206207 }
207208
209+ function getSqlAsMergeInto ( rows , cols , keys ) {
210+ let unionall = getRowsAsUnionAll ( rows , cols ) ;
211+ let onkeys = keys . map ( k => `t2.${ k } = s1.${ k } ` ) . join ( "\n AND " ) ;
212+ let nonkeys = cols . filter ( k => keys . indexOf ( k ) < 0 ) ;
213+ let upset = nonkeys . map ( k => ` ${ k } = s1.${ k } ` ) . join ( ",\n" ) ;
214+ let c1 = cols . join ( ", " ) ;
215+ let c2 = cols . join ( ", s1." ) ;
216+ let into = ` INSERT (${ c1 } )\n VALUES (s1.${ c2 } )` ;
217+
218+ let sql = `MERGE INTO mytable AS t2 USING(\n${ unionall } \n`
219+ + ` ) AS s1\n ON ${ onkeys } \n`
220+ + `WHEN MATCHED THEN UPDATE SET\n${ upset } \n`
221+ + `WHEN NOT MATCHED THEN\n${ into } \n`
222+ + `WHEN NOT MATCHED BY SOURCE THEN\n DELETE;\n` ;
223+ return sql ;
224+ }
225+
208226 function getSqlAsInsertFromSelectValues ( rows , cols ) {
209227 let sql = getSqlAsSelectFromValues ( rows , cols ) ;
210228 return `INSERT INTO mytable\n${ sql } ` ;
@@ -257,6 +275,8 @@ function createSql(tableData, statement, keyColumns) {
257275 return getSqlAsDeleteWhere ( data , headers ) ;
258276 case "UPDATE WHERE" :
259277 return getSqlAsUpdateWhere ( data , headers , keyColumns ) ;
278+ case "MERGE INTO" :
279+ return getSqlAsMergeInto ( data , headers , keyColumns ) ;
260280 case "CREATE TABLE" :
261281 return getSqlAsCreateTable ( data , headers ) ;
262282 }
0 commit comments