मैं एक क्वेरी को निष्पादित करने और उसके परिणामों को एक csv फ़ाइल में निर्यात करने का प्रयास कर रहा हूँ जिसका फ़ाइल नाम में एक स्वरूपित current_timestamp है।

  • क्वेरी स्वयं (INTO OUTFILE और उसके बाद से छोड़कर) ठीक निष्पादित होती है।
  • अगर मैं INTO OUTFILE को एक साधारण स्ट्रिंग पास करता हूं तो यह सीएसवी को निर्यात करता है यानी INTO OUTFILE 'C:\path\to\file.csv' बनाना।
  • अगर मैं किसी अन्य क्वेरी विंडो में SELECT CONCAT(..) फ़ंक्शन और उसके पैरामीटर निष्पादित करता हूं, तो मुझे एक सकारात्मक दिखने वाली स्ट्रिंग वापस मिलती है, इसलिए मुझे पता है कि कॉन्सैट फ़ंक्शन ठीक है, यह C:\ProgramData\MySQL\MySQL Server 5.6\Uploads\2020-10-20_043918.csv उत्पन्न करता है।

मुझे लगता है कि INTO OUTFILE नाराज़गी से एक साधारण स्ट्रिंग के अलावा और कुछ भी उम्मीद नहीं करता है, उम्मीद है कि मैं गलत हूँ। क्या किसी के पास इसकी कोई अंतर्दृष्टि है?

SELECT
    COUNT(*) AS AgentCount,
    clients.ClientId,
    clients.Name AS ClientName,
    computers.RouterAddress
FROM
    computers
LEFT JOIN 
    clients
ON
    computers.ClientId = clients.ClientId
GROUP BY
    computers.RouterAddress
ORDER BY
    AgentCount DESC 
INTO OUTFILE 
    CONCAT('C:\\ProgramData\\MySQL\\MySQL Server 5.6\\Uploads\\', DATE_FORMAT(CURRENT_TIMESTAMP, '%Y-%m-%d_%H%i%s'), '.csv')
FIELDS TERMINATED BY 
    ','
ENCLOSED BY 
    '"'
LINES TERMINATED BY 
    '\r\n'
0
codaamok 20 अक्टूबर 2020, 12:02

1 उत्तर

सबसे बढ़िया उत्तर

जैसा कि आप पता लगा रहे हैं, select ... into outfile चरों का समर्थन नहीं करता है। आप जो मांगते हैं उसे गतिशील एसक्यूएल की आवश्यकता होती है:

SET @sql = CONCAT_WS('\r\n',
    'SELECT',
    '   COUNT(*) AS AgentCount,',
    '   clients.ClientId,',
    '   clients.Name AS ClientName,',
    '   computers.RouterAddress',
    'FROM',
    '   computers',
    'LEFT JOIN',
    '   clients',
    'ON',
    '   computers.ClientId = clients.ClientId',
    'GROUP BY',
    '   computers.RouterAddress',
    'ORDER BY',
    '   AgentCount DESC',
    CONCAT('INTO OUTFILE \'', TRIM(BOTH '\'' FROM QUOTE(@@secure_file_priv)), DATE_FORMAT(CURRENT_TIMESTAMP, '%Y-%m-%d_%H%i%s'), '.csv\''),
    'FIELDS TERMINATED BY \',\'',
    'ENCLOSED BY \'\"\'',
    'LINES TERMINATED BY \'\\r\\n\'');

    PREPARE statement FROM @sql;

    EXECUTE statement;
    DEALLOCATE PREPARE statement;
1
codaamok 21 अक्टूबर 2020, 09:52