스크립트를 사용하여 데이터베이스의 모든 테이블을 변경 하시겠습니까?전체 데이터베이스 업데이트
내가 DB의 모든 테이블에 IsActive
및 IsDeleted
라는 이름으로 두 개의 열을 가지고 는 지금은 그런 방법으로 IsActive
복사 모든 IsDeleted
반전 데이터 만 IsActive
을 유지하려는.
IsActive = ~IsDeleted;
스크립트를 사용하여 데이터베이스의 모든 테이블을 변경 하시겠습니까?전체 데이터베이스 업데이트
내가 DB의 모든 테이블에 IsActive
및 IsDeleted
라는 이름으로 두 개의 열을 가지고 는 지금은 그런 방법으로 IsActive
복사 모든 IsDeleted
반전 데이터 만 IsActive
을 유지하려는.
IsActive = ~IsDeleted;
현재 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
이 .. .. 내가
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;
덕분에 도움을 받으 셨습니다. –
당신은 또한 문서화되지 않은 저장 프로 시저 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
은여야합니다.~
운영자가 제대로
오류가 발생합니다 : "잘못된 열 이름 'IsActive'." IsActive와 IsDeleted가 모든 테이블에 존재하지 않습니다. –
글쎄, "모든 테이블에 IsActive와 IsDeleted라는 이름의 두 컬럼이 있습니다."그래서 나는이 컬럼들이 ** 모든 테이블에 존재한다고 생각했습니다. :) –
을 작동하려면 여기에 파워 쉘 솔루션입니다 : 항상
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를 삭제하고 지정된 정의가있는 계산 된 열로 다시 추가합니다.
하나의 검색어에서 모든 표에 대해 동일한 작업을 수행 할 수 있습니까? 일반적인 방법이 있습니까? –