0

解决了!

事实证明,罪魁祸首是买家表中使用的查询。数据来自递归公用表表达式,通过拆分逗号分隔的字符串,然后将它们重新组合成行。当我进一步研究这个问题时,它返回了公共拼接值的第一个字符串,并将其用作与供应商表的比较,从而使其他变量不可用。

我修复它的方法是将结果保存到临时表,然后在递归完成后引用它(在这种情况下,我只是将其更改为更新代码)

SSMS 将正确处理此问题,因为它先等待代码完成 CTE,然后再被另一组代码引用,而 WPF 使用客户端计算机上的本地驱动程序。驱动程序没有处理递归 CTE 的情况,因此返回了第一遍代码进行比较。

感谢您的帮助和回复。它让我了解了我需要在哪里分解代码并进一步分析它不工作的地方和工作的地方。

我已经为这个问题苦苦挣扎了两天了。我重写了代码和语句,但最终得到了相同的结果。

我的目标是能够从供应商列表中获取全名,该列表具有来自不同表的相似买家名称。我使用的代码:

SELECT BuyerID, SupName 
FROM Buyers b 
LEFT OUTER JOIN suppliers s ON s.supname LIKE RTRIM(b.BuyerName) + '%'

我也试过这段代码

SELECT b.BuyerID, b.BuyerName, s.SupName 
FROM Buyers b, suppliers s 
WHERE PATINDEX(RTRIM(b.BuyerName) + '%', s.supname) <> 0

我的预期输出应该如下所示,它从 Microsoft SQL Server Management Suite 产生相同的结果,如下所示。

BuyerID | BuyerName | Supname
--------+-----------+---------------------
AA      | Alfrac    | Alfrac Insurance.
BC      | Bank      | Bank of America
CC      | Charle    | Charles Dawnson

我的 WPF 输出结果是这样的。

BuyerID | BuyerName | Supname
--------+-----------+---------------------
AA      | Alfrac    | Null
BC      | Bank      | Null
CC      | Charle    | Charles Dawnson

在 WPF 中,这是我使用的代码:

string sql = ReadEmbeddedResource("Queries.GetBuyerSupplier.sql");
DataSet Data = new DataSet();
using (SqlCommand cmd = new SqlCommand(sql, new SqlConnection(ConfigurationManager.ConnectionStrings["sqldb"].ConnectionString)))
{
    cmd.Connection.Open();
    using (SqlDataAdapter da = new SqlDataAdapter(cmd))
        da.Fill(Data);
    cmd.Connection.Close();
}

Queries.GetBuyerSupplier.sql 中就是上面的 SQL 命令。

这是我尝试过的事情的清单:

  1. 谷歌
  2. 设置阿里萨博特
  3. 选项(重新编译)
  4. 公用表表达式
  5. 声明和使用临时表
  6. 更改登录凭据(使用 SQL 与域身份验证)

我正在使用的工具版本:

Microsoft SQL Server 2014 (SP2-GDR) (KB4019093) - 12.0.5207.0 (X64) Jul 3 2017 02:25:44 Microsoft Corporation Standard Edition (64-bit) o​​n Windows NT 6.3 (Build 9600:) (Hypervisor)

SQL 客户端驱动程序:Microsoft SQL Server 2008 R2 Native Client v 10.50.1617.0

Microsoft Visual Studio Professional 2015 V 14.0.25431.01 更新 3
Microsoft .NET Framework V 4.7.02558 操作系统:Windows 7 64 位。

4

1 回答 1

0

解决了。事实证明,另一组代码是 CTE 的递归(最初代码被输入逗号拼接,然后我有一个 CTE 递归将字符串分成行,然后再输入上面的代码。一旦我将 CTE 递归结果设置到临时表中,我终于返回并使用正确的供应商更新表,现在它们似乎都工作正常。

我解决这个问题的方法是首先将买家代码附加到临时表中,一旦递归完成,然后使用 LEFT OUTER JOIN 比较对 supname 进行更新。

只是想知道为什么我的驱动程序在比较结果之前没有让递归完成?那里似乎有点坏了,看看它如何只返回许多未完成的结果之一。SSMS 在返回结果之前完成了等待递归完成的正确工作。

在这一点上,这是一个驱动程序问题。谢谢你们的帮助。

于 2018-10-05T16:33:08.777 回答