C# 从SELECT语句生成CREATETABLE脚本
问题在于: 在SQL Server中,我有一个SELECT语句,它可以采用以下任何形式C# 从SELECT语句生成CREATETABLE脚本,c#,sql-server,tsql,C#,Sql Server,Tsql,问题在于: 在SQL Server中,我有一个SELECT语句,它可以采用以下任何形式 SELECT ID,Name FROM Table1; 或 或 或者任何可能非常复杂的sql语句,我需要生成CREATETABLE语句,该语句创建一个表,该表的结构可以保存SELECT语句返回的结果集的数据 代码可以是C或T-SQL 编辑: SELECT语句是传递给我的应用程序的参数。SELECT语句通常返回数百万条记录,这些记录将从一台服务器传输到另一台服务器,因此我需要在将数据传输到的目标服务器上执行C
SELECT ID,Name
FROM Table1;
或
或
或者任何可能非常复杂的sql语句,我需要生成CREATETABLE语句,该语句创建一个表,该表的结构可以保存SELECT语句返回的结果集的数据
代码可以是C或T-SQL
编辑:
SELECT语句是传递给我的应用程序的参数。SELECT语句通常返回数百万条记录,这些记录将从一台服务器传输到另一台服务器,因此我需要在将数据传输到的目标服务器上执行CREATE TABLE脚本。我认为您需要或
编辑:是的,看来我对这个问题的理解有误。但也许我能帮你?波尔说
SELECT INTO可用于将多个表或视图中的数据合并到一个表中。它还可用于创建包含从链接服务器中选择的数据的新表。
新表的结构由“选择”列表中表达式的属性定义
以下是我从对我的问题的评论中得到的启发,非常感谢大家:
class Program
{
static void Main(string[] args)
{
using (SqlConnection con = new SqlConnection("server=myserver;database=mydb;user id=sa;password=mypassword;"))
{
Console.WriteLine(GetCreateTableFromSqlCode(@"
SELECT ID,Eid,Keyword AS Keywords,KeywordType AS Sources,Year
FROM Eid_Keywords
WHERE Eid IN(SELECT Eid FROM ReviewersPublications)","Keywords",con));
}
}
public static string GetCreateTableFromSqlCode(string sqlSelect,string tableName, SqlConnection con)
{
SqlCommand cmd = new SqlCommand(string.Format("SET FMTONLY ON;\r\n{0}\r\nSET FMTONLY OFF;",sqlSelect), con);
try
{
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
DataTable dt = reader.GetSchemaTable();
reader.Close();
return GetCreateTableScript(dt, tableName);
}
finally
{
if (con.State == ConnectionState.Open)
con.Close();
}
}
private static string GetCreateTableScript(DataTable dt,string tableName)
{
string snip = string.Empty;
StringBuilder sql = new StringBuilder();
sql.AppendFormat("CREATE TABLE {0}\r\n(\r\n",tableName);
for (int i = 0; i < dt.Rows.Count;i++)
{
DataRow dr = dt.Rows[i];
snip = GetColumnSql(dr);
sql.AppendFormat((i < dt.Rows.Count - 1) ? snip : snip.TrimEnd(',','\r','\n'));
}
sql.AppendFormat("\r\n)");
return sql.ToString();
}
private static string GetColumnSql(DataRow dr)
{
StringBuilder sql = new StringBuilder();
sql.AppendFormat("\t[{0}] {1}{2} {3} {4},\r\n",
dr["ColumnName"].ToString(),
dr["DataTypeName"].ToString(),
(HasSize(dr["DataTypeName"].ToString())) ? "(" + dr["ColumnSize"].ToString() + ")" : (HasPrecisionAndScale(dr["DataTypeName"].ToString())) ? "(" + dr["NumericPrecision"].ToString() + "," + dr["NumericScale"].ToString() + ")" : "",
(dr["IsIdentity"].ToString() == "true") ? "IDENTITY" : "",
(dr["AllowDBNull"].ToString() == "true") ? "NULL" : "NOT NULL");
return sql.ToString();
}
private static bool HasSize(string dataType)
{
Dictionary<string, bool> dataTypes = new Dictionary<string, bool>();
dataTypes.Add("bigint", false);
dataTypes.Add("binary", true);
dataTypes.Add("bit", false);
dataTypes.Add("char", true);
dataTypes.Add("date", false);
dataTypes.Add("datetime", false);
dataTypes.Add("datetime2", false);
dataTypes.Add("datetimeoffset", false);
dataTypes.Add("decimal", false);
dataTypes.Add("float", false);
dataTypes.Add("geography", false);
dataTypes.Add("geometry", false);
dataTypes.Add("hierarchyid", false);
dataTypes.Add("image", true);
dataTypes.Add("int", false);
dataTypes.Add("money", false);
dataTypes.Add("nchar", true);
dataTypes.Add("ntext", true);
dataTypes.Add("numeric", false);
dataTypes.Add("nvarchar", true);
dataTypes.Add("real", false);
dataTypes.Add("smalldatetime", false);
dataTypes.Add("smallint", false);
dataTypes.Add("smallmoney", false);
dataTypes.Add("sql_variant", false);
dataTypes.Add("sysname", false);
dataTypes.Add("text", true);
dataTypes.Add("time", false);
dataTypes.Add("timestamp", false);
dataTypes.Add("tinyint", false);
dataTypes.Add("uniqueidentifier", false);
dataTypes.Add("varbinary", true);
dataTypes.Add("varchar", true);
dataTypes.Add("xml", false);
if (dataTypes.ContainsKey(dataType))
return dataTypes[dataType];
return false;
}
private static bool HasPrecisionAndScale(string dataType)
{
Dictionary<string, bool> dataTypes = new Dictionary<string, bool>();
dataTypes.Add("bigint", false);
dataTypes.Add("binary", false);
dataTypes.Add("bit", false);
dataTypes.Add("char", false);
dataTypes.Add("date", false);
dataTypes.Add("datetime", false);
dataTypes.Add("datetime2", false);
dataTypes.Add("datetimeoffset", false);
dataTypes.Add("decimal", true);
dataTypes.Add("float", true);
dataTypes.Add("geography", false);
dataTypes.Add("geometry", false);
dataTypes.Add("hierarchyid", false);
dataTypes.Add("image", false);
dataTypes.Add("int", false);
dataTypes.Add("money", false);
dataTypes.Add("nchar", false);
dataTypes.Add("ntext", false);
dataTypes.Add("numeric", false);
dataTypes.Add("nvarchar", false);
dataTypes.Add("real", true);
dataTypes.Add("smalldatetime", false);
dataTypes.Add("smallint", false);
dataTypes.Add("smallmoney", false);
dataTypes.Add("sql_variant", false);
dataTypes.Add("sysname", false);
dataTypes.Add("text", false);
dataTypes.Add("time", false);
dataTypes.Add("timestamp", false);
dataTypes.Add("tinyint", false);
dataTypes.Add("uniqueidentifier", false);
dataTypes.Add("varbinary", false);
dataTypes.Add("varchar", false);
dataTypes.Add("xml", false);
if (dataTypes.ContainsKey(dataType))
return dataTypes[dataType];
return false;
}
}
-1就我所见,这两种结构都无助于实现既定目标。对于表变量,您需要首先了解列,定义CTE并不能解决所述问题。问题在于我前面提到的性能、链接服务器的存在以及在复杂查询(如前面提到的或类似SELECT)中添加“INTO tableName”短语的位置,从表1中选择COUNT,其中Year=2000作为从表1中选择Count2000,从表2中选择ID,其中City='C1';在C中,您可以执行SET FMTONLY ON;但是你的问题不确定如何使用结果。假设它只是发送回一个空的结果集,您可以使用SqlDataReader的GetSchemaTable和SqlBulkCopy来实现这一点。这很乏味,但应该有用。如果你可以链接ServersHanks,那么也可以使用SELECT-INTO。这帮助我快速高效地从远程服务器获取一些SQL创建脚本。我需要一些用于本地调试和原型制作的脚本。不过,我必须在此处更改代码,以使比较使用True而不是True符合事实的dr[IsIdentity].ToString==真?标识:,dr[AllowDBNull].ToString==True?NULL:不为NULL;IsIdentity和AllowDBNull都是bool类型,所以只需使用cast即可。例如:booldr[IsIdentity]?身份:真实与真实的区别可能是由于当地的区域设置。多么公共的服务啊!谢谢你把这些放在一起!
SELECT *
FROM
(
SELECT ID,Name
FROM Tablex
INTERSECT
SELECT ID,Name
FROM Tablex
) AS T
class Program
{
static void Main(string[] args)
{
using (SqlConnection con = new SqlConnection("server=myserver;database=mydb;user id=sa;password=mypassword;"))
{
Console.WriteLine(GetCreateTableFromSqlCode(@"
SELECT ID,Eid,Keyword AS Keywords,KeywordType AS Sources,Year
FROM Eid_Keywords
WHERE Eid IN(SELECT Eid FROM ReviewersPublications)","Keywords",con));
}
}
public static string GetCreateTableFromSqlCode(string sqlSelect,string tableName, SqlConnection con)
{
SqlCommand cmd = new SqlCommand(string.Format("SET FMTONLY ON;\r\n{0}\r\nSET FMTONLY OFF;",sqlSelect), con);
try
{
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
DataTable dt = reader.GetSchemaTable();
reader.Close();
return GetCreateTableScript(dt, tableName);
}
finally
{
if (con.State == ConnectionState.Open)
con.Close();
}
}
private static string GetCreateTableScript(DataTable dt,string tableName)
{
string snip = string.Empty;
StringBuilder sql = new StringBuilder();
sql.AppendFormat("CREATE TABLE {0}\r\n(\r\n",tableName);
for (int i = 0; i < dt.Rows.Count;i++)
{
DataRow dr = dt.Rows[i];
snip = GetColumnSql(dr);
sql.AppendFormat((i < dt.Rows.Count - 1) ? snip : snip.TrimEnd(',','\r','\n'));
}
sql.AppendFormat("\r\n)");
return sql.ToString();
}
private static string GetColumnSql(DataRow dr)
{
StringBuilder sql = new StringBuilder();
sql.AppendFormat("\t[{0}] {1}{2} {3} {4},\r\n",
dr["ColumnName"].ToString(),
dr["DataTypeName"].ToString(),
(HasSize(dr["DataTypeName"].ToString())) ? "(" + dr["ColumnSize"].ToString() + ")" : (HasPrecisionAndScale(dr["DataTypeName"].ToString())) ? "(" + dr["NumericPrecision"].ToString() + "," + dr["NumericScale"].ToString() + ")" : "",
(dr["IsIdentity"].ToString() == "true") ? "IDENTITY" : "",
(dr["AllowDBNull"].ToString() == "true") ? "NULL" : "NOT NULL");
return sql.ToString();
}
private static bool HasSize(string dataType)
{
Dictionary<string, bool> dataTypes = new Dictionary<string, bool>();
dataTypes.Add("bigint", false);
dataTypes.Add("binary", true);
dataTypes.Add("bit", false);
dataTypes.Add("char", true);
dataTypes.Add("date", false);
dataTypes.Add("datetime", false);
dataTypes.Add("datetime2", false);
dataTypes.Add("datetimeoffset", false);
dataTypes.Add("decimal", false);
dataTypes.Add("float", false);
dataTypes.Add("geography", false);
dataTypes.Add("geometry", false);
dataTypes.Add("hierarchyid", false);
dataTypes.Add("image", true);
dataTypes.Add("int", false);
dataTypes.Add("money", false);
dataTypes.Add("nchar", true);
dataTypes.Add("ntext", true);
dataTypes.Add("numeric", false);
dataTypes.Add("nvarchar", true);
dataTypes.Add("real", false);
dataTypes.Add("smalldatetime", false);
dataTypes.Add("smallint", false);
dataTypes.Add("smallmoney", false);
dataTypes.Add("sql_variant", false);
dataTypes.Add("sysname", false);
dataTypes.Add("text", true);
dataTypes.Add("time", false);
dataTypes.Add("timestamp", false);
dataTypes.Add("tinyint", false);
dataTypes.Add("uniqueidentifier", false);
dataTypes.Add("varbinary", true);
dataTypes.Add("varchar", true);
dataTypes.Add("xml", false);
if (dataTypes.ContainsKey(dataType))
return dataTypes[dataType];
return false;
}
private static bool HasPrecisionAndScale(string dataType)
{
Dictionary<string, bool> dataTypes = new Dictionary<string, bool>();
dataTypes.Add("bigint", false);
dataTypes.Add("binary", false);
dataTypes.Add("bit", false);
dataTypes.Add("char", false);
dataTypes.Add("date", false);
dataTypes.Add("datetime", false);
dataTypes.Add("datetime2", false);
dataTypes.Add("datetimeoffset", false);
dataTypes.Add("decimal", true);
dataTypes.Add("float", true);
dataTypes.Add("geography", false);
dataTypes.Add("geometry", false);
dataTypes.Add("hierarchyid", false);
dataTypes.Add("image", false);
dataTypes.Add("int", false);
dataTypes.Add("money", false);
dataTypes.Add("nchar", false);
dataTypes.Add("ntext", false);
dataTypes.Add("numeric", false);
dataTypes.Add("nvarchar", false);
dataTypes.Add("real", true);
dataTypes.Add("smalldatetime", false);
dataTypes.Add("smallint", false);
dataTypes.Add("smallmoney", false);
dataTypes.Add("sql_variant", false);
dataTypes.Add("sysname", false);
dataTypes.Add("text", false);
dataTypes.Add("time", false);
dataTypes.Add("timestamp", false);
dataTypes.Add("tinyint", false);
dataTypes.Add("uniqueidentifier", false);
dataTypes.Add("varbinary", false);
dataTypes.Add("varchar", false);
dataTypes.Add("xml", false);
if (dataTypes.ContainsKey(dataType))
return dataTypes[dataType];
return false;
}
}