2016-07-04 368 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

相关问题