문제

모든 데이터베이스 (동일한 인스턴스)의 요구 사항이라는 표에 3 개의 새 열을 추가해야합니다. SP_MSFORECHDB를 사용하여 여러 데이터베이스에서 동일한 쿼리를 실행하는 데 사용될 수 있지만 Alter 명령으로 예제를 찾을 수 없었습니다.

미리 감사드립니다

도움이 되었습니까?

해결책

테이블이 모두 같은 스키마에있을 것으로 예상하면 sp_msforeachdb

EXEC sp_msforeachdb '
    IF DB_ID(''?'') > 4
    BEGIN
        IF EXISTS(SELECT 1 FROM [?].INFORMATION_SCHEMA.TABLES 
                    WHERE TABLE_NAME=''Requirements'' AND TABLE_SCHEMA=''dbo''
                    AND TABLE_TYPE=''BASE TABLE'')
        BEGIN
            ALTER TABLE [?].dbo.Requirements
            ADD col1 INT, col2 INT, col3 INT
        END
    END    
'

Aaron Bertrand는 우수한 버전을 썼습니다 여기 당신이 사용하고 싶을 수도 있습니다.

동적 SQL을 가진 또 다른 방법

DECLARE @sql VARCHAR(MAX) = CAST((SELECT 'IF EXISTS(SELECT 1 FROM [' + name + '].INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME=''Requirements'' AND TABLE_SCHEMA=''dbo'' AND TABLE_TYPE=''BASE TABLE'')' + CHAR(10) 
                                          + '    ALTER TABLE [' + name + '].[dbo].[Requirements] ADD Col1 INT, Col2 INT, Col3 INT' + CHAR(10) + CHAR(10)
                                  FROM master.sys.databases
                                  WHERE database_id > 4
                                  FOR XML PATH('')) AS NVARCHAR(MAX))

PRINT @sql
--EXEC(@sql)

테이블이 없을 가능성을 고려해야하는 경우 dbo 또는 일반적인 스키마를 사용할 수 있습니다 sp_msforeachdb 줄을 따라 스키마 정보를 검색합니다

CREATE TABLE ##tmp (DatabaseName SYSNAME, SchemaName SYSNAME, TableName SYSNAME)

EXEC sp_msforeachdb '
    IF DB_ID(''?'') > 4
    BEGIN
        INSERT INTO ##tmp (DatabaseName, SchemaName, TableName)
        SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME
        FROM [?].INFORMATION_SCHEMA.TABLES
        WHERE TABLE_NAME = ''Requirements''
        AND TABLE_TYPE=''BASE TABLE''
    END    
'

DECLARE @sql VARCHAR(MAX) = CAST((SELECT 'ALTER TABLE [' + DatabaseName + '].[' + SchemaName + '].[' + TableName + '] ADD Col1 INT, Col2 INT, Col3 INT' + CHAR(10) + CHAR(10)
                                  FROM ##tmp
                                  FOR XML PATH('')) AS NVARCHAR(MAX))

PRINT @sql
--EXEC(@sql)

DROP TABLE ##tmp

다른 팁

MySQL 명령 줄에서 :

ALTER TABLE database1.table_name ADD column_name column-name;
ALTER TABLE database2.table_name ADD column_name column-name;
..

다음 코드는 각 데이터베이스에 대한 명령을 생성합니다.

select 'ALTER TABLE [' + d.name + '].[dbo].[table_name] ADD column_name column-name;' as cmd
from sys.databases d
where d.name NOT IN ( 'tempdb', 'msdb', 'master','model');

또한 커서를 작성하여이를 해결하고 실행할 수도 있지만 실행중인 내용을보고 잘못된 데이터베이스를 업데이트하지 않도록하는 것이 좋습니다.

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