반응형
반응형

MS-SQL은 기본 설정이 AUTO_COMMIT으로 되어있습니다.

INSERT, UPDATE, DELETE 등 명령어를 사용할 때 COMMIT 명령어를 입력할 필요가 없습니다.

그렇기 때문에 UPDATE, DELETE 쿼리 수행 중 실수를 하게 된다면... 지옥을 경험할 수도 있습니다.. ㅠㅠ

 

예를 들어서 MEMBER라는 테이블이 있다고 가정하겠습니다. 멤버 테이블의 회원 삭제는 이력을 남기기 위해서 소프트 delete처리를 합니다. 이런일이 생기면 안되겠지만, 쿼리를 사용하여 회원을 삭제한다고 가정하겠습니다. 

UPDATE MEMBER
SET DELETED = 1
WHERE MEMBER_SEQ = 1;

 

위와 같이 정상적으로 작성하면 좋겠지만, 우리는 사람이라 가끔 실수를 하곤 합니다.

UPDATE MEMBER
SET DELETED = 1;
WHERE MEMBER_SEQ = 1;

뭐가 잘못됐는지 확인이 되시나요??

생각만해도 지옥문에 들어가기 전이네요...

쿼리는 진짜 아무리 숙련된 사람이라도 실수할 수 있기 때문에 조심해야 한다고 생각합니다.

 

이럴 때 MS-SQL에서는 BEGIN TRAN이라는 명령어를 제공합니다.

BEGIN TRAN
UPDATE MEMBER
SET DELETED = 1
WHERE MEMBER_SEQ = 1;

이렇게 사용하고

SELECT * FROM MEMBER
WHERE MEMBER_SEQ = 1;

 

위와 같이 검증 쿼리로 확인하여,

정상이라면 COMMIT TRAN; 으로  내용을 반영해주면 됩니다.

 

반대로 잘못 반영되었을 땐

ROLLBACK TRAN;으로 트렉젝션을 롤백하면 됩니다.

 

BEGIN TRAN을 사용하고는 꼭! COMMIT TRAN 이나 ROLLBACK TRAN을 사용해줘야 합니다.

만약 잊고, 사용하지 않았다면.. TRANSACTION이 계속 잡혀 있는 상태여서 DB가 정상 동작하지 않습니다. 

검증하는 시간도 그만큼 길면 안되겠지요.

반응형
반응형

 

 

[MSSQL] 랜덤 (무작위) Select


Select Top 10 * From 테이블명 Order by NEWID()


-- RAND() 난수 발생
select RAND() as rnd;
select convert(int, RAND()*100) as r1 -- 3자리 정수 추출 (0~999)
     , RIGHT(RAND(), 5)         as r2 --  임의의 5자리 숫자 추출

--정수형 난수
--최대값와 최소값을 포함할 때  
declare @max -- 최대값
declare @min -- 최소값
 
SELECT CONVERT(INT, ((@max + 1) - @min) * RAND()  + @min)

 

 

https://github.com/ngio/DB_query_mssql/blob/main/%EB%9E%9C%EB%8D%A4_select_NEWID_RAND.sql

반응형

'프로그래밍 > DataBase' 카테고리의 다른 글

[MSSQL] Multi UPDATE, 다중 UPDATE  (0) 2023.07.19
[MS-SQL] Begin Tran  (0) 2023.07.19
[MSSQL] IF…ELSE IF…ELSE  (0) 2023.07.14
[MSSQL] 월의 마지막 날짜 구하기  (0) 2023.07.03
[MSSQL] 날짜차이, 이전 행 정보 LAG LEAD  (0) 2023.07.03
반응형

 IF…ELSE IF…ELSE 

 

https://simplesqltutorials.com/if-elseif-else/

 

The IF…ELSE IF….ELSE Statement: Everything You Should Know

The IF...ELSE structure and the IF...ELSE IF...ELSE structure are the most basic SQL Server Decision Structures you should know.

simplesqltutorials.com

IF(<condition is true>)
BEGIN
<execute some code>
END
ELSE IF(<different condition is true>)
BEGIN
<execute some other code>
END
ELSE
BEGIN
<execute some other other code>
END
반응형
반응형

월의 마지막 날짜 구하기

