【问题标题】:Sql: Incorrect syntax near '(' [closed]Sql:'('附近的语法不正确[关闭]
【发布时间】:2013-06-26 13:28:20
【问题描述】:

我正在尝试将 DataBind 绑定到 GridView 控件,但它始终失败。

给定以下代码(为便于阅读,sql 扩展为多行):

protected void Page_Load(object sender, EventArgs e)
{

string dsn = "foo";
string sql = "SELECT * FROM (SELECT F.Project AS 'Project Number', F.Account AS   
             'Account', F.Pd AS Period, F.Incurred AS Totals, C.Project AS 
             'Project Name' FROM Ultron.Final F INNER JOIN Ultron.Custom  
              C ON F.Project = C.Project WHERE F.Project LIKE '61000.003%' AND 
              F.Account NOT LIKE '%-01' AND F.Fy = YEAR(GetDate()) ) Budget PIVOT 
              (SUM(Totals) FOR Period in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],
              [11],[12]) AS PivotTable";
using (SqlConnection conn = new SqlConnection(dsn))
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
    conn.Open();
    SqlDataReader reader = cmd.ExecuteReader();
    testGrid.DataSource = reader;
    testGrid.DataBind();
}
}    

我确定该错误与查询中的括号有关,但这些是查询正常工作所必需的。在 SSMS 中测试时,查询通过没有问题。

我如何重组它以使代码不会失败?

编辑

我在 SQL 查询的末尾缺少As PivotTable。现在可以了。对不起,这是一个无辜的错字。感谢所有回复的人。

【问题讨论】:

  • 您在BudgetPIVOT 之间缺少一个空格。如果您从代码中删除 SQL,您应该尝试在 SSMS 中执行它,这将有助于您调试问题。
  • 你能把你的硬编码查询变成一个存储过程,然后调用那个 SP 吗?
  • BudgetPIVOT 应该是 Budget PIVOT 吗?或者这只是复制过去的错误?
  • 这就是格式化 SQL 很重要的原因。
  • 您应该始终首先在 sql 编辑器中运行您的查询,以确保它有效。正如其他 OP 所提到的,您有几个语法错误。您也没有显示最初遇到的错误。那会很有帮助的。

标签: c# asp.net sql gridview


【解决方案1】:

缺少空格并关闭)

protected void Page_Load(object sender, EventArgs e)
{

   string dsn = "foo";
   string sql = @"SELECT * FROM 
                  (
                     SELECT F.Project AS 'Project Number', F.Account AS   
                          'Account', F.Pd AS Period, F.Incurred AS Totals, C.Project AS 
                          'Project Name' FROM Ultron.Final F INNER JOIN Ultron.Custom  
                          C ON F.Project = C.Project 
                     WHERE 
                          F.Project LIKE '61000.003%' AND 
                          F.Account NOT LIKE '%-01' AND F.Fy = YEAR(GetDate()) 
                   ) Budget PIVOT 
                   (
                     SUM(Totals) FOR Period in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],
                     [11],[12])
                   )";
   using (SqlConnection conn = new SqlConnection(dsn))
   using (SqlCommand cmd = new SqlCommand(sql, conn))
   {
       conn.Open();
       SqlDataReader reader = cmd.ExecuteReader();
       testGrid.DataSource = reader;
       testGrid.DataBind();
   }
}    

但实际上你应该为这样的东西创建一个存储过程:

CREATE PROCEDURE [GetProjectBudgetInfo]
AS
BEGIN
    SET NOCOUNT ON;

    SELECT * FROM 
                      (
                         SELECT F.Project AS 'Project Number', F.Account AS   
                              'Account', F.Pd AS Period, F.Incurred AS Totals, C.Project AS 
                              'Project Name' FROM Ultron.Final F INNER JOIN Ultron.Custom  
                              C ON F.Project = C.Project 
                         WHERE 
                              F.Project LIKE '61000.003%' AND 
                              F.Account NOT LIKE '%-01' AND F.Fy = YEAR(GetDate()) 
                       ) Budget PIVOT 
                       (
                         SUM(Totals) FOR Period in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])
                       )

END

然后在代码中调用它:

protected void Page_Load(object sender, EventArgs e)
{

   string dsn = "foo";
   string sql = @"GetProjectBudgetInfo";
   using (SqlConnection conn = new SqlConnection(dsn))
   using (SqlCommand cmd = new SqlCommand(sql, conn))
   {
       cmd.CommandType = CommandType.StoredProcedure;
       conn.Open();
       SqlDataReader reader = cmd.ExecuteReader();
       testGrid.DataSource = reader;
       testGrid.DataBind();
   }
}    

【讨论】:

    【解决方案2】:

    如果我数得正确,您的陈述末尾缺少括号。

    string sql = "SELECT * FROM (SELECT F.Project AS 'Project Number', F.Account AS   
                 'Account', F.Pd AS Period, F.Incurred AS Totals, C.Project AS 
                 'Project Name' FROM Ultron.Final F INNER JOIN Ultron.Custom  
                  C ON F.Project = C.Project WHERE F.Project LIKE '61000.003%' AND 
                  F.Account NOT LIKE '%-01' AND F.Fy = YEAR(GetDate()) ) Budget PIVOT 
                  (SUM(Totals) FOR Period in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],
                  [11],[12]))";
    

    【讨论】:

      【解决方案3】:

      您的 sql 查询中缺少最后一个 )。试试这个:

      protected void Page_Load(object sender, EventArgs e)
      {    
          string dsn = "foo";
          string sql = "SELECT * FROM (SELECT F.Project AS 'Project Number', F.Account AS   
                       'Account', F.Pd AS Period, F.Incurred AS Totals, C.Project AS 
                       'Project Name' FROM Ultron.Final F INNER JOIN Ultron.Custom  
                        C ON F.Project = C.Project WHERE F.Project LIKE '61000.003%' AND 
                        F.Account NOT LIKE '%-01' AND F.Fy = YEAR(GetDate()) ) BudgetPIVOT  
                        (SUM(Totals) FOR Period in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],
                        [11],[12]))";
      
          using (SqlConnection conn = new SqlConnection(dsn))
          using (SqlCommand cmd = new SqlCommand(sql, conn))
          {
              conn.Open();
              SqlDataReader reader = cmd.ExecuteReader();
              testGrid.DataSource = reader;
              testGrid.DataBind();
          }
      }    
      

      【讨论】:

        猜你喜欢
        • 2013-07-09
        • 1970-01-01
        • 2013-12-27
        • 1970-01-01
        • 2021-03-22
        • 2020-11-03
        • 2018-10-25
        • 2020-02-07
        • 1970-01-01
        相关资源
        最近更新 更多