[sql-server] T-SQL에서 테이블 변수를 SELECT INTO

테이블 변수에 모든 행을 삽입하려는 복잡한 SELECT 쿼리가 있지만 T-SQL에서는 허용하지 않습니다.

같은 행을 따라 SELECT INTO 또는 INSERT EXEC 쿼리에 테이블 변수를 사용할 수 없습니다.
http://odetocode.com/Articles/365.aspx

간단한 예 :

declare @userData TABLE(
                        name varchar(30) NOT NULL,
                        oldlocation varchar(30) NOT NULL
                       )

SELECT name, location
INTO @userData
FROM myTable
    INNER JOIN otherTable ON ...
WHERE age > 30

테이블 변수의 데이터는 나중에 다른 테이블에 다시 삽입 / 업데이트하는 데 사용됩니다 (대부분 작은 업데이트로 동일한 데이터의 사본). 이 작업의 목적은 SELECT INTO올바른 테이블에 직접 액세스 하는 것보다 스크립트를 좀 더 읽기 쉽고 쉽게 사용자 정의 할 수 있도록하는 것 입니다. 성능은 문제가되지 않습니다. rowcount상당히 작고 필요할 때만 수동으로 실행되기 때문입니다.
… 또는 내가 잘못하고 있는지 말 해주세요.



답변

다음과 같이 해보십시오 :

DECLARE @userData TABLE(
    name varchar(30) NOT NULL,
    oldlocation varchar(30) NOT NULL
);

INSERT INTO @userData (name, oldlocation)
SELECT name, location FROM myTable
INNER JOIN otherTable ON ...
WHERE age > 30;


답변

의 목적 SELECT INTO은 (문서마다, 나의 강조점)

다른 테이블의 값에서 새 테이블 을 만들려면

하지만 당신은 이미 목표 테이블을! 그래서 당신이 원하는 것은

INSERT문은 테이블에 하나 개 이상의 새 행을 추가합니다

다음과 같은 방법으로 데이터 값을 지정할 수 있습니다.

이용함으로써 SELECT같은 하나 이상의 행에 대한 데이터 값을 지정하는 서브 쿼리 :

  INSERT INTO MyTable
 (PriKey, Description)
        SELECT ForeignKey, Description
        FROM SomeView

그리고에서 구문, 그것은 수있어 MyTable테이블 변수가 될 수 있습니다.


답변

공통 테이블 표현식을 사용하여 임시 데이터 세트를 저장할 수도 있습니다. 그들은 더 우아하고 친절합니다.

WITH userData (name, oldlocation)
AS
(
  SELECT name, location
  FROM   myTable    INNER JOIN
         otherTable ON ...
  WHERE  age>30
)
SELECT *
FROM   userData -- you can also reuse the recordset in subqueries and joins


답변

응용 프로그램에서 임시 테이블을 사용하지 않는 경우 임시 테이블을 사용해 볼 수 있습니다. (수동으로 실행해도 괜찮습니다)

SELECT name, location INTO #userData FROM myTable
INNER JOIN otherTable ON ...
WHERE age>30

그런 식으로 테이블을 선언하는 노력을 건너 뜁니다 … 임시 쿼리에 대한 도움말 … 이것은 동일한 세션에 있지 않으면 다른 세션에 표시되지 않는 로컬 임시 테이블을 만듭니다. 앱에서 쿼리를 실행하는 경우 문제가 될 수 있습니다.

앱에서 실행 해야하는 경우 다음과 같이 선언 된 변수를 사용하십시오.

DECLARE @userData TABLE(
    name varchar(30) NOT NULL,
    oldlocation varchar(30) NOT NULL
);

INSERT INTO @userData
SELECT name, location FROM myTable
INNER JOIN otherTable ON ...
WHERE age > 30;

편집 : 많은 사람들이 연결에서 세션에 대한 가시성을 업데이트했다고 언급했습니다. 세션을 재사용 할 수 있으므로 임시 테이블을 작성하는 것은 웹 애플리케이션의 옵션이 아닙니다.


답변

INSERT대신에 사용하십시오 SELECT INTO:

INSERT @UserData
SELECT name, location etc.


답변

먼저 임시 테이블을 만듭니다.

1 단계:

create table #tblOm_Temp (

    Name varchar(100),
    Age Int ,
    RollNumber bigint
)

** 2 단계 : ** 임시 테이블에 일부 값 삽입.

insert into #tblom_temp values('Om Pandey',102,1347)

3 단계 : 임시 테이블 데이터를 보유 할 테이블 변수 선언

declare   @tblOm_Variable table(

    Name Varchar(100),
    Age int,
    RollNumber bigint
)

4 단계 : 임시 테이블에서 값을 선택하고 테이블 변수에 삽입하십시오.

insert into @tblOm_Variable select * from #tblom_temp

마지막으로 임시 테이블에서 테이블 변수로 값이 삽입됩니다.

5 단계 : 테이블 변수에 삽입 된 값을 확인할 수 있습니다.

select * from @tblOm_Variable


답변

OK, 이제 충분한 노력으로 아래를 사용하여 @table에 삽입 할 수 있습니다.

INSERT @TempWithheldTable SELECT
a.SuspendedReason, a.SuspendedNotes, a.SuspendedBy, a.ReasonCode FROM OPENROWSET (BULK ‘C : \ DataBases \ WithHeld.csv’, FORMATFILE = N’C : \ DataBases \ Format.txt ‘,
ERRORFILE = N’C : \ Temp \ MovieLensRatings.txt ‘) AS a;

여기서 중요한 것은 삽입 할 열을 선택하는 것입니다.