2015-02-04 3 views
1

스크립트를 사용하여 데이터베이스의 모든 테이블을 변경 하시겠습니까?전체 데이터베이스 업데이트

내가 DB의 모든 테이블에 IsActiveIsDeleted라는 이름으로 두 개의 열을 가지고 는 지금은 그런 방법으로 IsActive 복사 모든 IsDeleted 반전 데이터 만 IsActive을 유지하려는.

IsActive = ~IsDeleted; 

답변

3

현재 IsDeleted 열을 삭제 한 다음 예를 들어 IsDeleted라는 새 계산 열을 추가 할 수 있습니다.

alter table dbo.MyTable add IsDeleted AS (case when IsActive = 0 then 1 else 0 end) 

는 데이터베이스의 모든 테이블이 작업을 수행하기 위해, 당신은 sys.tables 카탈로그 뷰에서 스크립트를 생성 할 수 있습니다. 먼저 각 테이블에서 열을 삭제하는 스크립트를 생성하십시오.

select 'alter table ' + quotename(object_schema_name(t.object_id)) + '.' + quotename(t.name) + ' drop column IsDeleted' 
from sys.tables t join sys.columns c on c.object_id = t.object_id 
where c.name = 'IsDeleted' 
order by 1 

그런 다음 다른 테이블을 생성하여 계산 된 열을 각 테이블에 추가하십시오.

select 'alter table ' + quotename(object_schema_name(t.object_id)) + '.' + quotename(t.name) + ' add IsDeleted AS (case when IsActive = 0 then 1 else 0 end)' 
from sys.tables t join sys.columns c on c.object_id = t.object_id 
where c.name = 'IsActive' 
order by 1 
+0

하나의 검색어에서 모든 표에 대해 동일한 작업을 수행 할 수 있습니까? 일반적인 방법이 있습니까? –

1

이 .. .. 내가

SELECT 'UPDATE ' + T.TABLE_SCHEMA + '.' + T.TABLE_NAME + ' SET IsActive = (CASE WHEN IsDeleted = 0 THEN 1 ELSE 0 END);' 
FROM INFORMATION_SCHEMA.TABLES T 
INNER JOIN INFORMATION_SCHEMA.COLUMNS C 
ON T.TABLE_NAME = C.TABLE_NAME 
AND c.COLUMN_NAME ='IsActive' 
WHERE T.TABLE_TYPE = 'BASE TABLE' 
ORDER BY T.TABLE_SCHEMA, T.TABLE_NAME; 
+0

덕분에 도움을 받으 셨습니다. –

3

당신은 또한 문서화되지 않은 저장 프로 시저 sp_MSforeachtable 사용할 수 있습니다 모르겠 확인하지 않은 시도해보십시오

-- First, update IsActive with (inverted) values from IsDeleted 
EXEC sys.sp_MSforeachtable 'UPDATE ? SET IsActive=~IsDeleted' 
-- Now you can drop IsDeleted column 
EXEC sys.sp_MSforeachtable 'ALTER TABLE ? DROP COLUMN IsDeleted' 

?하기위한 자리 표시 자입니다 테이블의 이름 (스키마 포함)
참고 : IsActive은여야합니다.~ 운영자가 제대로

+0

오류가 발생합니다 : "잘못된 열 이름 'IsActive'." IsActive와 IsDeleted가 모든 테이블에 존재하지 않습니다. –

+0

글쎄, "모든 테이블에 IsActive와 IsDeleted라는 이름의 두 컬럼이 있습니다."그래서 나는이 컬럼들이 ** 모든 테이블에 존재한다고 생각했습니다. :) –

2

을 작동하려면 여기에 파워 쉘 솔루션입니다 : 항상

push-location; 
import-module sqlps -disablenamechecking 
pop-location; 

$server = new-object microsoft.sqlserver.management.smo.server '.' 
$db = $server.databases['TestDB']; 

foreach ($table in $db.Tables) { 
    $columnNames = $table.columns | foreach {$_.name}; 
    if ($columnNames -contains 'IsActive' -and $columnNames -contains 'IsDeleted') { 
     $table.Columns['IsDeleted'].Drop(); 
     $newColumn = new-object microsoft.sqlserver.management.smo.column; 
     $newColumn.Parent = $table; 
     $newColumn.Name = 'IsDeleted'; 
     $newColumn.DataType = [Microsoft.SqlServer.Management.Smo.DataType]::'bit'; 
     $newColumn.Computed = $true; 
     $newColumn.ComputedText = '~IsActive'; 
     $newColumn.Create(); 
    } 
} 

, 비 프로덕션 환경에서이 테스트 (및 관련 서버 및 데이터베이스 이름을 변경). 그렇지만 이것을 그대로 실행할 수 있어야합니다. 관련 데이터베이스의 모든 테이블을 순환하여 IsActive와 IsDeleted를 모두 포함하는 테이블을 찾습니다. 둘 다 가지고있는 경우에는 IsDeleted를 삭제하고 지정된 정의가있는 계산 된 열로 다시 추가합니다.