我在 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/