【问题标题】:SQL : .NET vs SSMSSQL:.NET 与 SSMS
【发布时间】:2018-10-05 14:13:35
【问题描述】:

解决了!

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

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

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. 设置 ARITHABORT 开启
  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 位。

【问题讨论】:

  • 您能否添加您的WPF 类代码...可能您的数据类型错误,并且转换以某种方式失败。
  • 完成了,没什么好看的。只需一个数据集适配器填充到 DataSet 中。
  • WPF 输出表明它是第一次查询的结果。您已将 join 留在那里,因此当 join codition "s.supname like RTRIM( b.BuyerName ) + '%'" 未满足时,您可能会在 Supname 中获得 null。此查询彼此不等价 - 首先将为不满足条件的数据返回具有空值(和更多行)的列。
  • 你可以在cmd.Connection.Close();这一行设置断点并检查Dataset的内容...如果值在那里,那么我们可以继续。
  • 同样的结果。我开始怀疑它与驱动程序问题有关,此时 WPF 和 SSMS 如何与引擎对话是我无法理解的。

标签: c# sql wpf ssms smss


【解决方案1】:

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

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

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

此时是驱动程序问题。谢谢你们的帮助。

【讨论】:

    猜你喜欢
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    相关资源
    最近更新 更多