从[Query1]或[Query2]中选择并插入到#temp中

3

澄清说明: 我的代码是在存储过程中运行的。

这些年来我遇到了多次这个问题,所以我想我可能错过了一个简单的解决方案,所以今天我终于问了出来。

通常情况下,我喜欢使用

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个回答

3
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)

如果你尝试编译它,会出现错误,因为它不允许你两次选择相同的表。 - Janine Rawnsley
好的,那个可行,谢谢。看起来其实很简单,可能是因为看不到树木而感到困惑。 :) - Janine Rawnsley

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最初不存在。

@JanineRawnsley...不可以。我在问题中没有看到这个要求。 - Gordon Linoff
是的,抱歉,有时候我会忘记不是每个人都使用SPs ;-) - Janine Rawnsley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接