Я создаю запрос для своей работы, включающий выполнение запроса и последующее использование результатов этого запроса в рамках итерации через базы данных нашей системы. Я пытаюсь разбить это на несколько необходимых компонентов.
- Выполнить запрос, который получит набор данных для повторения через
- Начать цикл, который будет запускаться 1 раз для каждого результата первого запроса.
- Каждый раз, когда цикл запускается, он отправляет запрос в базу данных. Имя БД будет меняться каждый раз переменной, взятой из первого набора данных, и результаты будут все добавлены в одну таблицу или результат.
- С каждой итерацией цикла меняйте переменную на ID каждого элемента в результатах, которые повторяются.
Я не очень знаком с настройкой циклов или переменных в SQL, и у меня возникают проблемы с его пониманием.
Это выполняется в SQL Server Management Studio.
Это то, что я понял до сих пор: код начинается с создания оператора select, чтобы найти все имена баз данных, через которые мне нужно будет пройти. Существует два кода состояния, которые, когда это состояние, должны перебирать таблицу для номеров элементов и ее размера.
Второй оператор выбора собирает всю информацию, которую необходимо преобразовать, и помещает ее в таблицу. Цикл начнется до того, как этот запрос будет выполняться несколько раз, используя идентификаторы каждого результата из первой таблицы в качестве имени запрашиваемой базы данных.
/* This is the code I have so far. I'll explain what I'm doing and thinking in the comments*/
/* In this first select statement I'm finding all the databases that
will need to be iterated through. I figure I can pull the names,
create a table or array that contains them then run the iteration
once per item in the array using the DB name as a variable that will
change with each iteration */
select *
from edds.eddsdbo.[Case]
where statuscodeartifactid like 178079
or StatusCodeArtifactID like 103428
/* Once this first statement has been run I will now I have a
number column that is the artificatID. Each database has an area that is
titled [EDDS'artifactID']. So if the artifactID = 1111111,
then the DB would be accessed at [EDDS1111111] */
Drop Table #temptable
/* If the temptable has been created before this drops the table
so the operation can be run again and refill the table.*/
/* This select statement pulls the information that will be placed
into the temptable. This second statement should be inside the loop.
One time for each DB that appeared in the first query's results. */
SELECT
[DestinationWorkspace],
[TotalItems], [FilesSize],
CAST(LEFT(FilesSize, PATINDEX('%[0-9-.][^0-9-.]%', FilesSize )) AS MONEY) AS Filenumber,
LTRIM(RIGHT(FilesSize, LEN(FilesSize) - PATINDEX('%[a - z]%', FilesSize ))) AS Unit
INTO
#temptable
/* The 'from' portion of the statement is where I'll be needing to put
in the artifactID variable. Where it says [EDDS1111111] I'd like to
be able to have to say [EDDS@variable] where that variable is
whatever the artifactID is of that particular round of iteration*/
FROM
[EDDS1111111].[EDDSDBO].[JobHistory]
WHERE
ItemsTransferred > 0
AND Overwrite = 'Append Only'
AND endtimeutc > '2019-03-31'
/* After the above statement has been run multiple times and
appended all queries into the temp table the final select statement
does some math on the entire table and converts the values into the
desired units.*/
select
DestinationWorkspace, TotalItems,
case
when right([Unit], 2) = 'KB'
then FileNumber / 1024 / 1024
when right([Unit], 2) = 'MB'
then FileNumber / 1024
else FileNumber
end as 'Gigs'
from
#temptable
Прямо сейчас приведенный выше код работает нормально, но мне нужно выяснить, как поместить итерацию вокруг среднего оператора и создать, а затем установить переменную, которая будет меняться при каждой итерации в качестве идентификатора записи, которая повторяется в Первый стол
Спасибо за любую помощь, которую вы можете предложить.