我正在传输数据库。我有6万行SQL插入语句。由于旧数据库中的某些字段不在新数据库中,因此我需要编辑已有的语句。
例如:
INSERT INTO Product (Name,Count,Brand,Type,Code) VALUES ("Toys",4,NULL,"Child Toy","T001")
新数据库的表达式应为:
INSERT INTO Product (Name,Count,Type,) VALUES ("Toys",4,"Child Toy")
此过程对不同的表结构也有效,因此我正在寻找一种永久解决方案。
我写这个解决方案:
string s="INSERT INTO Product (Name,Count,Brand,Type,Code) VALUES ("Toys",4,NULL,"Child Toy","T001")"
s.Replace("Code", "");
Console.WriteLine(s);
但是此解决方案非常原始。我该如何解决?
您只需更改表名就可以使用现有语句。
首先,创建一个视图和一个触发器:
create view vwProduct as
select [Name], [Count], null as [Brand], [Type], null as [Code] from Product
create trigger ProductTrigger on vwProduct
instead of insert
as
begin
insert into Product
select [Name], [Count], [Type] from inserted
end;
现在您只需将Product
更改为vwProduct
,就可以运行现有语句:
INSERT INTO vwProduct (Name,Count,Brand,Type,Code) VALUES ("Toys",4,NULL,"Child Toy","T001")
我写了一个小巧的控制台应用程序,可以解决问题...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("INSERT INTO Product (Name,Count,Brand,Type,Code) VALUES (\"Toys\",4,NULL,\"Child Toy\",\"T001\")");
Console.WriteLine(GetCorrectedInsertStatement("INSERT INTO Product (Name,Count,Brand,Type,Code) VALUES (\"Toys\",4,NULL,\"Child Toy\",\"T001\")", "Brand", "Code"));
}
private static string GetCorrectedInsertStatement(string sqlInput, params string[] columnssToRemove)
{
string sqlOutput = string.Empty;
if (columnssToRemove.Length == 0)
{
return sqlInput;
}
int indexOpenBracket = sqlInput.IndexOf('(');
// Copy prepare sqlOutput with INSERT INTO [Table] ({0}) VALUES ({1})
sqlOutput = sqlInput.Substring(0, indexOpenBracket) + "({0}) VALUES ({1})";
// Remove INSERT INTO [COLUMN] from sqlInput
sqlInput = sqlInput.Substring(indexOpenBracket, sqlInput.Length - indexOpenBracket);
int indexCloseBracket = sqlInput.IndexOf(')');
// Get Coumn1,Column2,...
string tmpColumns = sqlInput.Substring(1, indexCloseBracket - 1);
// Split to get all columns
List<string> columns = tmpColumns.Split(',').ToList();
// Remove Coumn1,Column2,... from sqlInput
sqlInput = sqlInput.Substring(indexCloseBracket, sqlInput.Length - indexCloseBracket);
indexOpenBracket = sqlInput.IndexOf('(');
// Remove VALUES from sqlInput
sqlInput = sqlInput.Substring(indexOpenBracket, sqlInput.Length - indexOpenBracket);
//UPDATED the next line from IndexOf to LastIndex of.
indexCloseBracket = sqlInput.LastIndexOf(')');
// Get values to insert from sqlInput
string tmpValues = sqlInput.Substring(1, indexCloseBracket - 1);
// Split to get all values
List<string> values = tmpValues.Split(',').ToList();
// remove the columns and values that are no longer needed
foreach (string columnToRemove in columnssToRemove)
{
int indexToRemove = columns.IndexOf(columnToRemove);
columns.RemoveAt(indexToRemove);
values.RemoveAt(indexToRemove);
}
// insert the columns and values into the sqlOutput
sqlOutput = string.Format(sqlOutput, string.Join(", ", columns.ToArray()), string.Join(", ", values.ToArray()));
return sqlOutput;
}
}
}