2015-10-06 39 views
0
CREATE PROCEDURE data1 (IN v_dt2 VARCHAR(256) , v_col2 VARCHAR(256),col2 VARCHAR(256)) 
BEGIN 

SELECT dt1 as datep, var1 as vars, 'new' as type 
FROM samp 
UNION all 
SELECT v_dt2, v_col2, 'col2' as type 
FROM samp 
; 

END // 
DELIMITER ; 

CALL data1 ("dt2","var2","old") 

在上面的調用語句這是在括號中列名 但在輸出給參數作爲文本不考慮列名...如何將它們轉換爲UNION ALL後的select語句中的列名稱傳遞列名作爲參數,並調用

+1

請不要使用全大寫的標題,它是分散和惱人的。 – 2015-10-06 10:35:19

+0

簡短的回答是,你不能將用戶變量作爲列名或表名 – e4c5

+1

[mysql變量的字段名稱]可能重複(http://stackoverflow.com/questions/4428761/mysql-field-name-from-variable) – e4c5

回答

1

您的過程正在返回常量值,而不是列名稱。做你想做什麼,你需要使用動態SQL(prepareexec):

CREATE PROCEDURE data1 (IN v_dt2 VARCHAR(256), v_col2 VARCHAR(256), col2 VARCHAR(256)) 
BEGIN 
    set @s = ' 
SELECT dt1 as datep, var1 as vars, ''new'' as type 
FROM samp 
UNION all 
SELECT @v_dt2, @v_col2, ''col2'' as type 
FROM samp '; 

    set @s = replace(@s, '@v_dt2', v_dt2); 
    set @s = replace(@s, '@v_col2', v_col2); 
    set @s = replace(@s, '@col2', col2); 

    prepare s from @s; 
    exec s; 

    deallocate prepare s; 
END // 
DELIMITER ; 
+0

嗨戈登,它的拋出錯誤'新',PLZ幫助我 – suri5913

+0

不要忘記** DEALLOCATE PREPARE s; **在SP –

+0

CALL data1(「dt2」,「var2」,「old」)的末尾,這裏老是一個新變量 – suri5913