Крест Присоединяйтесь! В SQL Server, но мне действительно нужно только около трети строк?
Хорошо, так что я не уверен, что пойду правильно. Но мой сценарий состоит в том, что у меня есть хранимая процедура, которую я хотел бы протестировать, используя все возможные комбинации входных данных.
Допустим, у меня есть хранимая процедура, которая принимает два параметра, например:
set UsefulValue = exec spMyStoredProc @ProfileID, @RoleID
Теперь в моем случае ProfileID означает что-то вроде людей, а RoleID означает что-то вроде системных ролей. Я намерен быть немного генералом. Дело в том, что у меня около 60000 определенных людей и около 600 определенных ролей.
К сожалению, система, которую я тестирую, является СЛОЖНОЙ, как сложный день, и мне действительно нужно пройти эту процедуру в полном темпе.
Хорошо, со мной так далеко? Надеюсь, вы; проверьте этот sql для генерации данных, которые я в конечном итоге передам хранимой процедуре:
select profiles.ProfileID, roles.RoleID from Profile profiles
cross join dbo.DefinedRoles roles
Это на самом деле довольно хорошо, но проблема в том, что на его запуск уходит вечность, и, честно говоря, мне не нужна каждая перестановка этих двух значений.
Поэтому я попытался ограничить результирующий набор следующим образом:
select top 300000 profiles.ProfileObjID, roles.RoleName from dbo.Profile profiles
cross join dbo.rj_v_DefinedRoles roles
Но упс! Это ограничивает конечный результат, поэтому я получаю только результат, который в значительной степени состоит из 2-3 ролей (в зависимости от того, что я передаю верхнему глаголу) и с ProfileID для каждого человека.
Моя цель состоит в том, чтобы получить результаты для всех ролей, которые у меня есть (около 600), и для каждой из них, возможно, использовать только половину ProfileID вместо всего Shebang.
Так имеет ли смысл то, что я спрашиваю?
4 ответа
Это сработало хорошо. ОТЛИЧНО сокращает время, необходимое для выполнения перекрестного соединения.
select profiles.ProfileObjID, roles.RoleName
from dbo.rj_v_DefinedRoles roles
cross join dbo.Profile profiles
where ProfileObjId in (select ProfileObjId from dbo.Profile
where ProfileObjId between 10000 and 11000)
Если я понимаю проблему, вы хотите несколько тестовых случаев, но не хотите, чтобы они генерировались в пользу конкретной роли / человека (какое перекрестное соединение делает с вами).
select top 300000
profiles.ProfileObjID, roles.RoleName
from dbo.Profile profiles
cross join dbo.rj_v_DefinedRoles roles
order by newid()
Порядок сортирует ваши результаты случайным образом, а затем ставит верхние значения, чтобы получить случайный набор тестовых данных. Это, конечно, не гарантирует какую-либо конкретную роль / человека в конечном результате, это процентный шанс и т. Д.
Вы можете использовать ROW_NUMBER() в нескольких разных местах, чтобы выбрать часть ваших данных...
-- Maximum of 20,000 rows per RoleID
WITH
combinations AS
(
SELECT
roles.RoleID,
profiles.ProfileID,
ROW_NUMBER() OVER (PARTITION BY roles.RoleID) AS profile_sequence_id
FROM
Profile profiles
CROSS JOIN
dbo.DefinedRoles roles
)
SELECT
*
FROM
combinations
WHERE
profile_sequence_id < 20000
Или же...
-- Maximum of 20,000 rows per RoleID
WITH
profiles AS
(
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY 1) AS profile_sequence_id
FROM
Profile
)
SELECT
roles.RoleID,
profiles.ProfileID
FROM
dbo.DefinedRoles roles
CROSS JOIN
profiles
WHERE
profiles .profile_sequence_id < 20000
Вы пытались использовать DISTINCT
ключевое слово?
Выбрать DISTINCT
profiles.ProfileObjID, role.RoleName из dbo.Profile профили перекрестного соединения ролей dbo.rj_v_DefinedRoles