سؤال

أحتاج إلى إضافة 3 أعمدة جديدة إلى جدول يسمى المتطلبات في جميع قواعد البيانات (من نفس الحالة). لقد بحثت في Net للعثور على SP_MSFOREACHDB يمكن استخدامه لتنفيذ نفس الاستعلام على قواعد بيانات متعددة ، ولكن لم أتمكن من العثور على أي مثال مع أمر 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    
'

كتب آرون برتراند نسخة متفوقة هنا التي قد ترغب في استخدامها.

طريقة أخرى مع 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