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 를 사용 하여 재 귀 방식 으로 유 니 버 설 함 수 를 작성 하여 연속 적 인 숫자 와 날 짜 를 자동 으로 생 성 하 는 것 입 니 다.도움 이 되 시 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

좋은 웹페이지 즐겨찾기