SQL Server 프로그래밍 - 모든 날짜가 주어진 일까지 업데이트

StackOverflow https://stackoverflow.com/questions/1076359

  •  21-08-2019
  •  | 
  •  

문제

수백 테이블이있는 데모 데이터베이스가 있습니다. 각 테이블에는 일반적으로 TSTAMP라는 최소한 하나의 필드가 있으며, 이는 작은 데이터 타입입니다. 일부 테이블에는 다른 데이트 필드도 있습니다. 많은 테이블에는 1 개 이상의 트리거가 있습니다.

주어진 숫자로 각 테이블의 날짜를 증가시키기 위해 스크립트 (하드 웨이 - 아래 참조)를 썼습니다. 아이디어는 모든 날짜를 같은 일로 업데이트하여 데이터를보다 "현재"처럼 보이게하는 것입니다.

데이터베이스의 각 사용자 테이블을 식별하고, 모든 트리거를 비활성화하고, 매일 수를 추가하여 트리거를 다시 활성화하여 각 스몰 디테 타임 필드를 수정하여 시스템 테이블을 반복하여이를 수행하는 방법이 더 쉬워집니다. 그리고 다음 테이블로 이동합니다. 나는 그러한 t-sql을 작성하는 방법을 전혀 모른다.

테이커가 있습니까?

감사. 조

샘플 스크립트 :

DECLARE @numDaysToAdd int

SET @numDaysToAdd = 100

ALTER TABLE someTableDISABLE TRIGGER someTrigger

UPDATE someTable
SET tstamp = DATEADD(day, @numDaysToAdd, tstamp)

-- update any other smalldatetime field in the table too.

ALTER TABLE someTable ENABLE TRIGGER someTrigger

-- same pattern for 200 more tables!

=================================================== = 일반 공장:

@numdaystoadd int를 선언합니다

@numdaystoadd = 1을 설정하십시오

@numdaystoadd> 0 인 경우

시작하다

@Tablename Varchar (100) 선언

@Currtable Varchar (100) 선언

@currcolumn varchar (100) 선언

@columnname varchar (100) 선언

@strsql nvarchar (4000) 선언

tnames_cursor cursor를 선언합니다

을 위한

t.table_name, c.column_name을 선택하십시오

information_schema.columns에서 c join information_schema.tables t on t.table_name = c.table_name

여기서 (c.data_type = 'smalldateTime'또는 c.data_type = 'dateTime') 및 t.table_type <> 'View'

t.table_name, c.column_name desc의 주문

TNAMES_CURSOR를 엽니 다

다음에 tnames_cursor에서 @tablename, @columnname으로 가져 오십시오

@currcolumn = @columnname을 설정합니다

@currtable = @tablename을 설정합니다

set @strsql = n'update ' + @tablename + char (13) + char (10) +'set ' + @columnname +'= dateadd (day, ' + convert (varchar (10), @numdaystoadd) +', ' + @columnname +') ''

while (@@ fetch_status = 0)

시작하다

if (@currtable = @tablename)

BEGIN     

  IF @currcolumn <> @columnname

    SET @strSQL = @strSQL + N',' + CHAR(13)+CHAR(10) + @columnname + ' = DATEADD(day, ' + CONVERT(varchar(10),@numDaysToAdd) + ', ' + @columnname + ')'
END

또 다른

BEGIN    

  SET @currtable = @tablename

  SET @currcolumn = @columnname

  EXEC sp_executesql @strSQL

  SET @strSQL = N'UPDATE ' + @tablename + CHAR(13)+CHAR(10) + 'SET ' + @columnname + ' = DATEADD(day, ' + CONVERT(varchar(10),@numDaysToAdd) + ', ' + @columnname + ')' 

END

다음에 tnames_cursor에서 @tablename, @columnname으로 가져 오십시오

-최종 명령문 exec sp_executesql @strsql을 실행하십시오

tnames_cursor를 닫습니다

tnames_cursor를 처리합니다

도움이 되었습니까?

해결책

당신의 이해는 정확합니다. 누락 된 조각이 다음과 같습니다.

  1. 메타 데이터를 찾는 방법 (어떤 테이블, 어떤 열)
  2. 테이블 위로 걸어 가기 위해 SQL을 구축하는 방법.

#1의 경우 시스템보기를 참조하십시오 INFORMATION_SCHEMA.TABLES 그리고 INFORMATION_SCHEMA.COLUMNS:

-- add your own additional criteria
select t.TABLE_NAME, c.COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS c
join INFORMATION_SCHEMA.TABLES t ON t.TABLE_NAME = c.TABLE_NAME
WHERE c.DATA_TYPE = 'datetime'

#2의 경우 SQL 문을 문자열로 구축하고 관심있는 테이블을 걷고 다음을 수행 할 수 있습니다. sp_executesql.

다른 팁

동의한다. 또 다른 옵션은 시스템 테이블을 사용하여 200 개의 테이블 모두에 대한 SQL을 생성하는 것입니다. 그런 다음 sp_execsql을 사용하여 exec를 사용할 수 있습니다. 실행을 변경하지는 않지만 타이핑을 저장합니다. 항상 중요합니다 :)

다음 쿼리는 'SmallDateMe'유형 인 사용자 테이블과 그 열의 목록을 제공합니다.

SELECT sys.columns.name as tableName, sys.tables.name as columnName from sys.columns,sys.tables 
where sys.columns.object_id=sys.tables.object_id and sys.columns.system_type_id=58 order by tableName

여기 58은 데이터 유형 용 System_Type_id입니다. sys.types 테이블에서 확인할 수 있습니다.

커서를 사용하면 각 테이블을 가져 오기 위해 결과 세트를 반복 한 다음 해당 테이블에서 트리거를 비활성화 할 수 있습니다. 트리거 비활성화/활성화를 확인하십시오 http://msdn.microsoft.com/en-us/library/ms189748.aspx

그런 다음 각 테이블과 관련된 결과 세트의 각 열을 업데이트 한 다음 트리거를 활성화하십시오.

건배

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top