SQL: .NET против SSMS - PullRequest
       24

SQL: .NET против SSMS

0 голосов
/ 05 октября 2018

Решено!

Оказывается, виновником был запрос, использованный в таблице Buyer.Данные поступили из рекурсивного общего табличного выражения, разделив строку через запятую и затем собрав их в строки.Когда я углубляюсь в эту проблему, она возвращала первую строку общего объединенного значения и использовала ее для сравнения с таблицей поставщиков, что делало другие переменные недоступными.Я исправил это, сохранив результат во временной таблице, а затем сослался на него после завершения рекурсии (в этом случае я просто изменил его на код обновления) .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 ManagementSuite, как показано ниже.

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. Google
  2. SET ARITHABORT ON
  3. опция (перекомпиляция)
  4. Общее табличное выражение
  5. Объявление и использование временной таблицы
  6. Изменение учетных данных для входа в систему (с использованием аутентификации SQL и домена)

Версия используемых мной инструментов:

Microsoft SQL Server 2014 (SP2-GDR) (KB4019093) - 12.0.5207.0 (X64) 3 июля 2017 года 02:25:44 Microsoft Corporation Standard Edition (64-разрядная версия) в Windows NT 6.3 (сборка 9600:) (Гипервизор)

Драйвер клиента SQL: собственный клиент Microsoft SQL Server 2008 R2 v 10.50.1617.0

Microsoft Visual Studio Professional 2015 V 14.0.25431.01 Обновление 3Microsoft .NET Framework V 4.7.02558 ОС: Windows 7, 64-разрядная.

1 Ответ

0 голосов
/ 05 октября 2018

решаемая.Как выясняется, другой набор кода был рекурсией CTE (сначала код был передан в запятую, затем у меня была рекурсия CTE для разделения строк на строки, а затем - в код выше. Как только яустановив результат рекурсии CTE во временную таблицу, я наконец вернулся и обновил таблицу с правильными поставщиками, и теперь все они, кажется, работают правильно.

Что я сделал, чтобы исправить это, так это сначала добавил код покупателя ввременная таблица, как только рекурсия была закончена, я затем обновляю supname, используя сравнение LEFT OUTER JOIN.

Просто удивляюсь, почему мой драйвер не дал рекурсии завершиться, прежде чем сравнивать результат?кажется, что он немного сломан, видя, как он возвращает только один из многих незаконченных результатов назад. SSMS правильно выполнила ожидание завершения рекурсии, прежде чем возвращать результаты.

Это проблема драйвера в этомточка. Спасибо, ребята, за вашу помощь.

...