[英]Run-time error: Invalid parameter 1 specified for datepart - VBA - SQL
我正在Excel VBA中運行一些代碼,該代碼查詢數據庫,然后將數據導入Excel進行格式化。
上次運行它(那個老栗子)效果很好,但是今天我來運行月度報告,它拋出datepart錯誤,因為
為datepart指定的參數1無效
這是代碼:
StrQuery = "SELECT dbo_MANUFACTURER.COMPANY_NAME AS BRAND, dbo_COMPANY.COMPANY_NAME, dbo_AGENTS.SHORT_DESC AS AGENT, dbo_STOCK_SUB_TYPE.SHORT_DESC AS [STOCK TYPE], Replace(Replace(dbo_COMPANY.CURRENCY_ID,'110','EURO'),'1','GBP') AS [CURRENCY]," & _
"Sum(([Unit_Net]*[QTY_SOLD])-[DELIVERY_TOTAL]) AS [NET TOTAL], dbo_SORDER.DATE_CREATED, dbo_SORDER.SORDER_CODE FROM (((((dbo_COMPANY INNER JOIN dbo_SORDER ON dbo_COMPANY.COMPANY_ID = dbo_SORDER.COMPANY_ID) INNER JOIN " & _
"dbo_SORDER_ITEM ON dbo_SORDER.SORDER_ID = dbo_SORDER_ITEM.SORDER_ID) INNER JOIN dbo_STOCK ON dbo_SORDER_ITEM.STOCK_ID = dbo_STOCK.STOCK_ID) INNER JOIN dbo_STOCK_SUB_TYPE ON dbo_STOCK.SSTYPE_ID = dbo_STOCK_SUB_TYPE.SSTYPE_ID) INNER JOIN " & _
"dbo_AGENTS ON dbo_COMPANY.AGENT_ID = dbo_AGENTS.AGENT_ID) INNER JOIN dbo_MANUFACTURER ON dbo_STOCK.MANUF_ID = dbo_MANUFACTURER.MANUF_ID GROUP BY dbo_MANUFACTURER.COMPANY_NAME, dbo_COMPANY.COMPANY_NAME, dbo_AGENTS.SHORT_DESC, " & _
"dbo_STOCK_SUB_TYPE.SHORT_DESC, dbo_SORDER.DATE_CREATED, dbo_SORDER.SORDER_CODE, dbo_COMPANY.CURRENCY_ID, dbo_STOCK.MANUF_ID HAVING (((dbo_STOCK_SUB_TYPE.SHORT_DESC) <> " & "'EMBROIDERY'" & ") And ((Year([DATE_CREATED]) * 12 + " & _
"DatePart(" & "'m'" & ", [DATE_CREATED])) = Year(Date) * 12 + DatePart(" & "'m'" & ", Date) - 1)) ORDER BY dbo_COMPANY.COMPANY_NAME, dbo_SORDER.DATE_CREATED;"
對於冗長的文字,我們深表歉意。
如前所述,代碼引發錯誤:為日期部分指定了無效的參數1。 我已經嘗試過按照論壇帖子中提到的某人轉換日期,但是沒有成功。
如果有人有什么好主意!
編輯:
在Access中刪除日期部分中m周圍的引號不起作用。 它彈出,要求輸入m的值。我在Access中使用的SQL查詢工作正常,我在下面添加了它:
SELECT
dbo_MANUFACTURER.COMPANY_NAME AS BRAND, dbo_COMPANY.COMPANY_NAME,
dbo_AGENTS.SHORT_DESC AS AGENT, dbo_STOCK_SUB_TYPE.SHORT_DESC AS [STOCK TYPE], Replace(Replace(dbo_COMPANY.CURRENCY_ID,'110','EURO'),'1','GBP') AS [CURRENCY], Sum(([Unit_Net]*[QTY_SOLD])-[DELIVERY_TOTAL]) AS [NET TOTAL], dbo_SORDER.DATE_CREATED, dbo_SORDER.SORDER_CODE
FROM
(((((dbo_COMPANY INNER JOIN dbo_SORDER ON dbo_COMPANY.COMPANY_ID = dbo_SORDER.COMPANY_ID) INNER JOIN dbo_SORDER_ITEM ON dbo_SORDER.SORDER_ID = dbo_SORDER_ITEM.SORDER_ID) INNER JOIN dbo_STOCK ON dbo_SORDER_ITEM.STOCK_ID = dbo_STOCK.STOCK_ID) INNER JOIN dbo_STOCK_SUB_TYPE ON dbo_STOCK.SSTYPE_ID = dbo_STOCK_SUB_TYPE.SSTYPE_ID) INNER JOIN dbo_AGENTS ON dbo_COMPANY.AGENT_ID = dbo_AGENTS.AGENT_ID) INNER JOIN dbo_MANUFACTURER ON dbo_STOCK.MANUF_ID = dbo_MANUFACTURER.MANUF_ID
GROUP BY
dbo_MANUFACTURER.COMPANY_NAME, dbo_COMPANY.COMPANY_NAME, dbo_AGENTS.SHORT_DESC, dbo_STOCK_SUB_TYPE.SHORT_DESC, dbo_SORDER.DATE_CREATED, dbo_SORDER.SORDER_CODE, dbo_COMPANY.CURRENCY_ID, dbo_STOCK.MANUF_ID
HAVING
(((dbo_STOCK_SUB_TYPE.SHORT_DESC)<>"EMBROIDERY") AND ((Year([DATE_CREATED])*12+DatePart(m,[DATE_CREATED]))=Year(Date())*12+DatePart(m,Date())-1))
ORDER BY dbo_COMPANY.COMPANY_NAME, dbo_SORDER.DATE_CREATED;
只需嘗試以下查詢
SELECT DATEPART('m', GETDATE())
返回
為datepart指定的參數1無效。
MSAccess DatePart
,需要在設置周圍加上雙引號。 因此,嘗試使用雙引號而不是單引號可以解決您的問題。
因此,您的工作查詢將是:
SELECT dbo_MANUFACTURER.COMPANY_NAME AS BRAND,
dbo_COMPANY.COMPANY_NAME,
dbo_AGENTS.SHORT_DESC AS AGENT,
dbo_STOCK_SUB_TYPE.SHORT_DESC AS [STOCK TYPE],
Replace(Replace(dbo_COMPANY.CURRENCY_ID,'110','EURO'),'1','GBP') AS [CURRENCY],
Sum(([Unit_Net]*[QTY_SOLD])-[DELIVERY_TOTAL]) AS [NET TOTAL],
dbo_SORDER.DATE_CREATED,
dbo_SORDER.SORDER_CODE
FROM (((((
dbo_COMPANY
INNER JOIN dbo_SORDER ON dbo_COMPANY.COMPANY_ID = dbo_SORDER.COMPANY_ID)
INNER JOIN dbo_SORDER_ITEM ON dbo_SORDER.SORDER_ID = dbo_SORDER_ITEM.SORDER_ID)
INNER JOIN dbo_STOCK ON dbo_SORDER_ITEM.STOCK_ID = dbo_STOCK.STOCK_ID)
INNER JOIN dbo_STOCK_SUB_TYPE ON dbo_STOCK.SSTYPE_ID = dbo_STOCK_SUB_TYPE.SSTYPE_ID)
INNER JOIN dbo_AGENTS ON dbo_COMPANY.AGENT_ID = dbo_AGENTS.AGENT_ID)
INNER JOIN dbo_MANUFACTURER ON dbo_STOCK.MANUF_ID = dbo_MANUFACTURER.MANUF_ID
GROUP BY dbo_MANUFACTURER.COMPANY_NAME,
dbo_COMPANY.COMPANY_NAME,
dbo_AGENTS.SHORT_DESC,
dbo_STOCK_SUB_TYPE.SHORT_DESC,
dbo_SORDER.DATE_CREATED,
dbo_SORDER.SORDER_CODE,
dbo_COMPANY.CURRENCY_ID,
dbo_STOCK.MANUF_ID
HAVING (((dbo_STOCK_SUB_TYPE.SHORT_DESC) <> 'EMBROIDERY')
And ((Year([DATE_CREATED]) * 12
+ DatePart("m", [DATE_CREATED])) = Year(Date) * 12
+ DatePart("m", Date) - 1))
ORDER BY dbo_COMPANY.COMPANY_NAME,
dbo_SORDER.DATE_CREATED;
從根本上講,您混淆了使用相同命名函數DatePart
但參數不同的SQL方言。 根據Excel應用程序的體系結構層,您需要根據所使用的SQL方言調整ACE / Jet SQL或SQL Server TSQL的DatePart
函數。
Excel->訪問-> SQL Server (鏈接表)
如果Excel連接到Access數據庫,並且此Access數據庫使用SQL Server鏈接表(Access對象),則必須遵守ACE / Jet SQL方言,該方言要求DatePart的第一個參數是用雙引號或單引號括起來的字符串文字,例如@ Arulkumar在回答中顯示:
DatePart('m', [DATE_CREATED])
Excel-> SQL Server (ADO)
如果Excel通過VBA中的ADO連接直接連接到SQL Server,則您必須遵守SQL Server TSQL方言,該方言要求DatePart的第一個參數是命名值,而不是@GarethD在注釋中描述的字符串文字:
DatePart(MONTH, [DATE_CREATED]) DatePart(MM, [DATE_CREATED]) DatePart(M, [DATE_CREATED])
Excel->訪問-> SQL Server (直通)
如果Excel連接到調用Access直通查詢(而不是鏈接表)的Access數據庫,並且此直通查詢(腳本化並保存在Access數據庫中)通過ODBC / OLEDB連接到SQL Server,則您必須遵循SQL Server TSQL方言如上所述。
從表的名稱來看,我相信您正在通過MSSQL鏈接表連接到Access,因為SQL Server的對象限定符維護模式加表以及由句點分隔的字段:
dbo.COMPANY.COMPANY_NAME
當鏈接到Access時,表名中不允許使用多個句點,因此默認情況下用下划線代替:
dbo_COMPANY.COMPANY_NAME
無效的對象錯誤意味着Access鏈接表在Access數據庫中不存在,或者該表在連接的SQL Server數據庫中不存在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.