SELECT EOMONTH('2020-09-09') AS result

SELECT DATEADD (DAY, -1, DATEADD (MONTH, DATEDIFF (MONTH, 0, '2020-09-09') + 1, 0)) AS result


SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, '2020-09-09') + 1, 0) - 1 AS result
반응형
반응형

DATEDIFF, DATEPART

SELECT DATEDIFF(DAY,   '2021-06-12', '2021-07-13') AS [일차이]
     , DATEDIFF(MONTH, '2021-06-12', '2021-07-13') AS [개월차이] 
     , DATEDIFF(YEAR,  '2021-06-12', '2021-07-13') AS [년차이]

 

LAG, LEAD

https://learn.microsoft.com/en-us/sql/t-sql/functions/lag-transact-sql?view=sql-server-ver16 

 

LAG (Transact-SQL) - SQL Server

LAG (Transact-SQL)

learn.microsoft.com

SELECT empno  
     , ename
     , job
     , sal
     , LAG(sal) OVER(PARTITION BY job ORDER BY job, sal) AS sal_prev
     , LEAD(sal) OVER(PARTITION BY job ORDER BY job, sal) AS sal_next
  FROM emp
 WHERE job IN ('MANAGER', 'ANALYST', 'SALESMAN')
 ORDER BY job, sal
 
 
 CREATE TABLE T (a INT, b INT, c INT);   
GO  
INSERT INTO T VALUES (1, 1, -3), (2, 2, 4), (3, 1, NULL), (4, 3, 1), (5, 2, NULL), (6, 1, 5);   
  
SELECT b, c,   
    LAG(2*c, b*(SELECT MIN(b) FROM T), -c/2.0) OVER (ORDER BY a) AS i  
FROM T;

https://learn.microsoft.com/en-us/sql/t-sql/functions/lead-transact-sql?view=sql-server-ver16 

 

LEAD (Transact-SQL) - SQL Server

LEAD (Transact-SQL)

learn.microsoft.com

CREATE TABLE T (a INT, b INT, c INT);   
GO  
INSERT INTO T VALUES (1, 1, -3), (2, 2, 4), (3, 1, NULL), (4, 3, 1), (5, 2, NULL), (6, 1, 5);   
  
SELECT b, c,   
    LEAD(2*c, b*(SELECT MIN(b) FROM T), -c/2.0) OVER (ORDER BY a) AS i  
FROM T;
반응형
반응형

명시적 값을 테이블의 ID 열에 삽입할 수 있도록 합니다.

 

https://github.com/ngio/DB_query_mssql/blob/main/SET_IDENTITY_INSERT.sql

 

GitHub - ngio/DB_query_mssql: mssql and Query

mssql and Query . Contribute to ngio/DB_query_mssql development by creating an account on GitHub.

github.com

USE AdventureWorks2012;  
GO  
-- Create tool table.  
CREATE TABLE dbo.Tool(  
   ID INT IDENTITY NOT NULL PRIMARY KEY,   
   Name VARCHAR(40) NOT NULL  
);  
GO  
-- Inserting values into products table.  
INSERT INTO dbo.Tool(Name)   
VALUES ('Screwdriver')  
        , ('Hammer')  
        , ('Saw')  
        , ('Shovel');  
GO  
  
-- Create a gap in the identity values.  
DELETE dbo.Tool  
WHERE Name = 'Saw';  
GO  
  
SELECT *   
FROM dbo.Tool;  
GO  
  
-- Try to insert an explicit ID value of 3;  
-- should return an error:
-- An explicit value for the identity column in table 'AdventureWorks2012.dbo.Tool' can only be specified when a column list is used and IDENTITY_INSERT is ON.
INSERT INTO dbo.Tool (ID, Name) VALUES (3, 'Garden shovel');  
GO  
-- SET IDENTITY_INSERT to ON.  
SET IDENTITY_INSERT dbo.Tool ON;  
GO  
  
-- Try to insert an explicit ID value of 3.  
INSERT INTO dbo.Tool (ID, Name) VALUES (3, 'Garden shovel');  
GO  
  
SELECT *   
FROM dbo.Tool;  
GO  
-- Drop products table.  
DROP TABLE dbo.Tool;  
GO
반응형

+ Recent posts