【问题标题】:Prepared Statement in mysql through excel VBA通过excel VBA在mysql中准备语句
【发布时间】:2017-08-21 12:05:47
【问题描述】:

我在 Mysql 中处理了一个准备好的语句,它根据当前日期动态创建周列。当我在 Toad for Mysql 中运行查询时,它可以无缝运行,当我尝试将查询转换为 VBA 中的字符串时,我在运行查询时遇到了巨大的问题......我收到一条错误消息,指出我有问题使用 sql 附近的语法。尽管字符串看起来很好,但在 sql 的每个部分都会创建错误。我用 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 来解决这个问题,如果有人有任何想法,将不胜感激!!我花了很长时间在网上寻找答案,但未能找到任何解决此问题的方法。提前致谢!

【问题讨论】:

  • 我不详细了解MySql,但我几乎可以肯定你的问题是SQL不是一个单一的SQL-Select语句而是一个包含多个语句的脚本。

标签: mysql vba prepared-statement string-concatenation


【解决方案1】:

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

【讨论】:

  • 是的,这就是我最终所做的。它只是在 VBA 中创建列标题,然后将它们添加到带有可变日期输入的 sql 字符串中。比尝试使用准备好的语句要容易得多。感谢您的回复,我花了很长时间才看到它!
猜你喜欢
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 2011-09-16
相关资源
最近更新 更多