Я запускаю один из сценариев, который использует процедуру для получения некоторых столбцов. Данные постоянно меняются, иногда есть значения столбца Location_code
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, для автоматического определения, поэтому мне не нужно добавлять или удалять параметр для устранения ошибки.
Также вы ничего не спрашиваете; в чем здесь ваш вопрос?
Данные Hi существуют во всех 6 столбцах, но для местоположений они также могут быть нулевыми или числовыми. Проблема в том, что если нет ни одного сотрудника, имеющего 4 должности, то останутся только столбцы с кодом местоположения 3, мне нужно удалить параметр кода местоположения 4 в редакторе ssrs. Есть ли способ использовать параметр в качестве цикла для автоматического определения?
Вы имеете в виду, что возвращаете динамическое количество столбцов? Лучше просто вернуть тот же номер и заполнить нулями?
@siggemannen Он возвращает другие значения NULL, что хорошо для SQL. в настоящее время 6 столбцов также могут быть 5 или 7, они постоянно меняются в зависимости от должности сотрудника. каждый раз, когда мне приходится удалять или добавлять код местоположения параметра 4, 5 или 6 (добавление или удаление), зависит от ситуации в редакторе SSRS, как показано выше в последнем.
Если процедура возвращает различное количество столбцов, и если ее нельзя изменить, и если никакие входные данные не могут управлять ее поведением, то, я считаю, может работать только метод проб и ошибок. Кажется, цикл с try и catch может привести вас туда.
Если процедура возвращает различное количество столбцов, и если ее нельзя изменить, и если никакие входные данные не могут управлять ее поведением, то, я считаю, может работать только метод проб и ошибок. Кажется, что последовательность запросов в блоках 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.
Образец данных имеет неверный формат: в нем 6 заголовков, но в наборе данных только 2 столбца; где данные для остальных 4 столбцов?