2009-03-27 17 views

答えて

37

は、実際にテーブル変数、メモリ内のテーブルを使用して、行くための最適な方法です。 #tableはtemp dbにテーブルを作成し、## tableはグローバルで、両方ともディスクヒットで作成します。トランザクションの数が減速した/ヒットした場合を考えてみましょう。

CREATE PROCEDURE [dbo].[GetAccounts] 
    @AccountID BIGINT, 
    @Result INT OUT, 
    @ErrorMessage VARCHAR(255) OUT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SET @Result = 0 
    SET @ErrorMessage = '' 

    DECLARE @tmp_Accounts TABLE (
               AccountId BIGINT, 
AccountName VARCHAR(50), 
... 
) 

INSERT INTO @tmp_Accounts ([AccountId], [AccountName]... 
) 
SELECT AccountID, AccountName 
FROM Accounts 
WHERE ... 


    IF @@Rowcount = 0 
     BEGIN 
      SET @ErrorMessage = 'No accounts found.' 
      SET @Result = 0 

      RETURN @Result 
     END 
    ELSE 
     BEGIN 
      SET @Result = 1 

      SELECT * 
      FROM @tmp_Accounts 
     END 

この一時表に挿入する方法に注意してください。

これは、テーブル変数を定義する必要があるため、書き込むのに少し時間がかかることがあります。

また、RedGateによるクエリアナライザーのSQLプロンプトもお勧めします。

+1

ただし、テーブル変数はコンパイル時に定義する必要があります実行時よりも右か?このために私は動的に生成されたテーブルが必要でした。 – Jeff

+0

テーブル変数はsprocで定義されています。 – ElHaix

+1

Ughですが、これは非常に冗長です。特にTSQLには「Insert-or-update」ステートメントがありません。 –

10

はい、あなたはのは

SELECT * INTO #t 
FROM OPENQUERY('server', 
'exec database.dbo.proc_name value1, value2, ... ') 
+0

ああ、それは彼が意味するものです! –

+0

これはテーブル変数で動作しますか? – recursive

+0

私は知らない、申し訳ありません。 – boj

28

あなたはOPENQUERYを必要としないとしましょう

SELECT INTO ... 

でそれを作成することができます。ただ、選択リストの間で「INTO #AnyTableName」を入れて、任意のクエリのFROM ...

SELECT * 
    INTO #Temp1 
    FROM table1 
    WHERE x=y 
+0

またはTable1から#Temp1に0 * 1を選択する – GernBlandston

+4

このメソッドを使用する場合は、プロシージャの最後に 'drop table#Temp1'を実行することを忘れないでください。 – Matthieu

関連する問題