计算字符串我有一个结果集,其中我要像 创建列名“过去一周(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();
}
你不能这样做,字段名称不是字符串,不能作为字符串操纵。你需要做的是每次创建一个全新的SQL语句。请参阅“动态SQL”。或者,更好的是,只需将其称为LastWeek,然后在呈现层中将其呈现为不同的东西。它看起来像你试图将你的SQL直接耦合到你的演示文稿,这是一个很大的禁忌。 – MatBailie 2015-03-19 11:28:49
感谢MatBailie。我也提出了后面的建议,但我的解决方案是一个通用的解决方案,我们配置存储过程和列名称,并且它的数据在没有任何存储过程明智处理的情况下输出。 – 2015-03-19 11:35:09
这是一个非常奇怪的任务*。数据访问层应该几乎总是知道,*预先*,每一列出现在结果集中的名称 - 毕竟,它将如何访问和使用它们?如果这些名称是在数据访问层*内动态生成的(例如,它组装SQL),则足够公平:它可以保留其对这些分配的别名的知识,以便返回结果集时使用。但是,如你在尝试做的那样,在较低的层次上生成名称,比如在RDBMS本身中,却充满了困难。 – eggyal 2015-03-19 11:35:30