3

追加された説明:私のコードはストアドプロシージャ内で実行されます。

私は何年にもわたってこの問題に何度も遭遇したので、簡単な解決策が欠けているかもしれないとは思いますが、弾丸を噛んで最終的に尋ねると思いました。

多くの場合、私が使用するのが好きな場合です

SELECT * INTO #Temp FROM ...

..小さなデータセットで使用すると、一般的に他のどの一時テーブル生成手段よりもパフォーマンスが向上することがわかったためです。

ただし、複数の「モード」で実行できるパラメーター化されたクエリがある場合があるため、このモードに応じて2つの完全に異なるソースから#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)

この例では、ロールまたはユーザーのいずれかの特権のセットを取得しようとしています。1つはテーブルから直接、もう1つは関数から取得します。

通常のINSERTINTO..ロジックを使用できることはわかっていますが、この方法でそれを行うための実際の解決策があるかどうかを確認したいと思います。多分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」を使用してstaetmentsを分離します。

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 に答える