SELECT INTO #temp .. FROM [Query1]或[Query2]

时间:2013-02-08 15:36:08

标签: sql sql-server-2008-r2

添加了说明:我的代码在存储过程中运行。

多年来我多次遇到这个问题,所以我想我会咬紧牙关,最后问,即使我认为我可能会错过一个简单的解决方案。

我喜欢使用

的情况
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

2 个答案:

答案 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