如何使用其他表创建新数据表

时间:2017-06-01 20:29:09

标签: c# sql asp.net database

我想从其他表创建新表并发送电子邮件。但是,它在sda.Fill(dt);

上一直存在错误
  

System.Data.SqlClient.SqlException:'附近的语法不正确('。   关键字'打开'附近的语法不正确。

private DataTable GetData() 
{
    string connString = @"Data Source=aa.database.windows.net;Initial Catalog=aa;Persist Security Info=True;User ID=aa;Password=aa";

    string query = "CREATE TABLE new_table AS(SELECT ID, Employee, Name, Open Date, Task FROM tblEmployees, tblEmployees, Stores, Stores, tblTasks)";
    using (SqlConnection con = new SqlConnection(connString))
    {
        using (SqlCommand comm = new SqlCommand(query))
        {
            using (SqlDataAdapter sda = new SqlDataAdapter())
            {
                comm.Connection = con;
                sda.SelectCommand = comm;
                using (DataTable dt = new DataTable())
                {
                    sda.Fill(dt);
                    return dt;
                }
            }
        }
    }
}

3 个答案:

答案 0 :(得分:0)

您正在引用其中包含空格的列名称。将Open Date更改为[Open Date],您的查询应该有效。

你也缺少一个右括号。

答案 1 :(得分:0)

CREATE TABLE new_table AS (SELECT ...

如果您的新对象完全由另一个表中的SELECT定义,则需要CREATE VIEW,而不是CREATE TABLE。而且应该没有括号。正如@ babak-nafias所说,列名中一定没有空格 - 或者它们应该用引号或[]括号引用。

CREATE VIEW new_view AS SELECT ID, Employee, Name, Open Date, Task FROM tblEmployees, tblEmployees, Stores, Stores, tblTasks;

最后 - 如果您选择所有这些表 - tblEmployee选择了两次! - 没有JOIN关系甚至WHERE条款,您将获得:

  • 大量多个相同的行
  • 歧义错误,当它不知道哪个表从
  • 获取名称时

答案 2 :(得分:0)

错误消息指的是您在查询中使用的正确sql语法。除非有特殊原因,否则您可以删除查询的第一部分并进行以下操作:

string query = "SELECT ID, Employee, Name, [Open Date], Task FROM tblEmployees, tblEmployees, Stores, Stores, tblTasks";

(感谢Babak Naffas在列名中捕获该空间)

这应解决SqlException

另外,DataTable没有实现IDisposable,那你为什么要使用Using语句?您也可以删除Using语句

using (SqlDataAdapter sda = new SqlDataAdapter())
{
    comm.Connection = con;
    sda.SelectCommand = comm;
    DataTable dt = new DataTable();
    sda.Fill(dt);
    return dt;
}