2015-03-19 45 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