解决了!
事实证明,罪魁祸首是买家表中使用的查询。数据来自递归公用表表达式,通过拆分逗号分隔的字符串,然后将它们重新组合成行。当我进一步研究这个问题时,它返回了公共拼接值的第一个字符串,并将其用作与供应商表的比较,从而使其他变量不可用。
我修复它的方法是将结果保存到临时表,然后在递归完成后引用它(在这种情况下,我只是将其更改为更新代码)。
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 命令。
这是我尝试过的事情的清单:
- 谷歌
- 设置阿里萨博特
- 选项(重新编译)
- 公用表表达式
- 声明和使用临时表
- 更改登录凭据(使用 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) on 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 位。