Как обсуждалось здесь: Передача списка‹› в хранимую процедуру SQL и в во многих других местах одним из способов передачи таблицы в качестве параметра является использование SqlParameter.
Проблема заключается в том, что для этого требуется указать определяемый пользователем тип таблицы в свойстве TypeName.
Мне нужно загрузить данные из файла Excel и передать их в качестве параметра оператору SQL, который объединит эти данные с другими таблицами базы данных, чтобы получить результат.
Для этого мне нужно будет создать определяемый пользователем тип таблицы для каждого возможного варианта файла Excel. Я не хочу загрязнять типы SQL теми типами, которые используются только для передачи данных из каждого файла Excel. Как мне этого добиться?
Вы можете спросить, как я могу присоединиться к тому, что я не знаю типа - ответ - я знаю имена и типы некоторых полей, но не всех. Кроме того, если я хочу вернуть объединенные данные, используя select *, он будет работать с любым списком полей без жесткого кодирования всех их внутри типа.
Я не могу использовать OPENROWSET для присоединения к этому файлу непосредственно из SQL, потому что у меня 64-битный SQL Server, и он не работает, выдавая мне странную ошибку.
В SQL Server существует концепция временных таблиц, но нет концепции временных типов. Как смоделировать временный тип или избежать его использования при передаче таблицы?
Я мог бы передавать данные в формате XML, но это кажется менее эффективным, если размер данных достаточно велик, а размер данных ограничен 2 ГБ.
Один из способов организовать это — создать тип, затем выполнить оператор, затем отбросить тип после или использовать TRY..CATCH и отбросить тип внутри catch.
Другой способ — создать специальную схему, сгенерировать уникальные имена типов в этой схеме и время от времени очищать ее с помощью SQL-задания по сбору мусора. И его можно использовать в сочетании с первым способом просто для очистки остатков.
Любые другие предложения?