Присвоение значения из результирующего набора из одной строки в ssis дает ошибку в SSIS 2012

Я пытаюсь получить CSV идентификаторы из таблицы с сервера SQL и назначить результат переменной. ниже sql я положил внутриВыполнить задачу SQL

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

Ошибка [Выполнить задачу SQL]: тип значения (__ComObject) можно преобразовать только в переменные типа Object.

Ошибка [Выполнение SQL] Ошибка: при назначении значения переменной «sCSVCompanyIds» произошла ошибка: «Тип значения (DBNull), назначаемого переменной« User :: sCSVCompanyIds », отличается от текущего типа переменной (String). Переменные. не может изменять тип во время выполнения. Типы переменных являются строгими, за исключением переменных типа Object. ".

Ниже приведены настройки задачи «Выполнение SQL».

Вгенеральный вкладка, Resultset проект установлен водин рядВНабор результатов На вкладке Result Name установлено значение 0 (я также пытался установить его наcsvids который является именем столбца псевдонима в списке выбора), а имя переменной установлено наUser::sCSVCompanyIds

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

 ɐlǝx07 июл. 2016 г., 12:34
попробуйте присвоить значение переменной по умолчанию на вкладке Значение, например, "имя файла"
 Solow Developer07 июл. 2016 г., 12:40
Я думаю, это проблема с типом данных varchar (max). может быть связано сstackoverflow.com/questions/21009091/...
 ɐlǝx07 июл. 2016 г., 12:12
попробуйте добавить AS в предложении select select ... cast (id AS varchar (10)) + ',' from ... при запуске кода возвращается ошибка
 ɐlǝx07 июл. 2016 г., 12:30
Вы установили тип данных в окне «Переменные» в строку?
 Solow Developer07 июл. 2016 г., 12:37
Companyid является первичным ключом, поэтому нулевые значения не ожидаются. Я назначил значение по умолчанию 0,0 для переменной.
 Solow Developer07 июл. 2016 г., 12:49
это тот случай. в моем случае я изменил соединение с ado.net. То же самое работает без каких-либо других изменений
 Solow Developer07 июл. 2016 г., 12:27
@alex Спасибо и, пожалуйста, игнорируйте эту ошибку. Я случайно удалил его, когда я изменил фактическую таблицу / столбцы. Исправлено сейчас
 Nick.McDermaid07 июл. 2016 г., 12:32
Тип значения (DBNull), присваиваемого переменной «User :: sCSVCompanyIds», отличается от текущего типа переменной (String) подразумевает, что, возможно, ничего не возвращается (NULL), и это не нравится. Вы пытались добавитьISNULL к твоему выражению? Я считаю, что назначение параметров и выходов для выполнения задачи очень ограничено и содержит ошибки.
 Nick.McDermaid08 июл. 2016 г., 01:56
Если вы можете, пожалуйста, опубликуйте это как ответ и примите его.
 Solow Developer07 июл. 2016 г., 12:38
Кстати: выберите NULL, поскольку companyid также присвоил переменной значение NULL.
 Solow Developer07 июл. 2016 г., 12:31
да. его строка

Ответы на вопрос(1)

Решение Вопроса

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

Есть несколько вариантов, чтобы справиться с этим.

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

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

Потратив так много времени, я выработал сложный способ, возвращая результат в виде полного набора строк (тот же SQL, который всегда возвращает 1 столбец строки 1) и добавляя для каждого контейнера цикла цикл, который выбрасывает набор результатов (который всегда повторяется. только один раз по понятным причинам) и присвойте поля набора результатов переменной

Новый способ, которым я научился, основан на неприемлемом ответеэтот вопрос

Измените соединение Oledb на соединение ADO.NET

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

 Nishanth Shaan05 июл. 2017 г., 18:10
очень полезно! Спасибо

Ваш ответ на вопрос