最奇怪的事情。我有一个简单的过程,我在Microsoft Access 2010中使用SQL Server 2012后端开发。我现在正尝试将其部署到生产中,即Access 2016和SQL Server 2014后端。
我在新环境中编译,压缩和修复...但是我无法获得Access来执行这个简单的存储过程。更糟糕的是,它仍然可以执行其他几个存储过程...但其中有几个超时而拒绝执行?
这是我的VBA和存储过程:
Private Sub GenerateUnitKey(UnitColumns As String)
Dim Msg, Style, Title, Response As Variant
Dim lngProcessID As Long
Dim Conn As ADODB.Connection
Dim Cmd As ADODB.Command
Dim CurrentConnection As String
CurrentConnection = LinkMasterConnection()
Msg = "Are you sure you want to update the UnitKey with the selected columns?"
Style = vbYesNo + vbCritical + vbDefaultButton2
Title = "Save Campaign?"
Response = MsgBox(Msg, Style, Title)
If Response = vbYes Then
Call OpenSixHatLoader("Generating Unit Key Across Campaign Records", 1, "")
Set Conn = New ADODB.Connection
Conn.Open CurrentConnection
Set Cmd = New ADODB.Command
With Cmd
.ActiveConnection = CurrentConnection
.CommandText = "usp_GenerateUnitKey"
.CommandType = adCmdStoredProc
.CommandTimeout = 30
.Parameters.Append .CreateParameter("@UnitColumns", adVarChar, adParamInput, 4000, UnitColumns)
.Execute
End With
End If
End Sub
存储过程:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[usp_GenerateUnitKey]
@UnitColumns AS VARCHAR(4000)
AS
SET NOCOUNT ON
DECLARE @SQL AS VARCHAR(MAX)
UPDATE tblStagingTable SET UnitKey =''
SET @SQL = 'UPDATE tblStagingTable SET UnitKey = ' + @UnitColumns + ' FROM tblStagingTable st'
EXEC(@SQL)
-- UPDATE Interests to match Staging Table
UPDATE tblInterests SET UnitKey = st.[UnitKey] FROM tblInterests i
INNER JOIN tblStagingTable st ON i.StagingTableID = st.StagingTableID
我相信代码没有任何问题...因为我说它在我的开发环境中工作正常...更多我手动能够在SQL Server中执行存储过程。我的SQL Server Native Client 11.0连接可用于执行其他存储过程...但对于其中几个,它不起作用。我想我需要在SQL Server本身或可能在Native Client 11.0驱动程序中配置一些东西?
不幸的是它没有例外。我已经将CommandTimeout
属性设置为0并让它突然停留几个小时,希望它会抛出异常来给我一个线索,但没什么......它只是被冻结试图执行。任何建议或想法都将非常感激,因为这个让我真的很难过,因为它应该没问题!
答案 0 :(得分:3)
我首先会启动SSMS,并从SQL studio中输入 执行xxxxx''
确保它运行(并使用SAME登录和连接到当前用于Access的SSMS。
我还会考虑创建一个pass-though查询,并将该查询保存在访问中。 (如果sp不返回记录,则设置返回records = false)。然后在代码中运行任何proc,你可以去:
With CurrentDb.QueryDefs("qryPass")
.SQL = "exec usp_GenerateUnitKey '" & UnitColumns & "'"
.Execute
End With
你注意到上面的代码是多么简单 - 所以如果sp从SSMS运行,那么试试上面的代码。
答案 1 :(得分:0)
这是一个困难的问题,我花了大约3天的时间进行故障排除才能获得解决方案。虽然我对最终解决方案不满意,因为它本应该起作用......但最后我的服务器理论是虚拟机证明是正确的。当我在专用服务器上将此完全相同的设置部署到Microsoft Access 2016 32位和SQL Server 2014 32位时,它的工作方式与我尝试部署到的Azure VM和1& 1云服务器相比。 / p>
SQL Server与VM的集成从我所读过的内容中变得越来越好,但显然还有很长的路要走。也许SQL Server需要发布一个特殊的VM版本。感谢所有花时间研究这个问题的人。