我有一个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>
谢谢!
答案 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 INTO
和UPDATE
,另一个UPDATE
以及INSERT
和DROP TABLE
。这在Access而不是SQL Server表中执行,因为CurrentDb.Execute
针对您的accdb运行而不是您可能已链接的任何内容(请记住,您可以拥有任意数量的链接数据源,因此它不会对您进行任何猜测)。
Access一次只能处理一个语句。 Access也不支持#Temp
表。
您可以在SQL Server中使用ADO作为Pass Through查询执行此操作,并且它可以正常工作,但您应该像其他已经建议的答案一样对其进行参数化。有很多方法可以解决这个问题(存储过程,ADO传递查询,QueryDef传递查询)。