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
4

2 回答 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)
于 2013-02-08T15:43:27.237 回答
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最初不存在。

于 2013-02-08T15:45:01.507 回答