【发布时间】: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