Как организовать или избежать временного пользовательского типа таблицы при передаче табличных параметров

Как обсуждалось здесь: Передача списка‹› в хранимую процедуру SQL и в во многих других местах одним из способов передачи таблицы в качестве параметра является использование SqlParameter.

Проблема заключается в том, что для этого требуется указать определяемый пользователем тип таблицы в свойстве TypeName.

Мне нужно загрузить данные из файла Excel и передать их в качестве параметра оператору SQL, который объединит эти данные с другими таблицами базы данных, чтобы получить результат.

Для этого мне нужно будет создать определяемый пользователем тип таблицы для каждого возможного варианта файла Excel. Я не хочу загрязнять типы SQL теми типами, которые используются только для передачи данных из каждого файла Excel. Как мне этого добиться?

Вы можете спросить, как я могу присоединиться к тому, что я не знаю типа - ответ - я знаю имена и типы некоторых полей, но не всех. Кроме того, если я хочу вернуть объединенные данные, используя select *, он будет работать с любым списком полей без жесткого кодирования всех их внутри типа.

Я не могу использовать OPENROWSET для присоединения к этому файлу непосредственно из SQL, потому что у меня 64-битный SQL Server, и он не работает, выдавая мне странную ошибку.

В SQL Server существует концепция временных таблиц, но нет концепции временных типов. Как смоделировать временный тип или избежать его использования при передаче таблицы?

Я мог бы передавать данные в формате XML, но это кажется менее эффективным, если размер данных достаточно велик, а размер данных ограничен 2 ГБ.

Один из способов организовать это — создать тип, затем выполнить оператор, затем отбросить тип после или использовать TRY..CATCH и отбросить тип внутри catch.

Другой способ — создать специальную схему, сгенерировать уникальные имена типов в этой схеме и время от времени очищать ее с помощью SQL-задания по сбору мусора. И его можно использовать в сочетании с первым способом просто для очистки остатков.

Любые другие предложения?


comment
Я мог бы передавать данные в формате XML, но это кажется менее эффективным, если размер данных достаточно велик, а размер данных ограничен 2 ГБ. -- Наличие файла Excel, генерирующего XML размером 2 ГБ, само по себе может быть проблемой ;-)   -  person milivojeviCH    schedule 27.12.2012


Ответы (1)


Вы, безусловно, не должны создавать табличную переменную размером 2 ГБ или определяемый пользователем тип данных и передавать это. Вместо этого используйте службы SSIS для передачи файла в какую-либо постоянную или временную таблицу, а затем управляйте им с помощью хранимых процедур. Даже если вам удалось передать хранимой процедуре 2 ГБ данных, транзакция будет выполняться так долго, что почти наверняка заблокирует другие транзакции.

Это лучший ответ, на который вы можете надеяться, не предоставляя дополнительных подробностей о вашем сценарии.

person tommy_o    schedule 16.05.2013