2016-07-04 170 views
2

我在Excel VBA中運行一些代碼,它查詢數據庫,然後將數據帶入Excel進行格式化。運行時錯誤:爲datepart指定的參數1無效 - SQL

它工作得很好,上次我跑了(老慄),但今天我來運行月度報告,它是扔了一個日期部分誤差

Invalid parameter 1 specified for datepart

下面是代碼:

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中不起作用。它會彈出要求輸入值 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; 
+0

發佈完整的錯誤.. –

+2

你有'DatePart(「&」'm'「&」,[DATE_CREATED])),它會給你'DatePart('m',[DATE_CREATED])'。根據錯誤消息,我猜你正在使用SQL Server,而在SQL Server中,''m''不是'DATEPART'的有效參數,你可能需要'DATEPART(MONTH,[DATE_CREATED])'(My因爲sql語句在Access中工作正常,所以這很讓人困惑,因爲它是迄今爲止最清晰的),或者DATEPART(M,[DATE_CREATED])或DATEPART(MM,[DATE_CREATED])' – GarethD

回答

2

從根本上說,你是使用相同的命名功能DatePart根據不同的參數混亂的SQL方言。根據Excel應用程序的體系結構層,您需要根據所使用的SQL方言調整DatePart函數:ACE/Jet SQL或SQL Server TSQL。

  • Excel中 - >連接 - > SQL服務器(鏈接表)

    如果Excel連接到Access數據庫和這個Access數據庫使用 SQL Server鏈接表(Access對象),那麼您必須遵守ACE/Jet SQL 方言,該方言要求第一個參數爲 DatePart 爲包含在雙倍或單個的字符串文字 「 ES作爲@Arulkumar顯示了答案:

    DatePart('m', [DATE_CREATED]) 
    
  • 的Excel - > SQL服務器(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服務器(直通)

    如果Excel連接到Access數據庫調用一個Access傳遞查詢(不鏈接表),這傳遞查詢(腳本化並保存在Access數據庫中)通過ODBC/OLEDB連接到SQL Server,然後您必須遵守SQL Server TSQL方言,如上所述。

從你的表的命名,我相信你所連接的SQL Server的對象預選賽保持架構加上表加場用句點分隔與MSSQL鏈接表訪問:

dbo.COMPANY.COMPANY_NAME 

當掛訪問時,表名中的多個句點是不允許的,所以默認情況下用下劃線替換:

dbo_COMPANY.COMPANY_NAME 

無效的對象錯誤是指Access lin ked表在Access數據庫中不存在或連接的SQL Server數據庫中不存在該表。

+0

嗨,感謝您的信息。我已經根據Excel>訪問鏈接表> SQL數據庫嘗試了您的建議,這是如何設置的。如果我更改日期部分並用dbo替換dbo_。 ,excel/vba現在不提供任何錯誤,但記錄集不返回任何數據並且沒有錯誤。如果我將StrQuery字符串輸出到單元格中,然後複製到Access中,它告訴我存在連接錯誤並突出顯示第一個dbo。我只是不明白這一點,因爲它在幾周前運行時運行良好,沒有錯誤,並帶來了良好的數據。 – MHarkess

+0

因此,在Excel中,您正在與MS Access建立ODBC連接?如果是這樣,你爲什麼要重新命名錶格?如前所述,Access不允許在表名中使用句點,因此當鏈接表被設置時,使用下劃線替換它。請發佈完整的Excel VBA代碼以查看連接。從Access到SQL Server源的連接字符串中的小改動可能是導致這些新錯誤的原因。 – Parfait

2

簡單地用下面的查詢嘗試

SELECT DATEPART('m', GETDATE()) 

返回

Invalid parameter 1 specified for datepart.

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; 
+0

Thankyou 。 – MHarkess

+0

現在顯示另一個錯誤:INVALID OBJECT NAME DBO_COMPANY。再次,這是奇怪的,因爲我編輯的SQL語句在Access中工作得很好。 – MHarkess

+0

嗨,對不起,如果我複製到Access,這是行不通的。它爲m輸入參數值。但是,如果我重新添加引號查詢按預期工作。 – MHarkess

相關問題