我在更新端口时遇到以下错误,该端口使用一直使用SQL 2008的WCF SQL适配器与具有完全相同(非常简单)的表模式的SQL 2014 DB完美配合。
适配器无法使用URL“mssql:// XXXXX // XXXXXX?”发送发送到“WcfSendPort_SqlAdapterBinding_TableOp_dbo_XXXXXXXX_Custom”端口的消息。它将在为此发送端口指定的重试间隔后重新传输。详细信息:“Microsoft.ServiceModel.Channels.Common.XmlReaderGenerationException:列CUST_ID和BUSINESS_UNIT_AR在序列中重复或不重复。每列只能选择一次,并且必须按顺序选择列。
我试过以下但没有运气
我得出的结论是,BizTalk 2010 WCF SQL适配器可能与SQL Server 2014不兼容。任何人都可以确认这一点和/或建议任何解决方法吗?目前我认为我需要一个自定义的c#组件,并且还计划在不久的将来某个时候进行BizTalk升级。
这是表格
CREATE TABLE [dbo].[PS_PAC_CUSCLI_XREF](
[SETID] [nvarchar](5) NOT NULL,
[CUST_ID] [nvarchar](15) NOT NULL,
[BUSINESS_UNIT_AR] [nvarchar](5) NOT NULL,
[PAC_M_CLIENTCD] [int] NOT NULL,
[ADDRESS_SEQ_NUM] [int] NOT NULL,
[PAC_M_ACCOUNT] [nvarchar](4) NOT NULL,
[PAC_M_SUNCODE] [nvarchar](10) NOT NULL,
[PAC_M_TAXCNTRY] [nvarchar](5) NOT NULL
) ON [PRIMARY]
我正在尝试执行一个非常简单的选择,这是消息
<ns0:Select xmlns:ns0="http://schemas.microsoft.com/Sql/2008/05/TableOp/dbo/PS_PAC_CUSCLI_XREF" xmlns:array="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:ns3="http://schemas.microsoft.com/Sql/2008/05/Types/Tables/dbo">
<ns0:Columns>SETID, CUST_ID, BUSINESS_UNIT_AR, PAC_M_CLIENTCD, ADDRESS_SEQ_NUM, PAC_M_ACCOUNT, PAC_M_SUNCODE, PAC_M_TAXCNTRY</ns0:Columns>
<ns0:Query>WHERE [CUST_ID] = '0000005341' and [ADDRESS_SEQ_NUM] = 1</ns0:Query>
</ns0:Select>
我可以看到它在命名空间中使用2008,但这就是使用WCF导入自动生成的方式。
发送端口绑定几乎是模式生成工具生成的默认设置,但如果您真的需要它可以添加它(它非常大!)。
运行SQL跟踪后,我确认select语句具有正确的列顺序。但是,此SQL也运行,它似乎以不同的顺序返回表模式。
exec sp_executesql N'SELECT sp.type AS [ObjectType], modify_date AS [LastModified] FROM sys.all_objects AS sp WHERE (sp.name=@ORIGINALOBJECTNAME and SCHEMA_NAME(sp.schema_id)=@ORIGINALSCHEMANAME);SELECT clmns.name AS [Name], usrt.name AS [DataType], SCHEMA_NAME(usrt.schema_id) AS DataTypeSchemaName, usrt.is_assembly_type AS [IsAssemblyType], clmns.is_identity AS [IsIdentity], ISNULL(baset.name, N'''') AS [SystemType], CAST(CASE WHEN baset.name IN (N''nchar'', N''nvarchar'') AND clmns.max_length <> -1 THEN clmns.max_length/2 ELSE clmns.max_length END AS int) AS [Length], CAST(clmns.[precision] AS int) AS [NumericPrecision], CAST(clmns.[scale] AS int) AS [NumericScale], clmns.is_nullable as [IsNullable], clmns.is_computed as [IsComputed], clmns.is_filestream as [IsFileStream], AT.assembly_qualified_name AS AssemblyQualifiedName, defCst.definition AS [DefaultValue] FROM sys.columns as clmns LEFT OUTER JOIN sys.default_constraints defCst on defCst.parent_object_id = clmns.object_id and defCst.parent_column_id = clmns.column_id LEFT OUTER JOIN sys.types AS usrt ON usrt.user_type_id = clmns.user_type_id LEFT OUTER JOIN sys.types AS baset ON baset.user_type_id = clmns.system_type_id and baset.user_type_id = baset.system_type_id LEFT JOIN sys.assembly_types AT ON AT.[name] = usrt.name AND AT.schema_id = usrt.schema_id WHERE clmns.object_id = (SELECT object_id FROM sys.objects o WHERE o.name=@ORIGINALOBJECTNAME and SCHEMA_NAME(o.schema_id)=@ORIGINALSCHEMANAME)',N'@ORIGINALOBJECTNAME nvarchar(18),@ORIGINALSCHEMANAME nvarchar(3)',@ORIGINALOBJECTNAME=N'PS_PAC_CUSCLI_XREF',@ORIGINALSCHEMANAME=N'dbo'
以下是此查询返回的列的顺序
我还尝试将数据移动到临时表,删除并重新创建表,然后重新填充,但发生了同样的错误。在上面的语句中返回的列的顺序是不同的,但仍然不是我期望的顺序。 SQL 2008 DB上的相同查询确实以正确的顺序返回数据,因此它可能很重要。不幸的是,它将被嵌入到WCF适配器的源代码中,所以不确定我能做些什么。
答案 0 :(得分:0)
所以我认为我设法证明虽然BizTalk 2010本身与SQL Server 2014兼容,但官方适配器包中提供的SQL适配器不是,至少不适用于SELECT操作。
以下是一些替代解决方案
请注意,SQL适配器对UPDATE操作确实有效。