SQL 从 Biztalk 中执行存储过程时出现异常
SQL Exception when executing stored procedure from within Biztalk
我们有一个存储过程可以创建新的 SSIS 执行并启动它:
Declare @execution_id bigint
EXEC [SSISDB].[catalog].[create_execution]
@package_name=N'00 XXXX.dtsx',
@execution_id=@execution_id OUTPUT,
@folder_name=N'XX',
@project_name=N'XXX';
EXEC [SSISDB].[catalog].[start_execution] @execution_id;
当我们调用这个使用 SQL Server Management Studio 登录的存储过程时,它工作得很好。但是,当我们从 BizTalk(作为 BTS 服务帐户用户)中执行此存储过程时,我们收到此错误:
System.Data.SqlClient.SqlException (0x80131904): Incorrect syntax near '-'.
Incorrect syntax near '-'.
Incorrect syntax near '-'.
Server stack trace:
at System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult result)
at System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.End(SendAsyncResult result)
at System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result)
at System.ServiceModel.Channels.ServiceChannel.EndRequest(IAsyncResult result)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at System.ServiceModel.Channels.IRequestChannel.EndRequest(IAsyncResult result)
at Microsoft.BizTalk.Adapter.Wcf.Runtime.WcfClient`2.RequestCallback(IAsyncResult result)
我们从 BTS 到 MS 使用的架构 SQL:
<?xml version="1.0" encoding="utf-16"?>
<schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns:ns0="http://schemas.microsoft.com/Sql/2008/05/TypedProcedures/dbo" elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/Sql/2008/05/TypedProcedures/dbo" version="1.0" xmlns="http://www.w3.org/2001/XMLSchema">
<annotation>
<appinfo>
<fileNameHint xmlns="http://schemas.microsoft.com/servicemodel/adapters/metadata/xsd">TypedProcedure.dbo</fileNameHint>
</appinfo>
</annotation>
<element name="StartBifImport">
<annotation>
<documentation>
<doc:action xmlns:doc="http://schemas.microsoft.com/servicemodel/adapters/metadata/documentation">TypedProcedure/dbo/StartBifImport</doc:action>
</documentation>
</annotation>
<complexType>
<sequence />
</complexType>
</element>
</schema>
BTS 服务帐户在存储过程所在的数据库上具有 db_owner 角色,我们已明确赋予它对 SSIS 文件夹和 SSIS 包的所有 'grant' 权限。
我们可以在执行中看到 table 没有创建执行,因此该调用似乎出了问题。当与 SQL Profiler 连接时,我们看到返回相同的错误,但没有更多关于错误的上下文;离去无痕
关于如何调试或解决此问题的任何pointers/ideas?
创建一个简单的单向发送端口,它与您正忙于调试的端口具有相同的过滤器(和映射,如果适用),只需写入一个文件。使用文件的输出来确认发送到 WCF-SQL 适配器的消息具有它期望的结构。
根据模式判断,它应该生成一个包含以下内容的文件:
<ns0:StartBifImport xmlns:ns0="http://schemas.microsoft.com/Sql/2008/05/TypedProcedures/dbo">
</ns0:StartBifImport>
我建议不要使用 "Strongly-Typed Procedure" 架构,而应使用 "Procedure" 架构。 WCF-SQL 适配器中的 "Strongly-Typed Procedure" 在为其中包含临时表的存储过程生成架构方面存在已记录的问题。
SQL 适配器不支持为定义中包含临时表的强类型存储过程生成元数据。相反,您应该在使用“添加适配器服务参考插件”或“使用适配器服务插件”时从“过程”节点下为同一过程生成元数据。
可在此处找到更多信息:https://msdn.microsoft.com/en-us/library/dd788435(BTS.10).aspx#BKMK_SQLMetadataStronglyTyped
我们有一个存储过程可以创建新的 SSIS 执行并启动它:
Declare @execution_id bigint
EXEC [SSISDB].[catalog].[create_execution]
@package_name=N'00 XXXX.dtsx',
@execution_id=@execution_id OUTPUT,
@folder_name=N'XX',
@project_name=N'XXX';
EXEC [SSISDB].[catalog].[start_execution] @execution_id;
当我们调用这个使用 SQL Server Management Studio 登录的存储过程时,它工作得很好。但是,当我们从 BizTalk(作为 BTS 服务帐户用户)中执行此存储过程时,我们收到此错误:
System.Data.SqlClient.SqlException (0x80131904): Incorrect syntax near '-'.
Incorrect syntax near '-'.
Incorrect syntax near '-'.Server stack trace:
at System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult result)
at System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.End(SendAsyncResult result)
at System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result)
at System.ServiceModel.Channels.ServiceChannel.EndRequest(IAsyncResult result)Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at System.ServiceModel.Channels.IRequestChannel.EndRequest(IAsyncResult result)
at Microsoft.BizTalk.Adapter.Wcf.Runtime.WcfClient`2.RequestCallback(IAsyncResult result)
我们从 BTS 到 MS 使用的架构 SQL:
<?xml version="1.0" encoding="utf-16"?>
<schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns:ns0="http://schemas.microsoft.com/Sql/2008/05/TypedProcedures/dbo" elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/Sql/2008/05/TypedProcedures/dbo" version="1.0" xmlns="http://www.w3.org/2001/XMLSchema">
<annotation>
<appinfo>
<fileNameHint xmlns="http://schemas.microsoft.com/servicemodel/adapters/metadata/xsd">TypedProcedure.dbo</fileNameHint>
</appinfo>
</annotation>
<element name="StartBifImport">
<annotation>
<documentation>
<doc:action xmlns:doc="http://schemas.microsoft.com/servicemodel/adapters/metadata/documentation">TypedProcedure/dbo/StartBifImport</doc:action>
</documentation>
</annotation>
<complexType>
<sequence />
</complexType>
</element>
</schema>
BTS 服务帐户在存储过程所在的数据库上具有 db_owner 角色,我们已明确赋予它对 SSIS 文件夹和 SSIS 包的所有 'grant' 权限。
我们可以在执行中看到 table 没有创建执行,因此该调用似乎出了问题。当与 SQL Profiler 连接时,我们看到返回相同的错误,但没有更多关于错误的上下文;离去无痕
关于如何调试或解决此问题的任何pointers/ideas?
创建一个简单的单向发送端口,它与您正忙于调试的端口具有相同的过滤器(和映射,如果适用),只需写入一个文件。使用文件的输出来确认发送到 WCF-SQL 适配器的消息具有它期望的结构。
根据模式判断,它应该生成一个包含以下内容的文件:
<ns0:StartBifImport xmlns:ns0="http://schemas.microsoft.com/Sql/2008/05/TypedProcedures/dbo">
</ns0:StartBifImport>
我建议不要使用 "Strongly-Typed Procedure" 架构,而应使用 "Procedure" 架构。 WCF-SQL 适配器中的 "Strongly-Typed Procedure" 在为其中包含临时表的存储过程生成架构方面存在已记录的问题。
SQL 适配器不支持为定义中包含临时表的强类型存储过程生成元数据。相反,您应该在使用“添加适配器服务参考插件”或“使用适配器服务插件”时从“过程”节点下为同一过程生成元数据。
可在此处找到更多信息:https://msdn.microsoft.com/en-us/library/dd788435(BTS.10).aspx#BKMK_SQLMetadataStronglyTyped