計算字符串我有一個結果集,其中我要像 創建列名「過去一週(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