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