[sql] SQL Server SELECT INTO @variable?

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 문을 통해 각 변수를 초기화하고 싶지는 않습니다 … UGH !!!

같은 테이블에 대해 여러 번 쿼리하지 않고도 행을 따라 무언가를 달성하는 방법에 대한 제안 사항이 있습니까?



답변

.. INTO .. ​​테이블 변수를 선택할 수 없습니다. 가장 좋은 방법은 먼저 만든 다음 삽입하는 것입니다. 두 번째 스 니펫은

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


답변

나중에 사용하기 위해 일부 변수를 간단히 지정하려면 다음 행을 따라 한 번에 변수를 지정할 수 있습니다.

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

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

그것이 당신이 따르는 것의 유형이라면


답변

당신은 이것을 할 수 있습니다 :

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


답변

임시 테이블을 원하는 것처럼 들립니다.
http://www.sqlteam.com/article/temporary-tables

#TempTable은 SP 전체에서 사용할 수 있습니다.

## TempTable은 모두 사용할 수 있습니다.


답변

귀하의 질문에 동일한 문제에 대한 해결책을 찾고 있습니다. 다른 답변이 지적하지 못하는 것은 변수를 사용하여 모든 프로 시저 실행에 대한 테이블 이름을 임시가 아닌 영구적 인 형식으로 변경하는 방법입니다.

지금까지 내가하는 일은 전체 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''
    ');

도움이되기를 바랍니다.하지만 코드가 너무 크면 성 가실 수 있으므로 더 좋은 방법을 찾으면 공유하십시오!


답변

"SELECT *
  INTO
    @TempCustomer
FROM
    Customer
WHERE
    CustomerId = @CustomerId"

이는 새로운 @tempCustomer테이블 변수를 생성하고 고객으로부터 데이터를 삽입 하는 것을 의미 합니다. 이미 위에서 선언 했으므로 다시 선언 할 필요가 없습니다. 함께하는 것이 좋습니다

INSERT INTO @tempCustomer SELECT * FROM Customer