mssql 동적쿼리

서세윤·2025년 1월 15일

난 여태 개발을 무엇을 해왔는가..
php, laravel +mysql 위주로 개발해왓던 나에게 혹은 내가 물경력일수도 있고...

mssql을 실행하는데 몇몇개의 테이블은 데이터가 너무 많아서 해당 테이블을 체크하기 위해
select 를 해버리면 쿼리 실행시간이 너무길어 다시 취소하는게 대부분 이었다.

그래서 스키마로 테이블 조회후 pk값을 order by로 걸어, OFFSET을 걸어줬다.

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='table'
SELECT * from 'table' order by 'pk_column' DESC OFFSET 0 ROWS FETCH NEXT 1000 ROWS ONLY

위처럼 해왓고, 여러개의 테이블을 체크할때면 매번 실행쿼리에서 테이블 검색 후, 컬럼을 가져와 검색하는게 너무너무 귀찮앗다.

그러던 중 테이블명 만으로 확인을 하고싶었고 동적쿼리란것을 알게되었다.

쉽게 말하면 변수 선언 , 쿼리를 만들고 , 만든쿼리에 파라미터 를 설정후 그 파라미터에 맞는 변수를 집어넣는 형식이었다.

그렇게 만들어진 동적쿼리는 아래와 같다.

DECLARE @table VARCHAR(100) = '테이블명'
DECLARE @col VARCHAR(30)
DECLARE @check NVARCHAR(MAX) = 'select TOP 1 @col = COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=@table'

DECLARE @PARAM NVARCHAR(100) = '@col VARCHAR(30) OUTPUT ,
								@table VARCHAR(100)' /* OUTPUT 선언을 통해,해당 값을 다시 반환받을것을 선언 */
EXEC sp_executesql @check,@PARAM,@col OUTPUT , @table /* OUTPUT을 동해 반환된 값을 최종 반영*/

DECLARE @sql NVARCHAR(MAX)
SET @sql = 'select * from '+@table+' order by '+@col+' DESC OFFSET 0 ROWS FETCH NEXT 1000 ROWS ONLY'

EXEC sp_executesql @sql 

위 동적쿼리를 알아보면 제일 헷갈렸던게 PARAM과 OUTPUT이다.

PARAM은 함수 만들때 function ABC(param) 이라고 생각하면 된다.
OUTPUT은 , php로 치면 global이라고 생각하면 쉽고,, 다른 언어로는 모르겠지만. 동적쿼리 내에서 변수가 끝나는게 아닌, 외부에서도 똑같이 반영되도록 선언해주는 것이라고 보면된다.
즉, @table 값은 OUTPUT을 선언해주지 않았는데, @check 쿼리 안에서 @table값에 어떤식으로 다시 할당해도, 반영되지 않는다는 뜻이다.

이렇게.. DB에대해 조금 더 알게되었다

근데..mssql이 뭔가 더 명시적이지 않고 어려운듯..ㅜ

profile
개잡부..

0개의 댓글