我正在运行一个存储过程来生成一条SQL语句,然后使用
sp_executesql
来运行它。该语句创建一个查看链接服务器的view
。执行此视图时,它会在 SSMS 中抛出错误:
Msg 7321,级别 16,状态 2,程序 LINKEDSERVERVIEW,第 3 行 [批处理开始第 8 行]
准备查询“选择...时发生错误
抛出这个错误是有意义的。但是,问题是我的调用程序是 Microsoft Access,并且此错误未传递给 Access。我的SP执行起来就好像没有任何问题一样。我如何读取
sp_executesql
的结果并自己处理错误?
SP:
declare @Status = 'OK'
declare @def nvarchar(4000) = 'ALTER VIEW dbo.LINKEDSERVERVIEW AS SELECT * FROM OPENQUERY(LINKEDSERVER2, ''SELECT * FROM COM_INTEGRATION_SHIP'') AS derivedtbl_1 '
begin try
begin tran
exec sp_executesql @def //Throws an error in SSMS but not in MS Access
commit tran
end try
begin catch
set @Status = (select error_message())
end catch
VBA:
Function SwitchLinkedServer(strDSN As String) As Boolean
On Error GoTo ErrLabel
Dim strTo As String, con As ADODB.Connection, cmd As New ADODB.Command, prm As New ADODB.Parameter
SwitchLinkedServer = False
'convert dsn to linked server name for sp
strTo = DLookup("LinkedServername", "[#DSN2LinkedServer]", "DSNname = '" & strDSN & "'")
If Not EstablishConnection(con) Then
ErrHandler glbLastErrNum, glbLastError
GoTo ExitLabel
End If
Set cmd.ActiveConnection = con
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "_SwitchLinkedServer"
Set prm = cmd.CreateParameter("@To", adVarChar, adParamInput, 20, strTo)
cmd.Parameters.Append prm
Set prm = cmd.CreateParameter("@Status", adVarChar, adParamOutput, 255)
cmd.Parameters.Append prm
cmd.Execute
If cmd.Parameters("@Status") <> "OK" Then
MsgBox "ERROR"
GoTo ExitLabel
End If
SwitchLinkedServer = True
ExitLabel:
On Error Resume Next
Set prm = Nothing
Set cmd = Nothing
TerminateConnection con
Exit Function
ErrLabel:
ErrHandler Err.Number, Err.Description
Resume ExitLabel
End Function
SP _SwitchLinkedServer 的定义必须包含 @Status 作为输出参数,否则它不会在调用上下文中更新,即您的 VBA 函数。