본문 바로가기

프로그래밍&IT/SQL Server (MS-SQL)

데이터 조작 - 데이터 입력하기 (INSERT VALUES, SELECT, BULK)

- 아는 것도 있지만, 살짝 아리까리한것도 있어서 한 번에 정리

 

* INSERT VALUES (& 향상된 VALUES)

- 대부분이 많이 아는 (기초적인) 구문일듯. 

INSERT INTO dbo.Orders(orderid, empid, custid) VALUES(10002, 5, 'B');
INSERT INTO dbo.Orders (orderid, orderdate, empid, custid)
VALUES
(10003, '20090213', 4, 'B') ,
(10004, '20090214', 1, 'A') ,
(10005, '20090213', 1, 'C') ,
(10006, '20090215', 3, 'C'); -- 여러 행을 쉼표로 구분해서 넣을수도

사실은 이 구문보단 아래의 사항을 복습하려는게 목적이었다.

 

- 파생이나 임시 테이블을 만들때, 테이블 생성자로 사용할 수도 있다

SELECT * FROM (
	VALUES
		(101, '20110101', 1),
		(102, '20120201', 2),
		(103, '20130101', 3)
	) AS TMP (orderid, orderdate, empid);

 

파생/임시 테이블 만들기

 

* INSERT SELECT

SELECT 쿼리로부터 반환되는 행 집합을 대상 테이블에 저장하고자 할 때 사용된다.

VALUES 절 대신 SELECT 쿼리를 사용한다는 점에서 차이가 있다.

INSERT INTO dbo.Orders (orderid, orderdate, empid, custid)
	SELECT orderid, orderdate, empid, custid
	FROM Sales.Orders
	WHERE shipcountry = 'UK';

 

* INSERT EXEC

저장 프로시저나 동적 SQL 배치 작업으로부터 반환되는 결과집합을 대상 테이블로 저장할 때 사용된다.

SELECT 구문대신 EXEC 구문을 사용한다는 점만 다르다.

ex) 아래 같은 프로시저를 존재한다면,

IF OBJECT_ID('Sales.USP_GetOrders','P') IS NOT NULL
	DROP PROC Sales.USP_GetOrders;
GO
CREATE PROC Sales.USP_GetOrders @country AS NVARCHAR(40) AS
	SELECT orderid, orderdate, empid, custid
	FROM Sales.Orders
	WHERE shipcountry = @country;
GO
INSERT INTO dbo.Orders (orderid, orderdate, empid, custid)
EXEC Sales.USP_GetOrders @country = 'France';

 

* SELECT INTO

대상 테이블을 생성한 후, 쿼리의 결과 집합을 생성한 테이블에 저장. (비표준 T-SQL 구문)

조회 쿼리의 SELECT 절에 있는 FROM 앞에 INTO <대상 테이블> 추가하면 된다.

IF OBJECT_ID('dbo.Orders','U') IS NOT NULL DROP TABLE dbo.Orders;

SELECT orderid, orderdate, empid, custid
INTO dbo.Orders
FROM Sales.Orders;

 

* BULK INSERT

파일에 있는 데이터를 기존 테이블에 저장할 때 사용된다.

대상 테이블, 원본 파일 그리고 옵션을 설정한다

BULK INSERT dbo.Orders FROM 'c:\order.txt'
WITH (
	DATAFILETYPE = 'char' ,
	FIELDTERMINATOR = ',',
	ROWTERMINATOR = '\n'
);