Выполнение процедуры в SSIS Visual Studio с наборами результатов

Я запускаю один из сценариев, который использует процедуру для получения некоторых столбцов. Данные постоянно меняются, иногда есть значения столбца Location_code 1, 2 и 3, иногда 4.

emp_id Домашнее_местоположение Местоположение_1 Местоположение_2 Местоположение_3 Местоположение_4 Ячейка 1 Ячейка 2 Ячейка 3 Ячейка 4

В зависимости от должности, если у сотрудника две должности, Location_3 и Location_4 будут пустыми. Если у кого-то для этого есть 4 позиции emp_id, для других 4 столбца будут равны нулю. Он меняется при использовании параметра функции MaxTally. N*N, разделы @CRLF и номер строки.

Возвращаясь к главному, когда я запускаю этот скрипт в SQL-команде ole db. Редактор исходного кода:

EXEC ('exec Procedure name;')
WITH RESULT SETS
    ((EMP_ID VARCHAR (20),
      HOME_LOCATION VARCHAR (20),
      location_1 VARCHAR (10),
      location_2 VARCHAR (10),
      location_3 VARCHAR (10),
      location_4 VARCHAR (10)
    ));

Проблема в том, что иногда столбец местоположения отображается только до тех пор, пока столбец location_3 отсутствует, и в этом случае я получаю сообщение об ошибке.

Я удалил код местоположения 4, проанализировал запрос, и это было хорошо.

Я ожидаю, что здесь, в редакторе исходного кода Ole Db, есть такой способ, как Count +1, для автоматического определения, поэтому мне не нужно добавлять или удалять параметр для устранения ошибки.

Образец данных имеет неверный формат: в нем 6 заголовков, но в наборе данных только 2 столбца; где данные для остальных 4 столбцов?

Thom A 09.07.2024 16:27

Также вы ничего не спрашиваете; в чем здесь ваш вопрос?

Thom A 09.07.2024 16:28

Данные Hi существуют во всех 6 столбцах, но для местоположений они также могут быть нулевыми или числовыми. Проблема в том, что если нет ни одного сотрудника, имеющего 4 должности, то останутся только столбцы с кодом местоположения 3, мне нужно удалить параметр кода местоположения 4 в редакторе ssrs. Есть ли способ использовать параметр в качестве цикла для автоматического определения?

user26307016 09.07.2024 16:58

Вы имеете в виду, что возвращаете динамическое количество столбцов? Лучше просто вернуть тот же номер и заполнить нулями?

siggemannen 09.07.2024 17:05

@siggemannen Он возвращает другие значения NULL, что хорошо для SQL. в настоящее время 6 столбцов также могут быть 5 или 7, они постоянно меняются в зависимости от должности сотрудника. каждый раз, когда мне приходится удалять или добавлять код местоположения параметра 4, 5 или 6 (добавление или удаление), зависит от ситуации в редакторе SSRS, как показано выше в последнем.

user26307016 09.07.2024 17:11

Если процедура возвращает различное количество столбцов, и если ее нельзя изменить, и если никакие входные данные не могут управлять ее поведением, то, я считаю, может работать только метод проб и ошибок. Кажется, цикл с try и catch может привести вас туда.

Der U 09.07.2024 17:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если процедура возвращает различное количество столбцов, и если ее нельзя изменить, и если никакие входные данные не могут управлять ее поведением, то, я считаю, может работать только метод проб и ошибок. Кажется, что последовательность запросов в блоках try-and-catch может помочь вам в этом. Я предполагаю, что вы работаете в среде, где вы можете выполнять код, подобный следующему.

DECLARE @success_f BIT = 0
DECLARE @r TABLE(story NVARCHAR(4000))

DROP TABLE IF EXISTS #t
CREATE TABLE #t(
  EMP_ID VARCHAR (20),
  HOME_LOCATION VARCHAR (20),
  lOCtion_1 VARCHAR (10),
  location_2 VARCHAR (10),
  location_3 VARCHAR (10),
  location_4 VARCHAR (10),
  location_5 VARCHAR (10)
)


IF @success_f = 0
BEGIN TRY
BEGIN TRAN  
  INSERT INTO #t(
    EMP_ID
    ,HOME_LOCATION
    ,lOCtion_1
    ,location_2
    ,location_3
    )
  EXEC ('EXEC Procedure name;')  
  SET @success_f = 1
  insert into @r select 'first succeeded'
COMMIT TRAN
END TRY
BEGIN CATCH
  IF @@TRANCOUNT > 0 ROLLBACK TRAN
  insert into @r select 'first failed'
END CATCH
else insert into @r select 'first not even tried'


IF @success_f = 0
BEGIN TRY
BEGIN TRAN  
  INSERT INTO #t(
    EMP_ID
    ,HOME_LOCATION
    ,lOCtion_1
    ,location_2
    ,location_3
    ,location_4
    )
  EXEC ('EXEC Procedure name;')  
  SET @success_f = 1
  insert into @r select 'second succeeded'
COMMIT TRAN
END TRY
BEGIN CATCH
  IF @@TRANCOUNT > 0 ROLLBACK TRAN
  insert into @r select 'second failed'
END CATCH
else insert into @r select 'second not even tried'


IF @success_f = 0
BEGIN TRY
BEGIN TRAN  
  INSERT INTO #t(
    EMP_ID
    ,HOME_LOCATION
    ,lOCtion_1
    ,location_2
    ,location_3
    ,location_4
    ,location_5
    )
  EXEC ('EXEC Procedure name;')  
  SET @success_f = 1
  insert into @r select 'third succeeded'
COMMIT TRAN
END TRY
BEGIN CATCH
  IF @@TRANCOUNT > 0 ROLLBACK TRAN
  insert into @r select 'third failed'
END CATCH
else insert into @r select 'third not even tried'


SELECT "@success_f after" = IIF( @success_f = 1
                                 ,'procedure run without error'
                                 ,'procedure NOT run without error' )

SELECT story FROM @r

SELECT 
  EMP_ID
  ,HOME_LOCATION
  ,lOCtion_1
  ,location_2
  ,location_3
  ,location_4
  ,location_5
FROM #t

Есть три IF-блока, каждый из которых пробует определенное количество столбцов. Первый пытается дойти до локации_3, второй до локации_4, третий до локации_5. Если есть другие наборы столбцов, которые могут быть возвращены, вам необходимо создать для них IF-блок. Этот код проверит каждый из них, и если один из них увенчается успехом, он загрузит данные во временную таблицу #t. Он также собирает некоторую информацию о том, что произошло.

В конце он возвращает все столбцы #t с последним select, оставляя неиспользованные столбцы, заполненные NULL.

Другие вопросы по теме