diff --git a/src/commands/pull.ts b/src/commands/pull.ts index ba9a12b..78b11a0 100644 --- a/src/commands/pull.ts +++ b/src/commands/pull.ts @@ -60,10 +60,10 @@ export default class Pull { pool.request().query(typesRead) ]) .then(results => { - const tables: string[] = results[1].recordset - .map(item => `${item.schema}.${item.name}`); + const tables: sql.IRecordSet = results[1].recordset; + const names: string[] = tables.map(item => `${item.schema}.${item.name}`); - const matched: string[] = multimatch(tables, config.data); + const matched: string[] = multimatch(names, config.data); if (!matched.length) { return results; @@ -71,9 +71,11 @@ export default class Pull { return Promise.all( matched.map(item => { + const match: SqlTable = tables.find(table => item === `${table.schema}.${table.name}`); + return pool.request() .query(`SELECT * FROM ${item}`) - .then(result => ({ name: item, result })); + .then(result => ({ name: item, hasIdentity: match.identity_count > 0, result })); }) ) .then(data => [...results, ...data]); diff --git a/src/generators/mssql.ts b/src/generators/mssql.ts index d4714df..4449e33 100644 --- a/src/generators/mssql.ts +++ b/src/generators/mssql.ts @@ -54,9 +54,12 @@ export default class MSSQLGenerator { } output += EOL; - output += `SET IDENTITY_INSERT ${item.name} ON`; - output += EOL; - output += EOL; + + if (item.hasIdentity) { + output += `SET IDENTITY_INSERT ${item.name} ON`; + output += EOL; + output += EOL; + } item.result.recordset.forEach(row => { const keys: string[] = Object.keys(row); @@ -67,9 +70,13 @@ export default class MSSQLGenerator { output += EOL; }); - output += EOL; - output += `SET IDENTITY_INSERT ${item.name} OFF`; + if (item.hasIdentity) { + output += EOL; + output += `SET IDENTITY_INSERT ${item.name} OFF`; + output += EOL; + } + output += EOL; return output; } diff --git a/src/queries/interfaces.ts b/src/queries/interfaces.ts index 8d3586c..a7f4771 100644 --- a/src/queries/interfaces.ts +++ b/src/queries/interfaces.ts @@ -22,14 +22,16 @@ export interface SqlSchema { */ export interface SqlDataResult { name: string; + hasIdentity: number; result: sql.IResult; } /** * SQL table object. */ -// tslint:disable-next-line:no-empty-interface -export interface SqlTable extends AbstractSqlObject { } +export interface SqlTable extends AbstractSqlObject { + identity_count: number; +} /** * SQL type. diff --git a/src/queries/mssql.ts b/src/queries/mssql.ts index 4b2afc8..f9ab387 100644 --- a/src/queries/mssql.ts +++ b/src/queries/mssql.ts @@ -6,10 +6,20 @@ export const tablesRead: string = ` o.object_id, o.type, s.name AS [schema], - o.name + o.name, + isnull(c.identity_count, 0) AS [identity_count] FROM sys.objects o JOIN sys.schemas s ON o.schema_id = s.schema_id + LEFT JOIN ( + SELECT + i.object_id, + count(1) AS [identity_count] + FROM + sys.identity_columns i + GROUP BY + i.object_id + ) c on c.object_id = o.object_id where o.type = 'U' AND o.is_ms_shipped = 0