sql server 는 공용 표 표현 식 CTE 를 사용 하여 유 니 버 설 함 수 를 재 귀적 으로 작성 하여 연속 숫자 와 날 짜 를 자동 으로 생 성 합 니 다.
데이터베이스 스 크 립 트 개발 에 있어 서 연속 숫자 나 날 짜 를 만들어 야 할 때 가 있 습 니 다.예 를 들 어 yearly report 는 연 도 를 연속 으로 해 야 합 니 다.예 를 들 어 daily report 는 일정한 시간 범위 내의 하루 날 짜 를 만들어 야 합 니 다.
자체 시스템 표 master.sptvalues 는 일정한 한계 가 있 습 니 다.0 에서 2047(검증 스 크 립 트:
select * from master..spt_values b where b.type = 'P'
까지 만 연속 날 짜 를 직접 생 성 할 수 없습니다.대부분의 사람들 은 while 순환 을 통 해 데 이 터 를 임시 표 에 하나씩 삽입 하고 숫자 에 1 이나 날 짜 를 1 일 추가 하 는 어 리 석 은 방법 을 생각 할 수 있 지만 이렇게 하면 데이터베이스 서버 와 의 상호작용 이 너무 빈번 하 다.1W 개의 연속 숫자 를 생 성 한다 면 데이터베이스 서버 와 1W 번 대화 해 야 합 니 다.무 섭 습 니 다!1000 개의 클 라 이언 트 가 이 while 순환 을 호출 해 야 한다 면 1000 W 번 입 니 다!무섭다!
해결 방안:
공용 표 표현 식 CTE 를 사용 하여 재 귀적 으로 실현 할 수 있 으 며,유 니 버 설 표 값 함수 로 편리 하 게 호출 할 수 있 습 니 다.패 키 징 을 간소화 하여 표 형식 데 이 터 를 되 돌려 줍 니 다.
CTE 는 서버 와 클 라 이언 트 를 왕복 할 때마다 메모리 에 데 이 터 를 준비 하 는 것 이 아 닙 니 다.임시 표 에 다시 삽입 해 야 한다 면 모든 데 이 터 를 한꺼번에 삽입 하 는 것 이다.
입력 매개 변수 가 숫자 라면 연속 숫자 를 생 성 합 니 다.인자 가 날짜 로 들 어 오 면 연속 날짜 가 생 성 됩 니 다.
너무 편 하지 않 아 요?
함수 스 크 립 트:
if object_id('dbo.fun_ConcatStringsToTable') is not null drop function dbo.fun_ConcatStringsToTable
go
/*
: ( ) table
:zhang502219048 2018-12-10
:https://www.cnblogs.com/zhang502219048/p/11108991.html
-- 1( ):
select * from dbo.fun_ConcatStringsToTable(1, 10000)
-- 2( ):
select * from dbo.fun_ConcatStringsToTable('1', '10000')
-- 3( ):
declare @dateBegin datetime = '2009-1-1', @dateEnd datetime = '2018-12-31'
select * from dbo.fun_ConcatStringsToTable(@dateBegin, @dateEnd)
-- 4( ):
select * from dbo.fun_ConcatStringsToTable('2009-1-1', '2018-12-31')
**/
create function [dbo].[fun_ConcatStringsToTable]
(
@strBegin as nvarchar(100),
@strEnd as nvarchar(100)
)
returns @tempResult table (vid nvarchar(100))
as
begin
--
if isnumeric(@strBegin) = 1 and isnumeric(@strEnd) = 1
begin
-- CTE
;with cte_table(id) as
(
select cast(@strBegin as int)
union all
select id + 1
from cte_table
where id < @strEnd
)
insert into @tempResult
select cast(id as nvarchar(100))
from cte_table
option (maxrecursion 0)
end
--
else if isdate(@strBegin) = 1 and isdate(@strEnd) = 1
begin
-- CTE
;with cte_table(CreatedDate) as
(
select cast(@strBegin as datetime)
union all
select dateadd(day, 1, CreatedDate)
from cte_table
where CreatedDate < @strEnd
)
insert into @tempResult
select convert(varchar(10), CreatedDate, 120)
from cte_table
option (maxrecursion 0)
end
return;
end
go
호출 함수 예제:
-- 1( ):
select * from dbo.fun_ConcatStringsToTable(1, 10000)
-- 2( ):
select * from dbo.fun_ConcatStringsToTable('1', '10000')
-- 3( ):
declare @dateBegin datetime = '2009-1-1', @dateEnd datetime = '2018-12-31'
select * from dbo.fun_ConcatStringsToTable(@dateBegin, @dateEnd)
-- 4( ):
select * from dbo.fun_ConcatStringsToTable('2009-1-1', '2018-12-31')
스 크 립 트 실행 결과:결론:
위의 몇 개의 그림 에서 볼 수 있 듯 이 간단 한 호출
fun_ConcatStringsToTable
이라는 사용자 정의 표 값 함 수 를 통 해 시작 숫자 나 날 짜 를 지정 하면 연속 숫자 와 날 짜 를 생 성 하 는 목적 을 달성 할 수 있다.확장:
연속 월 을 만 들 고 싶다 면?블 로 거들 은 여기 서도 스 크 립 트 를 써 주 었 습 니 다.필요 하 다 면 이 를 바탕 으로 자체 적 으로 표 값 함 수 를 만 들 수 있 습 니 다.
with cte_table(CreatedDate) as
(
select cast('2017-12-1' as datetime)
union all
select dateadd(month, 1, CreatedDate)
from cte_table
where CreatedDate < '2018-04-01'
)
select convert(varchar(7), CreatedDate, 120) as YearMonth
from cte_table
option (maxrecursion 0)
총결산위 에서 말 한 것 은 소 편 이 소개 한 sql server 에서 공용 표 표현 식 CTE 를 사용 하여 재 귀 방식 으로 유 니 버 설 함 수 를 작성 하여 연속 적 인 숫자 와 날 짜 를 자동 으로 생 성 하 는 것 입 니 다.도움 이 되 시 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
우분투에 SQL 서버 설치Microsoft SQL Server는 오늘날 업계에서 가장 눈에 띄는 데이터베이스 중 하나입니다. 이번 포스팅에서는 우분투에 설치하는 방법을 알려드리겠습니다. sudo 권한이 있는 계정 1단계: 터미널 열기 단축키...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.