mysql - 通过excel VBA在mysql中准备语句

标签 mysql vba prepared-statement string-concatenation

我在 Mysql 中编写了一个准备好的语句,它根据当前日期动态创建周列。当我在 Toad for Mysql 中运行查询时,它可以无缝运行,当我尝试将查询转换为 VBA 中的字符串时,我在运行查询时遇到了巨大的问题......我收到一条错误消息,指出我有问题语法接近等与sql。尽管字符串看起来不错,但 SQL 的每个部分都会产生错误。我将 for "与 chr(34) 或 ' 与 chr(39) 进行了替换,但仍然出现 sql 语法错误。我还尝试通过导入下面的代码来避免这些字符串问题,该代码将 .sql 文件导入到没有效果。

    Sub TopAway()
    Dim Cnn As Object
    Dim Rst As Object
    Dim ConnectionString, SqlTextFile, SqlStatement As String
    Set Cnn = CreateObject("ADODB.Connection")
    Set Rst = CreateObject("ADODB.Recordset")

    Application.ScreenUpdating = False

    ThisWorkbook.Sheets("Summary").Range("A2:T3000").ClearContents

    ConnectionString = "Driver={MySQL ODBC 5.3 Unicode Driver};Server =  10.1.1.201; Database = cms; Uid = root; Pwd = something;"

   Cnn.Open ConnectionString
   Cnn.CommandTimeout = 900

   SqlTextFile = "C:\Users\adam\Desktop\WORK FOLDER\Tony Project\Analysis Projects\Away_No_Stock\Dynamic_Away.sql"
   Debug.Print SqlTextFile
   Dim hFile As Long
   hFile = FreeFile
   Open SqlTextFile For Input As #hFile
   SqlStatement = Input$(LOF(hFile), hFile)
   Close #hFile
   Debug.Print SqlStatement

   Rst.Open SqlStatement, Cnn '<-- This is where the code fails

   Sheets("Summary").Range("B3").CopyFromRecordset Rst
   End Sub

SQL代码如下......

    SELECT
    GROUP_CONCAT(DISTINCT
    CONCAT("SUM(IF((part_id IN (265,302,647) OR notes REGEXP ('away|unfit|unavailable|bus away|night')) && WEEKOFYEAR(job_engineerdate) = '", WEEKOFYEAR(job_engineerdate) , "' , 1 ,0)) AS '", WEEKOFYEAR(job_engineerdate), "'")
    )
    INTO @answers
    FROM (
    SELECT DISTINCT (job_engineerdate)
    FROM job j                          
    ORDER BY (job_engineerdate) ASC
    ) A
    WHERE job_engineerdate >= CURDATE() - INTERVAL 112 DAY AND job_engineerdate <= CURDATE();


    SET @query =  CONCAT("SELECT customer_name, garage_name, ", @answers, " 
    FROM (
    SELECT c.customer_name, g.garage_name, j.id, jp.part_id, jn.notes, j.job_engineerdate

    FROM job j 
    INNER JOIN vehicle v ON j.job_vehicleid = v.id 
    INNER JOIN garage g ON v.garage_id = g.id 
    INNER JOIN customer c ON g.customer_id = c.id 
    INNER JOIN fault_type ft ON j.job_fault = ft.id
    INNER JOIN job_parts jp ON j.id = jp.job_id 
    INNER JOIN part p ON p.id = jp.part_id 
    INNER JOIN job_notes jn ON j.id = jn.job_id 
    INNER JOIN users u ON j.job_engineer = u.id         

    WHERE
    c.customer_group IN (13) AND
    j.deleted = 0 
    AND j.job_engineerdate >= CURDATE() - INTERVAL 112 DAY

    GROUP BY
    v.vehicle_fleet_number, v.id, j.id, jp.part_id, jn.id

    ORDER BY customer_name, garage_name
    ) AS T
    GROUP BY customer_name, garage_name
    ORDER BY 18 DESC
    LIMIT 15") 
    ;

    PREPARE stmt FROM @query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

我不知道如何通过Excel来实现这个工作,如果有人有任何想法,我将非常感激!我花了很长时间在网上寻找答案,但未能找到解决此问题的任何方法。提前致谢!

最佳答案

我还解决了此类问题,即如何在 Excel (VBA) 中转换 sql 准备好的语句,最后我在 VBA 中编写了一个例程来构建与准备好的语句构建相同的 sql 语句。 最后,准备好的语句是一个“过程”,将其翻译成 VBA 代码应该没有问题。 希望它对您有所帮助(即使我没有编写与您的案例相关的 VBA 代码)...

关于mysql - 通过excel VBA在mysql中准备语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45796705/

相关文章:

php - 通过 jQuery Ajax 更新 MySQL 语句不起作用

javascript - 使用 highchart 来自 MySQL 的实时数据

javascript - 我如何计算一个月的平均总数

excel - 顺序无关紧要的VBA循环

PHP postgres 准备好的语句无法识别参数

java - SQL 错误或丢失数据库( “?” : syntax error) 附近

php - 一个奇怪的错误解析数据 org.json.JSONException : End of input at character 0 of

vba - 使用在类中创建的函数 - VBA

sql - VBA 和 Oracle SQL : ORA-00907: Missing Right Parenthesis

php - mysqli_fetch_assoc() 发出警告,它需要 mysqli_result,但给出了对象