SQL盲查询:将未知的date时间转换为VARCHAR

我正在处理一个C#项目,它有一个方法,查询许多表格,并将其输出为Excel工作表。 这些表格的表名被存储在一个数组中,因此命令文本是以编程的方式构build的,

string query = string.empty; foreach (string tbl in tables) { query = $"SELECT * FROM {tbl} WHERE DATEFROM BETWEEN @from AND @to"; // DATEFROM field is guaranteed to exist // run the SQLCommand here // eg I fill a ds (as DataSet object) with the query result } 

这个代码没有错误,但是一旦我使用这么方便的方法将DataTable / Dataset导出到Excel中

 xmlMap = myWorkbook.XmlMaps.Add(ds.GetXmlSchema(), "Export"); myWorkbook.XmlImportXml(ds.GetXml(), out xmlMap, true, xlWsht.Range["A1"]); 

。 。 。 我有时会得到一个Excel应用程序实例错误,说“有些信息导出为文本”。 我不介意 然而,我的客户正在生气,因为这个错误对话框不抓住焦点,并让用户不知道它的存在,在他们的桌面上打开的一堆窗口下面,更不用说它正在等待用户的用户响应点击确定。

经过几次实验,

 // CONVERT(varchar, A_DATE_FIELD, 120) 

解决了这个问题(避免这个错误消息popup)。 但是,由于每个表中的表的数量和许多不同的date时间字段,对所有SELECT CONVERT(varchar,A_DATE_FIELD,120)查询进行硬编码是不切实际的(至less在我的情况下)。

你的解决scheme是什么?

先谢谢你。

那么查询给定表中的所有列并从中构build查询,而不是“SELECT *”呢? 对不起,我对SQL Server不是很熟悉,但在Oracle中,您可以查询dba_tab_cols来获取表和每列的数据types的所有列。 在构build查询string的同时,如果列是DATE,则将转换生成到您的SELECT中。

通过查询信息模式解决了这个问题

 public static string GenerateSafeSelectAllQueryString(string tableName, SQLDateConversionStyle dateConvertType) { var retval = new StringBuilder(); using (SqlConnection con = new SqlConnection(PSQLServerUtilities.ConnectionStringStatic)) { string query = "SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=@tableName ORDER BY ORDINAL_POSITION ASC;"; try { con.Open(); using (SqlCommand com = new SqlCommand(query, con)) { com.Parameters.AddWithValue("tableName", tableName); using (SqlDataReader reader = com.ExecuteReader()) { if (reader.HasRows) { using (DataTable dt = new DataTable(tableName)) { dt.Load(reader); foreach (DataRow row in dt.Rows) { retval.Append((row[1].ToString() == "datetime") ? $"CONVERT(varchar, {row[0].ToString()}, {(int)dateConvertType}) AS '{row[0].ToString()}', " : $"{row[0].ToString()}, "); } retval.Length -= 2; } } } } } catch (Exception ex) { throw ex; } finally { con.Close(); GC.Collect(); GC.WaitForPendingFinalizers(); } } return retval.ToString(); } /// <summary> /// Different types of converting SQL DateTime to varchar /// Source: https://www.w3schools.com/sql/func_sqlserver_convert.asp /// </summary> public enum SQLDateConversionStyle { /// <summary> /// Format: mon dd yyyy hh:miAM/PM /// </summary> Default = 100, /// <summary> /// Format: mm/dd/yyyy /// </summary> US = 101, /// <summary> /// Format: hh:mm:ss /// </summary> HoursOnly = 108, /// <summary> /// Format: yyyy/mm/dd /// </summary> Japan = 111, /// <summary> /// Format: yyyy-mm-dd hh:mi:ss /// </summary> ODBCCanonical = 120, /// <summary> /// Format: yyyy-mm-dd hh:mi:ss.mmm /// </summary> ODBCCanonicalMillis, /// <summary> /// Format: yyyy-mm-ddThh:mi:ss.mmmZ /// </summary> ISO8601 = 127 }