Skip to content

Commit

Permalink
Merge pull request #682 of RobPethick/dev-421-UpdateSQLCeForMultipleR…
Browse files Browse the repository at this point in the history
…owInserts

   * Update SQL Server Ce Generator to use SELECT UNION ALL syntax to support multiple row inserts
  • Loading branch information
tommarien committed Mar 24, 2016
2 parents 45d447e + 02c3a1b commit 364e6b6
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 20 deletions.
26 changes: 16 additions & 10 deletions src/FluentMigrator.Runner/Generators/Generic/GenericGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -250,28 +250,34 @@ public override string Generate(InsertDataExpression expression)
string errors = ValidateAdditionalFeatureCompatibility(expression.AdditionalFeatures);
if (!string.IsNullOrEmpty(errors)) return errors;

List<string> columnNames = new List<string>();
List<string> columnValues = new List<string>();
List<string> insertStrings = new List<string>();
var insertStrings = GenerateColumnNamesAndValues(expression).Select(x => String.Format(InsertData, Quoter.QuoteTableName(expression.TableName),x.Key, x.Value));
return String.Join("; ", insertStrings.ToArray());
}

protected List<KeyValuePair<string,string>> GenerateColumnNamesAndValues(InsertDataExpression expression)
{
var insertStrings = new List<KeyValuePair<string, string>>();

foreach (InsertionDataDefinition row in expression.Rows)
{
columnNames.Clear();
columnValues.Clear();
var columnNames = new List<string>();
var columnValues = new List<string>();
foreach (KeyValuePair<string, object> 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<string, string>(columns, values));
}
return String.Join("; ", insertStrings.ToArray());

return insertStrings;
}

private string ValidateAdditionalFeatureCompatibility(IEnumerable<KeyValuePair<string, object>> features)

protected string ValidateAdditionalFeatureCompatibility(IEnumerable<KeyValuePair<string, object>> features)
{
if (compatabilityMode == CompatabilityMode.STRICT) {
List<string> unsupportedFeatures =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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]
Expand All @@ -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]
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down

0 comments on commit 364e6b6

Please sign in to comment.