sql-server - مشاركة - نقل قاعدة بيانات sql server من جهاز الى اخر




كيفية تشغيل نفس الاستعلام على جميع قواعد البيانات على مثيل؟ (2)

الاستعلام المستقيم للأمام

EXECUTE sp_MSForEachDB 
        'USE ?; SELECT DB_NAME()AS DBName, 
        COUNT(1)AS [Count] FROM CUSTOMERS'

سيعرض لك هذا الاستعلام ما تريد رؤيته ، ولكن سيؤدي أيضًا إلى حدوث أخطاء لكل قاعدة بيانات بدون جدول يسمى "العملاء". ستحتاج إلى عمل منطق للتعامل مع هذا الأمر.

حاكم الهند

لدي (لأغراض الاختبار) العديد من ديسيبل مع نفس المخطط (= نفس الجداول والأعمدة أساسا) على سبيل المثال مزود خادم R2 2008.

أود الحصول على استفسار مثل

SELECT COUNT(*) FROM CUSTOMERS

على جميع DBs على سبيل المثال. أود الحصول على أعمدة 2 نتيجة:

1 - اسم DB

2 - قيمة COUNT(*)

مثال:

DBName  //   COUNT (*)

TestDB1 // 4

MyDB  // 5

etc...

ملاحظة: أفترض أن الجدول CUSTOMERS موجود في جميع dbs (باستثناء master ).


جرب هذه -

SET NOCOUNT ON;

IF OBJECT_ID (N'tempdb.dbo.#temp') IS NOT NULL
   DROP TABLE #temp

CREATE TABLE #temp
(
      [COUNT] INT
    , DB VARCHAR(50)
)

DECLARE @TableName NVARCHAR(50) 
SELECT @TableName = '[dbo].[CUSTOMERS]'

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = STUFF((
    SELECT CHAR(13) + 'SELECT ''' + name + ''', COUNT(1) FROM [' + name + '].' + @TableName
    FROM sys.databases 
    WHERE OBJECT_ID(name + '.' + @TableName) IS NOT NULL
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

INSERT INTO #temp (DB, [COUNT])              
EXEC sys.sp_executesql @SQL

SELECT * 
FROM #temp t

الإخراج (على سبيل المثال ، في AdventureWorks ) -

COUNT       DB
----------- --------------------------------------------------
19972       AdventureWorks2008R2
19975       AdventureWorks2012
19472       AdventureWorks2008R2_Live






multiple-databases