1

好的,所以我不确定我是否以正确的方式进行此操作。但我的情况是我有一个存储过程,我想使用它所需要的所有可能的输入组合来测试。

假设我有一个带有两个参数的存储过程,如下所示:

set UsefulValue = exec spMyStoredProc @ProfileID, @RoleID

现在在我的例子中,ProfileID 意味着类似于的东西,而 RoleID 意味着类似于系统角色的东西。我故意在这里有点笼统。关键是,我有大约 60,000 个已定义的人员,以及大约 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

4 回答 4

3

如果我理解你想要一些测试用例的问题,但不希望它们生成有利于特定角色/人(交叉连接对你做的)。

select top 300000
profiles.ProfileObjID, roles.RoleName 
from dbo.Profile profiles 
cross join dbo.rj_v_DefinedRoles roles
order by newid()

order by 将随机化您的结果,然后将结果置于顶部以获得随机测试数据集。这当然不会保证任何特定的角色/人在最终结果中,这是一个百分比机会等。

于 2011-10-26T12:19:28.507 回答
1

您可以在几个不同的地方使用 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
于 2011-10-26T12:23:18.113 回答
0

您是否尝试过使用DISTINCT关键字?

从 dbo.Profile 配置文件中选择DISTINCTprofiles.ProfileObjID、roles.RoleName 交叉加入 dbo.rj_v_DefinedRoles 角色

于 2011-10-26T12:16:27.917 回答
0

这运作良好。大大减少了执行交叉连接所需的时间。

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) 
于 2011-10-26T12:43:57.470 回答