Access / VBA / SQL 3141错误

时间:2018-01-31 19:29:38

标签: sql-server vba ms-access access-vba

我有一个Access表单绑定到链接的SQL Server表,我正在尝试在访问中创建一个实用程序,从现有记录创建SQL Server数据库中的新记录;那些符合Access表格中三个选项的标准。

我对Access,SQL或VBA不太满意,所以这很酷,但这就是我在VBA中所拥有的:

Dim strSQL As String

strSQL = _
"SELECT *" _
& " INTO #MyTempTable" _
& " FROM ACCTLive1.dbo.BUDGET_ACCESS_Data1" _
& " WHERE Project_ID = '" & Forms!Utilities!comboMoveProjIDPID & "' " _
& " AND [Year] = '" & Forms!Utilities!txtMoveProjIDSourceYear & "' " _
& " UPDATE #MyTempTable" _
& " SET [Year]  = '" & Forms!Utilities!txtMoveProjIDDestYear & "' " _
& " UPDATE #MyTempTable" _
& " SET Total_Amt = (([Total_Amt] * .02)+[Total_Amt])" _
& " INSERT INTO ACCTLive1.dbo.BUDGET_ACCESS_Data1" _
& " SELECT *" _
& " FROM #MyTempTable" _
& " DROP TABLE #MyTempTable"

CurrentDb.Execute strSQL, dbFailOnError

我收到错误:

  

运行时3141错误:SELECT语句包含拼写错误或缺失的保留字或参数名称,或者标点符号不正确。

我从Debug Watch中获取了SQL查询,并从SSMS成功运行了它。

我提前道歉,因为我知道这些3141问题中的大部分是由于错误地方的逗号等等,但是SSMS的查询工作正常的事实让我相信我错过了其他的东西。 / p>

谢谢!

2 个答案:

答案 0 :(得分:2)

将其转换为存储过程将获得许多好处。您的代码更易于管理,您可以将其分为数据层和应用程序层。

您的代码远比它需要的复杂得多。不需要临时表,只需在insert语句中选择所需的数据即可。作为存储过程的这个简化版本看起来像这样。

create procedure BUDGET_ACCESS_Data1_Insert
(
    @ProjectID int
    , @SourceYear int
    , @DestinationYear int
) as begin

    set nocount on;

    INSERT INTO ACCTLive1.dbo.BUDGET_ACCESS_Data1
    (
        Column1
        , Column2
        , Total_Amt
        , [Year]
    )
    SELECT Column1
        , Column2
        , Total_Amt * 1.02 --This is a simplified version. 
        , @DestinationYear
    FROM ACCTLive1.dbo.BUDGET_ACCESS_Data1
    WHERE Project_ID = @ProjectID
        AND [Year] = @SourceYear

end

答案 1 :(得分:1)

您尝试在访问表上执行SELECT INTOUPDATE,另一个UPDATE以及INSERTDROP TABLE。这在Access而不是SQL Server表中执行,因为CurrentDb.Execute针对您的accdb运行而不是您可能已链接的任何内容(请记住,您可以拥有任意数量的链接数据源,因此它不会对您进行任何猜测)。

Access一次只能处理一个语句。 Access也不支持#Temp表。

您可以在SQL Server中使用ADO作为Pass Through查询执行此操作,并且它可以正常工作,但您应该像其他已经建议的答案一样对其进行参数化。有很多方法可以解决这个问题(存储过程,ADO传递查询,QueryDef传递查询)。