添加说明:我的代码在存储过程中运行。
多年来我多次遇到这个问题,所以我想我会硬着头皮最后问,即使我认为我可能错过了一个简单的解决方案。
通常是我喜欢使用的情况
SELECT * INTO #Temp FROM ...
.. 因为我发现在小型数据集上使用它时,它通常比任何其他临时表生成方式表现更好。
但有时我会有一个可以在多个“模式”下运行的参数化查询,因此需要我的语句能够根据此模式从两个完全不同的来源填充#Temp,例如
选项1
IF @RoleID > -1
SELECT PrivilegeID INTO dbo.#Privs FROM Users.tblRolePrivilegeLink WHERE RoleID = @RoleID
选项 2
IF @UserID > -1
SELECT PrivilegeID INTO dbo.#Privs FROM dbo.fn_UserPrivileges(@UserID)
在此示例中,我试图为角色或用户获取一组权限,一个直接来自表,另一个来自函数。
我知道我可以使用常规的 INSERT INTO.. 逻辑,但我真的很想看看是否有实际的解决方案可以这样做。也许与 CTE 或类似的。
解决方案
-- Get distinct privileges
SELECT PrivilegeID
INTO dbo.#Privs
FROM
(
SELECT PrivilegeID FROM Users.tblRolePrivilegeLink WHERE RoleID > -1 AND RoleID = @RoleID
UNION
SELECT PrivilegeID FROM dbo.fn_UserPrivileges(@UserID) WHERE @UserID > -1
) AS T