Кто-нибудь знает, как обойти ограничение в 128 символов, наложенное на параметр конструктора 'name' (имя столбца) класса 'Microsoft.SqlServer.Server.SqlMetaData'? Или вам известен альтернативный метод возврата данных в SQLPipeline, который не имеет аналогичного ограничения.
Справочная информация: Число лет go, которое мы создали. Net (C#) Хранимая процедура CLR, чтобы заменить ту, которая была реализована в vb6 и использовала TrueOLEDBProviderLib (TOLAP). Движущей силой этого изменения стал переход на 64-битный SQL сервер, что означало, что код vb6 больше не мог работать в процессе. (vb6 не выполняет 64 бита)
Проблема: Основная функция нашей хранимой процедуры CLR заключается в том, чтобы на основе списка «идентификаторов точек данных» извлекать и обрабатывать данные из числа источников (компоненты DCOM), затем выведите таблицу данных на SQLPipeline. Для возвращаемой таблицы данных мы устанавливаем имя столбца в «идентификаторы точек данных». Примечание: «Идентификаторы точек данных» создаются на основе иерархии, поэтому они довольно длинные, с максимальной длиной около 256 символов.
Проблема, которую мы недавно обнаружили, заключается в том, что при попытке вывести результаты к SQLPipeline, если «идентификаторы точек данных» длиннее 128 символов, то CLR генерирует исключение для длины «name» (имя столбца). (См. Ниже «. Net Поведение Framework Code»). Но при использовании тех же «идентификаторов точек данных» в старой реализации CLR vb6 он работает без ошибок. В возвращаемой таблице содержатся имена столбцов, длина которых превышает 128 символов.
Дополнительный вопрос: Я знаю, что это другая технология, но почему на сервере SQL не было установлено ограничение в 128 символов реализация 'TrueOLEDBProviderLib' (TOLAP). Вопрос, на который мне нужно дать ответ: «Если TOLAP может возвращать таблицы данных, которые содержат имена столбцов длиннее 128 символов, то почему нельзя. Net (C#) CLR хранимая процедура».
Обходной путь: Очевидным решением будет урезание «идентификаторов точек данных» до 128 символов. Однако, поскольку это изменение функциональности по сравнению с исходной реализацией CLR vb6, мне нужно сначала изучить все альтернативы.
. Net Поведение Framework Code: Внутри внутреннего конструктора 'SqlMetaData', вызывается метод AssertNameIsValid, где проверяется, что длина параметра 'name' меньше, чем 'SmiMetaData.MaxNameLength' (128 символов), если не выдается исключение. https://referencesource.microsoft.com/#System .Data / fx / src / data / System / Data / Sql / SqlMetaData.cs Я понимаю, что значение этого предела установлено на основе предела 128 символов SQL Сервер имеет значение для ' Column_Length. https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-server-info-transact-sql?view=sql-server-ver15
** Обновление дополнительной информации: **
Старая реализация представляла собой vb6 DLL в файловой системе, вызываемую Хранимая процедура.
Последней версией, на которой работала реализация vb6, была SQL Server 2008 R2 SP2 (32 бита).
. Реализация. Net CLR впервые была запущена на SQL сервере 2012 SP2 (64 бита), текущая версия - 2014 SP3 (64 бита).
Все имена столбцов «Идентификатор точки данных» будут взяты из параметров SP, поскольку в версии vb6 нет ничего подобного жестко закодированному. , Все «идентификаторы точек данных» определяются пользователем в развернутой системе.