如何处理使用sp_executesql时发生的错误?

问题描述 投票:0回答:1

我正在运行一个存储过程来生成一条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
sql vba tsql ms-access-2016 sql-server-2019
1个回答
0
投票

SP _SwitchLinkedServer 的定义必须包含 @Status 作为输出参数,否则它不会在调用上下文中更新,即您的 VBA 函数。

© www.soinside.com 2019 - 2024. All rights reserved.