Решено!
Оказывается, виновником был запрос, использованный в таблице 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.
Вот список того, что я пробовал:
- Google
- SET ARITHABORT ON
- опция (перекомпиляция)
- Общее табличное выражение
- Объявление и использование временной таблицы
- Изменение учетных данных для входа в систему (с использованием аутентификации 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-разрядная.