programing

SQL Server SELECT IN @variable?

topblog 2023. 4. 8. 07:51
반응형

SQL Server SELECT IN @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 문을 사용하여 변수를 만들고 각 변수를 초기화할 필요는 없습니다. 으으!!

동일한 테이블에 대해 여러 개의 쿼리를 수행하지 않고 동일한 방법으로 무언가를 달성하는 방법에 대한 제안이 있습니까?

나중에 사용하기 위해 일부 변수를 할당하는 경우 다음 행에 따라 한 번에 수행할 수 있습니다.

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

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

그게 네가 원하는 거라면

선택할 수 없습니다.테이블 변수로 변환합니다.먼저 작성한 후 삽입하는 것이 최선입니다.두 번째 스니펫은

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

다음과 같이 할 수 있습니다.

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

그럼 나중에

SELECT CustomerId FROM #tempCustomer

#temp Customer의 구조를 선언할 필요는 없습니다.

구문이 약간 어긋난 것 같습니다.이것은 몇 가지 좋은 예가 있다.

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

언급URL : https://stackoverflow.com/questions/4823880/sql-server-select-into-variable

반응형