【问题标题】:Call SQL stored procedure from Access从 Access 调用 SQL 存储过程
【发布时间】:2013-08-13 11:30:15
【问题描述】:

我有一个 SQL Server 存储过程 (dbo.WiegenMain),如下所示:

ALTER PROCEDURE [dbo].[WiegenMain]
AS 
BEGIN

    insert into dbo.wiegen (Tag, Aufträge_anzahl, Wiegeraum) 
      select 
         dbo.datepart2(BUCHUNG_BIS) as Tag, 
         count(distinct AUFTRAGSNUMMER), Kurztext as Wiegeraum 
      from 
         dbo.tblZEITERFASSUNG 
      inner join 
         dbo.tblBELEGUNGSEINHEIT on  tblZEITERFASSUNG.ID_BELEGUNGSEINHEIT = tblBELEGUNGSEINHEIT.ID 
      where 
         ID_BUCHUNGSART = 9 
         and ID_BELEGUNGSEINHEIT IN
             (SELECT ID_BELEGUNGSEINHEIT 
              FROM dbo.tblPROZESS_BELEGUNGSEINHEIT  
              WHERE ID_PROZESS = 3)
         and ABSCHLUSS = 1 
         AND dbo.DatePart2(BUCHUNG_BIS) = dbo.DatePart2(getdate())
     group by 
         dbo.DatePart2(BUCHUNG_BIS), Kurztext 
END

我想使用 VBA 在 Microsoft Access 中调用这个存储过程,我尝试了以下方法:

第一次尝试:

Function InsertWiegen()

Dim conn As ADODB.Connection
Dim rcs As ADODB.Recordset
Dim strSQL As String
Dim strDel As String

Set conn = CurrentProject.Connection
strDel = "DELETE dbo.wiegen WHERE Tag = '" & Date & "'"
strSQL = "INSERT INTO dbo.wiegen ([Tag], [Aufträge_anzahl], [Wiegeraum]) " & _
         "SELECT dbo.DatePart2([BUCHUNG_BIS]) as [Tag], count(distinct [AUFTRAGSNUMMER]) as [Aufträge_anzahl], Kurztext as [Wiegeraum] from dbo.tblZEITERFASSUNG inner join dbo.tblBELEGUNGSEINHEIT on tblZEITERFASSUNG.ID_BELEGUNGSEINHEIT=tblBELEGUNGSEINHEIT.ID where ID_BUCHUNGSART=9 and ID_BELEGUNGSEINHEIT in (SELECT ID_BELEGUNGSEINHEIT FROM dbo.tblPROZESS_BELEGUNGSEINHEIT WHERE ID_PROZESS = 3) and [ABSCHLUSS]=1 AND dbo.DatePart2([BUCHUNG_BIS])= dbo.DatePart2('" & Date & "') group by dbo.DatePart2([BUCHUNG_BIS]), [Kurztext]"

Set rcs = conn.Execute(strDel)

conn.Execute (strSQL)

Set rcs = Nothing

conn.Close

Exit Function

End Function

第二次尝试:

Function InsertWiegen()

Dim conn As ADODB.Connection
Dim rcs As ADODB.Recordset
Dim cmd As ADODB.Command
Dim strSQL As String
Dim strDel As String

Set conn = CurrentProject.Connection
'Set cmd.ActiveConnection = CurrentProject.Connection
Set cmd = New ADODB.Command
cmd.ActiveConnection = conn
cmd.CommandText = "WiegenMain"
cmd.CommandType = adCmdStoredProc

strDel = "DELETE dbo.wiegen WHERE Tag = '" & Date & "'"

Set rcs = conn.Execute(strDel)
cmd.Execute

Set rcs = Nothing
Set cmd = Nothing

conn.Close

Exit Function

End Function

dbo.datepart2() 函数:

ALTER function [dbo].[DatePart2] (@date datetime)
returns datetime
as 
begin

return(cast(CONVERT(varchar(12), @date, 101) AS datetime))
end

问题:两种方法都报错 -

'将 char 数据类型转换为 datetime 数据类型导致 超出范围的日期时间值。'

存储过程在 SQL Server Management Studio 中运行良好,但在 Microsoft Access 中出现错误。 strDel 工作正常,它成功地从数据库表中删除了记录,问题出在 strSQL 查询上。如果有人能找出导致问题的原因,我将不胜感激..

【问题讨论】:

  • 这里不是问题,但是在第一次尝试中,您的 SELECT 语句中有一个额外的双引号,就在 GROUP BY 语句之前。我认为需要删除括号之前的双引号。
  • 谢谢,我删除了这些,但仍然有同样的问题..
  • BUCHUNG_BIS 是日期时间数据类型吗?
  • 是的,它的日期时间数据类型字段
  • 您有 BUCHUNG_BIS 字段中的样本吗?您的 datepart2 函数适用于 GetDate()

标签: sql-server ms-access vba


【解决方案1】:

您插入到 SQL 语句中的日期文本将取决于您的国际设置。尝试将其转换为 'YYYY-MM-DD',如下所示:-

strDel = "DELETE dbo.wiegen WHERE Tag = '" & format (Date, "YYYY-MM-DD") & "'"

【讨论】:

  • 但是 strDel 工作正常,它成功地从表中删除了记录,问题出在 strSQL 语句上。谢谢:)
  • 你的 datepart1 函数在哪里?您在 SQL 查询中使用它,但上面有 datepart2 函数。
  • datepart1 的返回类型为 varchar,其余相同,我在 Access 中尝试使用 datepart2,但仍然有相同的错误
【解决方案2】:

SQL中的Tag是什么数据类型?

如果是数字则

strDel = "DELETE dbo.wiegen WHERE Tag = " & 格式(日期,"DD")

【讨论】:

  • 标签在 SQL 中是 datetime 数据类型
【解决方案3】:

用另一种方式解决了问题:

strSQL = "INSERT INTO dbo.wiegen ([Tag], [Aufträge_anzahl], [Wiegeraum]) 
SELECT left([BUCHUNG_BIS],11) as [Tag], count(distinct [AUFTRAGSNUMMER]) as [Aufträge_anzahl], Kurztext as [Wiegeraum] 
from dbo.tblZEITERFASSUNG 
inner join
dbo.tblBELEGUNGSEINHEIT on tblZEITERFASSUNG.ID_BELEGUNGSEINHEIT=tblBELEGUNGSEINHEIT.ID 
where ID_BUCHUNGSART=9 and ID_BELEGUNGSEINHEIT 
in 
(SELECT ID_BELEGUNGSEINHEIT FROM dbo.tblPROZESS_BELEGUNGSEINHEIT WHERE ID_PROZESS = 3)
and [ABSCHLUSS]=1 AND left([BUCHUNG_BIS],11)= left(GETDATE(), 11) 
group by left([BUCHUNG_BIS],11), [Kurztext]"

用 left() 函数替换了我的 datepart2 函数,现在它可以成功执行,没有任何错误。

【讨论】:

    猜你喜欢
    • 2013-09-18
    • 2018-07-18
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2012-02-10
    • 2019-05-11
    相关资源
    最近更新 更多