添加了说明:我的代码在存储过程中运行。
多年来我多次遇到这个问题,所以我想我会咬紧牙关,最后问,即使我认为我可能会错过一个简单的解决方案。我喜欢使用
的情况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
答案 0 :(得分:2)
SELECT *
INTO dbo.#Privs
from (
SELECT PrivilegeID
FROM Users.tblRolePrivilegeLink
WHERE RoleID = @RoleID and @RoleID > -1
UNION
SELECT PrivilegeID
FROM dbo.fn_UserPrivileges(@UserID)
WHERE @UserID > 1)
答案 1 :(得分:2)
您可以通过使用“go”分隔标记来执行此操作:
if 1=0 select 1 as v into #temp;
go
if 1=1 select 2 as v into #temp;
go
select * from #temp
此代码假定最初不存在#temp
。