diff --git a/src/FluentMigrator.Runner/Generators/Generic/GenericGenerator.cs b/src/FluentMigrator.Runner/Generators/Generic/GenericGenerator.cs index e5cac5ae4..feb2bc5de 100644 --- a/src/FluentMigrator.Runner/Generators/Generic/GenericGenerator.cs +++ b/src/FluentMigrator.Runner/Generators/Generic/GenericGenerator.cs @@ -250,28 +250,34 @@ public override string Generate(InsertDataExpression expression) string errors = ValidateAdditionalFeatureCompatibility(expression.AdditionalFeatures); if (!string.IsNullOrEmpty(errors)) return errors; - List columnNames = new List(); - List columnValues = new List(); - List insertStrings = new List(); + var insertStrings = GenerateColumnNamesAndValues(expression).Select(x => String.Format(InsertData, Quoter.QuoteTableName(expression.TableName),x.Key, x.Value)); + return String.Join("; ", insertStrings.ToArray()); + } + + protected List> GenerateColumnNamesAndValues(InsertDataExpression expression) + { + var insertStrings = new List>(); foreach (InsertionDataDefinition row in expression.Rows) { - columnNames.Clear(); - columnValues.Clear(); + var columnNames = new List(); + var columnValues = new List(); foreach (KeyValuePair item in row) { columnNames.Add(Quoter.QuoteColumnName(item.Key)); columnValues.Add(Quoter.QuoteValue(item.Value)); } - string columns = String.Join(", ", columnNames.ToArray()); - string values = String.Join(", ", columnValues.ToArray()); - insertStrings.Add(String.Format(InsertData, Quoter.QuoteTableName(expression.TableName), columns, values)); + var columns = String.Join(", ", columnNames.ToArray()); + var values = String.Join(", ", columnValues.ToArray()); + insertStrings.Add(new KeyValuePair(columns, values)); } - return String.Join("; ", insertStrings.ToArray()); + + return insertStrings; } - private string ValidateAdditionalFeatureCompatibility(IEnumerable> features) + + protected string ValidateAdditionalFeatureCompatibility(IEnumerable> features) { if (compatabilityMode == CompatabilityMode.STRICT) { List unsupportedFeatures = diff --git a/src/FluentMigrator.Runner/Generators/SqlServer/SqlServerCeGenerator.cs b/src/FluentMigrator.Runner/Generators/SqlServer/SqlServerCeGenerator.cs index b2199d4fe..780057122 100644 --- a/src/FluentMigrator.Runner/Generators/SqlServer/SqlServerCeGenerator.cs +++ b/src/FluentMigrator.Runner/Generators/SqlServer/SqlServerCeGenerator.cs @@ -31,6 +31,11 @@ public SqlServerCeGenerator() { } + public override string InsertData + { + get { return "INSERT INTO {0} ({1}) {2}"; } + } + public override string GetClusterTypeString(CreateIndexExpression column) { // Only nonclusterd @@ -95,5 +100,25 @@ public override string Generate(DeleteDefaultConstraintExpression expression) { throw new DatabaseOperationNotSupportedException(); } + + public override string Generate(InsertDataExpression expression) + { + var errors = ValidateAdditionalFeatureCompatibility(expression.AdditionalFeatures); + if (!string.IsNullOrEmpty(errors)) return errors; + + var columnNamesValues = GenerateColumnNamesAndValues(expression); + var selectStrings = columnNamesValues.Select(kv => "SELECT " + kv.Value); + + var sql = String.Format(InsertData, Quoter.QuoteTableName(expression.TableName), columnNamesValues.FirstOrDefault().Key, String.Join(" UNION ALL ", selectStrings.ToArray())); + + if (IsUsingIdentityInsert(expression)) + { + return string.Format("{0}; {1}; {2}", + string.Format(IdentityInsert, Quoter.QuoteTableName(expression.TableName), "ON"), + sql, + string.Format(IdentityInsert, Quoter.QuoteTableName(expression.TableName), "OFF")); + } + return sql; + } } } \ No newline at end of file diff --git a/src/FluentMigrator.Tests/Unit/Generators/SqlServerCe/SqlServerCeDataTests.cs b/src/FluentMigrator.Tests/Unit/Generators/SqlServerCe/SqlServerCeDataTests.cs index 01bf7ce36..2b9aa79fe 100644 --- a/src/FluentMigrator.Tests/Unit/Generators/SqlServerCe/SqlServerCeDataTests.cs +++ b/src/FluentMigrator.Tests/Unit/Generators/SqlServerCe/SqlServerCeDataTests.cs @@ -79,8 +79,8 @@ public override void CanInsertDataWithCustomSchema() var expression = GeneratorTestHelper.GetInsertDataExpression(); expression.SchemaName = "TestSchema"; - var expected = "INSERT INTO [TestTable1] ([Id], [Name], [Website]) VALUES (1, 'Just''in', 'codethinked.com');"; - expected += @" INSERT INTO [TestTable1] ([Id], [Name], [Website]) VALUES (2, 'Na\te', 'kohari.org')"; + var expected = "INSERT INTO [TestTable1] ([Id], [Name], [Website]) SELECT 1, 'Just''in', 'codethinked.com'"; + expected += @" UNION ALL SELECT 2, 'Na\te', 'kohari.org'"; var result = Generator.Generate(expression); result.ShouldBe(expected); @@ -91,8 +91,8 @@ public override void CanInsertDataWithDefaultSchema() { var expression = GeneratorTestHelper.GetInsertDataExpression(); - var expected = "INSERT INTO [TestTable1] ([Id], [Name], [Website]) VALUES (1, 'Just''in', 'codethinked.com');"; - expected += @" INSERT INTO [TestTable1] ([Id], [Name], [Website]) VALUES (2, 'Na\te', 'kohari.org')"; + var expected = "INSERT INTO [TestTable1] ([Id], [Name], [Website]) SELECT 1, 'Just''in', 'codethinked.com'"; + expected += @" UNION ALL SELECT 2, 'Na\te', 'kohari.org'"; var result = Generator.Generate(expression); result.ShouldBe(expected); @@ -105,7 +105,7 @@ public override void CanInsertGuidDataWithCustomSchema() expression.SchemaName = "TestSchema"; var result = Generator.Generate(expression); - result.ShouldBe(System.String.Format("INSERT INTO [TestTable1] ([guid]) VALUES ('{0}')", GeneratorTestHelper.TestGuid.ToString())); + result.ShouldBe(System.String.Format("INSERT INTO [TestTable1] ([guid]) SELECT '{0}'", GeneratorTestHelper.TestGuid.ToString())); } [Test] @@ -114,7 +114,7 @@ public override void CanInsertGuidDataWithDefaultSchema() var expression = GeneratorTestHelper.GetInsertGUIDExpression(); var result = Generator.Generate(expression); - result.ShouldBe(System.String.Format("INSERT INTO [TestTable1] ([guid]) VALUES ('{0}')", GeneratorTestHelper.TestGuid.ToString())); + result.ShouldBe(System.String.Format("INSERT INTO [TestTable1] ([guid]) SELECT '{0}'", GeneratorTestHelper.TestGuid.ToString())); } [Test] @@ -162,8 +162,8 @@ public void CanInsertDataWithIdentityInsert() expression.AdditionalFeatures.Add(SqlServerExtensions.IdentityInsert, true); var expected = "SET IDENTITY_INSERT [TestTable1] ON;"; - expected += " INSERT INTO [TestTable1] ([Id], [Name], [Website]) VALUES (1, 'Just''in', 'codethinked.com');"; - expected += @" INSERT INTO [TestTable1] ([Id], [Name], [Website]) VALUES (2, 'Na\te', 'kohari.org');"; + expected += " INSERT INTO [TestTable1] ([Id], [Name], [Website]) SELECT 1, 'Just''in', 'codethinked.com'"; + expected += @" UNION ALL SELECT 2, 'Na\te', 'kohari.org';"; expected += " SET IDENTITY_INSERT [TestTable1] OFF"; var result = Generator.Generate(expression); @@ -178,8 +178,8 @@ public void CanInsertDataWithIdentityInsertInStrictMode() Generator.compatabilityMode = Runner.CompatabilityMode.STRICT; var expected = "SET IDENTITY_INSERT [TestTable1] ON;"; - expected += " INSERT INTO [TestTable1] ([Id], [Name], [Website]) VALUES (1, 'Just''in', 'codethinked.com');"; - expected += @" INSERT INTO [TestTable1] ([Id], [Name], [Website]) VALUES (2, 'Na\te', 'kohari.org');"; + expected += " INSERT INTO [TestTable1] ([Id], [Name], [Website]) SELECT 1, 'Just''in', 'codethinked.com'"; + expected += @" UNION ALL SELECT 2, 'Na\te', 'kohari.org';"; expected += " SET IDENTITY_INSERT [TestTable1] OFF"; var result = Generator.Generate(expression);