2016-07-07 2 views
2

Я пытаюсь получить идентификаторы CSV из таблицы с сервера sql и присваивать результат переменной. Ниже приводится SQL я поставил внутри Execute SQL TaskНазначение значения из одного набора результатов результата в ssis, дающем ошибку в SSIS 2012

set nocount on 
declare @csv varchar(max) = '' 
select @csv = @csv + cast(companyid as varchar(10)) + ',' from company where isprocessed = 0 
select substring(@csv,1,len(@csv) - 1) as companyids 

Как вы можете видеть его простой и стандартный способ получения CSV поля в T-SQL. Он отлично работает в окне запроса, но метания ниже ошибки при запуске задачи в SSIS 2012

[Execute SQL Task] Error: The value type (__ComObject) can only be converted to variables of type Object.

[Execute SQL Task] Error: An error occurred while assigning a value to variable "sCSVCompanyIds": "The type of the value (DBNull) being assigned to variable "User::sCSVCompanyIds" differs from the current variable type (String). Variables may not change type during execution. Variable types are strict, except for variables of type Object. ".

Ниже приведены параметры Execute SQL Task

  1. В вкладке Общие, проект Resultset установлен в однорядные
  2. в Результат Набор вкладку, Результат имя устанавливается в 0 (Я также попытался, установив его на csvids, который является имя столбца псевдоним в выбранном л ist), а переменное имя - User::sCSVCompanyIds

У меня нет ни малейшего понятия, почему он не работает. После того, как я потратил столько времени, я проделал трудный путь, который вернул результат в виде набора Full Row (тот же SQL, который всегда возвращает 1 столбец 1) и добавляет для каждого цикла цикла цикл, который зацикливает результирующий набор (который всегда выполняет итерацию только один раз по очевидным причинам) и присвойте полям набора результатов переменной. Это работает для меня, но должен быть простой способ сделать это. Что мне не хватает?

+0

Попробуйте добавить AS в предложение select select ... cast (id AS varchar (10)) + ',' from ... при запуске кода возвращает ошибку –

+0

@alex Спасибо и, пожалуйста, проигнорируйте эту ошибку. Я случайно удалил его, когда изменил фактическую таблицу/столбцы.Исправлено сейчас –

+0

Вы установили DataType в окне Variables to String? –

ответ

5

Проблема связана с типом данных nvarchar (max). Я предполагаю, что он будет таким же для varchar (max). Хотя соответствующие типы данных в SSIS являются DT_NTEXT и DT_TEXT присутствуют по какой-то причине, мы получаем эту ошибку.

Существует несколько вариантов управления этим.

1 Конечно, может быть более подходящий способ справиться с этим путем литья/преобразования столбца в запросе на фиксированную длину вместо max что-то вроде cast (myvarcharmaxfield как varchar (8000)). В моем случае это не работает, потому что я ожидаю большую длину строки. Я генерирую строку csv из уникального столбца идентификатора, который сам содержит 36 строк длинной строки и нуждается в 3 дополнительных символах для цитирования их с кодовым знаком и запятой в качестве разделителя, которая будет поддерживать только 205 значений. Так что это не работает для меня.

Так что я оставил без выбора, кроме как придерживаться, как я реализованный уже, который в моем вопросе

After wasting so much time I am worked out a hard way which by returning the result as Full Row set (same SQL which returns 1 row 1 column always) and add a for each loop container to loop throw the result set (which will always iterates only once for obvious reasons) and assign the result set's fields to the variable

Новый способ я узнал из неакцептованного ответа от this question

Изменить соединение OLEDB к соединению ADO.NET

Я думаю, что это достаточно справедливо, но для этого мне нужно создать другой диспетчер соединений (чтобы мне не пришлось менять все существующие задачи) и использовать его для этого типа taks, где мне нужен csv но я сделал не купите его, так как у меня очень мало времени на проведение исследований по созданию строки подключения, которая мне кажется с типом erros, который я получаю, отличается от oledb.

+0

очень полезно! благодаря –