web-dev-qa-db-ja.com

SQL ServerのSELECT INTO @変数?

私のSql(2008)Stored Procsには、以下のコードがあります。

    CREATE PROCEDURE [dbo].[Item_AddItem]
        @CustomerId uniqueidentifier,
        @Description nvarchar(100),
        @Type int,
        @Username nvarchar(100),
    AS
    BEGIN

        DECLARE @TopRelatedItemId uniqueidentifier;
        SET @TopRelatedItemId = 
        (
           SELECT top(1) RelatedItemId 
           FROM RelatedItems 
           WHERE CustomerId = @CustomerId
        ) 

        DECLARE @TempItem TABLE
        (
            ItemId uniqueidentifier,
            CustomerId uniqueidentifier,
            Description nvarchar(100),
            Type int,
            Username nvarchar(100),
            TimeStamp datetime
        );

        INSERT INTO Item
        OUTPUT INSERTED.* INTO @TempItem
        SELECT NEWID(), @CustomerId, @Description, @Type, @Username, GETDATE()

        SELECT
            ItemId,
            CustomerId,
            @TopRelatedItemId,
            Description,
            Type,
            Username,
            TimeStamp
        FROM
            @TempItem
END
GO

それで、皆さんへの質問は以下の行に沿って何かをする可能性があるということです -

DECLARE @TempCustomer TABLE
(
   CustomerId uniqueidentifier,
   FirstName nvarchar(100),
   LastName nvarchar(100),
   Email nvarchar(100)
);
SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email 
INTO 
    @TempCustomer 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId

それで、私が他の次のステートメントでメモリからこのデータを再利用できるように? SQL Serverは上記のステートメントと一致するが、私は別々の変数を作成し、同じテーブルに対して別々のSELECTステートメントを介してそれらのそれぞれを初期化する必要はありません。

同じテーブルに対して複数のクエリを実行せずに、行に沿って何かを達成する方法について何か提案はありますか?

218
bleepzter

あなたはテーブル変数を選択することはできません。あなたができる最善の方法は、まずそれを作成してからそれに挿入することです。あなたの2番目のスニペットは

DECLARE @TempCustomer TABLE
(
   CustomerId uniqueidentifier,
   FirstName nvarchar(100),
   LastName nvarchar(100),
   Email nvarchar(100)
);
INSERT INTO 
    @TempCustomer 
SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId
189
RichardTheKiwi

後で使用するために単純にいくつかの変数を割り当てたい場合は、以下の行に沿って何かを使ってそれらをワンショットで行うことができます。

declare @var1 int,@var2 int,@var3 int;

select 
    @var1 = field1,
    @var2 = field2,
    @var3 = field3
from
    table
where
    condition

それがあなたが後にしていることのタイプであるならば

454
dougajmcdonald

あなたはこれを行うことができます:

SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email
INTO #tempCustomer 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId

じゃあ後で

SELECT CustomerId FROM #tempCustomer

#tempCustomerの構造を宣言する必要はありません。

構文が少し外れているようです。これにはいくつかあります 良い例

DECLARE @TempCustomer TABLE
(
   CustomerId uniqueidentifier,
   FirstName nvarchar(100),
   LastName nvarchar(100),
   Email nvarchar(100)
);
INSERT @TempCustomer 
SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId

じゃあ後で

SELECT CustomerId FROM @TempCustomer
14
Pat L

あなたは一時テーブルが欲しいようですね。 http://www.sqlteam.com/article/temporary-tables

#TempTableはSP全体で利用可能です。

## TempTableはすべての人に利用可能です。

2
Valamas

私はあなたの質問が同じ問題に対する解決策を探しているのを見つけました。そして他の答えが指摘していないのは、一時的ではなく永久的な形式であなたの手続きの実行毎に変数を使ってテーブルの名前を変更する方法です。

これまでは、SQLコード全体を使用する変数と連結していました。このような:

declare @table_name as varchar(30)
select @table_name = CONVERT(varchar(30), getdate(), 112)
set @table_name = 'DAILY_SNAPSHOT_' + @table_name

EXEC('
        SELECT var1, var2, var3
        INTO '+@table_name+'
        FROM my_view
        WHERE string = ''Strings must use double apostrophe''
    ');

私はそれが役立つことを願っていますが、コードが大きすぎると厄介になるかもしれません。

0
Rodrigo