Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

sp_MSForEachDB फ़ंक्शन के भीतर साइड-इफ़ेक्टिंग ऑपरेटर का अमान्य उपयोग

आप गतिशील SQL के बिना इसे गतिशील रूप से नहीं कर सकते (जैसा कि सभी डेटाबेस नामों को पहले से हार्ड-कोडिंग के बिना), और आप किसी फ़ंक्शन में डायनेमिक SQL का उपयोग नहीं कर सकते। आपको किसी भी स्थिति में sp_MSForEachDB का उपयोग नहीं करना चाहिए या, IMHO, INFORMATION_SCHEMA का उपयोग करके

एक संग्रहीत प्रक्रिया लिखें जो परिणाम सेट लौटाती है। यदि आपको आउटपुट को अन्य सामान में शामिल करने की आवश्यकता है (क्यों नहीं संग्रहीत प्रक्रिया में कोड?), तो आउटपुट को #temp तालिका में डालें।

इसे आजमाएं:

CREATE PROCEDURE dbo.AllMyColumnsEverywhereForReals
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @sql NVARCHAR(MAX) = N'';

  SELECT @sql += '
  UNION ALL SELECT 
      [database]  = N''' + d.name + ''' COLLATE SQL_Latin1_General_CP1_CI_AI,
      [schema]    = s.name COLLATE SQL_Latin1_General_CP1_CI_AI,
      [object]    = o.name COLLATE SQL_Latin1_General_CP1_CI_AI,
      [column]    = c.name COLLATE SQL_Latin1_General_CP1_CI_AI,
      [qualified] = QUOTENAME(''' + d.name + ''') 
        + ''.'' + QUOTENAME(s.name) 
        + ''.'' + QUOTENAME(c.name) COLLATE SQL_Latin1_General_CP1_CI_AS,
      [type] = CASE o.type WHEN ''U'' THEN ''Table'' ELSE ''View'' END
    FROM ' + QUOTENAME(d.name) + '.sys.columns AS c
      INNER JOIN ' + QUOTENAME(d.name) + '.sys.objects AS o
      ON c.[object_id] = o.[object_id]
      INNER JOIN ' + QUOTENAME(d.name) + '.sys.schemas AS s
      ON o.[schema_id] = s.[schema_id]
      WHERE o.type IN (''U'', ''V'')'
  FROM sys.databases AS d WHERE [state] = 0 AND name NOT IN 
    (N'master',N'tempdb',N'msdb',N'model',N'ReportServer',N'ReportServerTempDB');

  SET @sql = STUFF(@sql, 1, 13, '');

  EXEC sp_executesql @sql;
END
GO

उपयोग:

CREATE TABLE #x
(
  db     SYSNAME, 
  sch    SYSNAME, 
  obj    SYSNAME, 
  col    SYSNAME, 
  qual   NVARCHAR(390),
  [type] CHAR(5)
);

INSERT #x EXEC dbo.AllMyColumnsEverywhereForReals;

SELECT cols FROM #x AS x -- INNER JOIN something else ON x.whatever...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डेटाबेस मेल प्रोफाइल (SSMS) के भीतर किसी खाते की प्राथमिकता बदलें

  2. बाधाओं को अनदेखा करते हुए SQL सर्वर तालिकाओं की सूची कैसे छोड़ें?

  3. SQL सर्वर 2008 बाधा नहीं छोड़ सकता

  4. SQL सर्वर में हटाए गए डेटाबेस को ट्रैक करने के तरीके

  5. SQL सर्वर डेटाबेस को पुनर्स्थापित करने से पहले कनेक्शन बंद होने की प्रतीक्षा करें