2015-03-19 44 views
0

计算字符串我有一个结果集,其中我要像 创建列名“过去一周(3月12日至3月18日)”列名作为MySQL的

首先,我曾尝试简单的查询

SELECT COUNT(*) AS CONCAT('LastWeek (', DATE_FORMAT(DATE_SUB(DATE(NOW()), INTERVAL 7 DAY),'%D %M'),' - ',DATE_FORMAT(DATE_SUB(DATE(NOW()), INTERVAL 1 DAY),'%D %M'),')') From Mytable 

但它失败 然后我试图简单SP

DELIMITER $$ 

USE `mydb`$$ 

DROP PROCEDURE IF EXISTS `test`$$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `test`( 
    ) 
BEGIN 
    DECLARE lv_Duration VARCHAR(100);  
     SET @lv_Duration = CONCAT('LastWeek (', DATE_FORMAT(DATE_SUB(DATE(NOW()), INTERVAL 7 DAY),'%D %M'),' - ',DATE_FORMAT(DATE_SUB(DATE(NOW()), INTERVAL 1 DAY),'%D %M'),')'); 
    SELECT 'test' AS @lv_Duration; 
END$$ 

DELIMITER ; 

,但它也将失败。请让我知道,如果一些这怎么可能还是不 后来我通过通用的C#方法

private string GetStoredProcedureWiseCustomResult(DataTable dt) 
     { 
      var str = new StringBuilder(); 
      foreach (DataColumn column in dt.Columns) 
      { 
       str.Append(String.Format("[{0}] {1}", column.ColumnName, "\t\t")); 
      } 
      str.Append(Environment.NewLine); 
      foreach (DataRow dr in dt.Rows) 
      { 
       foreach (DataColumn column in dt.Columns) 
       { 
        str.Append(String.Format("[{0}] {1}", dr[column.ColumnName], "\t\t")); 
       } 
       str.Append(Environment.NewLine); 
      } 
      return str.ToString(); 
     } 
+3

你不能这样做,字段名称不是字符串,不能作为字符串操纵。你需要做的是每次创建一个全新的SQL语句。请参阅“动态SQL”。或者,更好的是,只需将其称为LastWeek,然后在呈现层中将其呈现为不同的东西。它看起来像你试图将你的SQL直接耦合到你的演示文稿,这是一个很大的禁忌。 – MatBailie 2015-03-19 11:28:49

+0

感谢MatBailie。我也提出了后面的建议,但我的解决方案是一个通用的解决方案,我们配置存储过程和列名称,并且它的数据在没有任何存储过程明智处理的情况下输出。 – 2015-03-19 11:35:09

+0

这是一个非常奇怪的任务*。数据访问层应该几乎总是知道,*预先*,每一列出现在结果集中的名称 - 毕竟,它将如何访问和使用它们?如果这些名称是在数据访问层*内动态生成的(例如,它组装SQL),则足够公平:它可以保留其对这些分配的别名的知识,以便返回结果集时使用。但是,如你在尝试做的那样,在较低的层次上生成名称,比如在RDBMS本身中,却充满了困难。 – eggyal 2015-03-19 11:35:30

回答

0

您可以动态创建查询,你可以指定你列计算的名称使用我的结果集。例如,

string query =“SELECT COUNT(*)AS'LastWeek(”+ FirstDate +“,”+ SecondDate +“)'”+ “From Mytable”;

现在将此查询传递给存储过程以获取输出。

OR

使用下面的查询,你会得到的列名,按您的需要。您可以更新转换函数使用获取名称根据您的需要。

DECLARE @str1 NVARCHAR(MAX) 

SET @str1 = 'SELECT COUNT(*) AS ''LastWeek ('+ CONVERT(VARCHAR(20),DATEADD(DD,-7,GetDate()),110) + ', ' + CONVERT(VARCHAR(20),GetDate(),110) + ')'' FROM MyTable' 

exec(@str1) 

Hoper this help!

+0

动态sql不适合我 – 2015-03-19 15:39:04