2009-06-21 17 views
10

में कोई ऑब्जेक्ट खोजें यदि मुझे एक तालिका (या proc) नाम बताया गया है, लेकिन ऑब्जेक्ट में कौन सा कनेक्टेड डेटाबेस स्थित नहीं है, तो क्या इसकी खोज करने के लिए कोई साधारण स्क्रिप्ट है? शायद सिस्टम डेटाबेस में कहीं खोज करें? (मैं SQL सर्वर 2005 का उपयोग कर रहा हूं)SQL सर्वर (क्रॉस-डेटाबेस)

उत्तर

25

एक सूचना_Schema स्कीमा है जो SYS स्कीमा से तालिकाओं पर विचारों का एक सेट है जिसे आप प्राप्त करने के लिए क्वेरी कर सकते हैं।

सूचना_Schema का नकारात्मक पक्ष यह है कि आपको प्रत्येक प्रकार के ऑब्जेक्ट के लिए एक प्रश्न लिखना है। इसके विपरीत यह है कि Info_Schema भी पढ़ने के लिए और अधिक अनुकूल है।

एसआईएस स्कीमा शुरू में थोड़ा सा गूढ़ प्रतीत होता है लेकिन इसकी एक ही जगह में एक ही जानकारी है।

असल में, प्रत्येक डेटाबेस में SysObjects नामक एक सारणी होती है जिसमें सभी ऑब्जेक्ट्स और उनके प्रकार के नाम होते हैं।

तो, आप इस प्रकार एक डेटाबेस में खोज करना चाहते हैं:,

Select [name] as ObjectName, Type as ObjectType 
From Sys.Objects 
Where 1=1 
and [Name] like '%YourObjectName%' 

अब, अगर आप केवल करने के लिए इस प्रतिबंधित करने के लिए टेबल और संग्रहीत procs के लिए खोज करना चाहता था आप क्या करेंगे

Select [name] as ObjectName, Type as ObjectType 
From Sys.Objects 
Where 1=1 
and [Name] like '%YourObjectName%' 
and Type in ('U', 'P') 

यदि आप ऑब्जेक्ट प्रकार देखते हैं, तो आपको दृश्यों, ट्रिगर्स इत्यादि के लिए एक पूरी सूची मिल जाएगी।

अब, यदि आप प्रत्येक डेटाबेस में इसे खोजना चाहते हैं, तो आपको इसे फिर से करना होगा डेटाबेस। आप निम्न में से कोई एक कर सकते हैं:

यदि आप बिना किसी खंड के प्रत्येक डेटाबेस को खोजना चाहते हैं, तो sp_MSforeachdb का उपयोग यहां दिए गए उत्तर में दिखाए गए अनुसार करें।

यदि आप केवल विशिष्ट डेटाबेस खोजना चाहते हैं, तो "उपयोग करें डीबीएनएएम" और फिर कमांड कमांड का उपयोग करें।

आपको उस मामले में पैरामीटरकृत होने से बहुत फायदा होगा। ध्यान दें कि जिस डेटाबेस में आप खोज रहे हैं उसका नाम प्रत्येक क्वेरी में बदलना होगा (डेटाबेसऑन, डेटाबेस दो ...)। इस की जाँच करें:

Declare @ObjectName VarChar (100) 

Set @ObjectName = '%Customer%' 

Select 'DatabaseOne' as DatabaseName, [name] as ObjectName, Type as ObjectType 
From DatabaseOne.Sys.Objects 
Where 1=1 
and [Name] like @ObjectName 
and Type in ('U', 'P') 
UNION ALL 
Select 'DatabaseTwo' as DatabaseName, [name] as ObjectName, Type as ObjectType 
From DatabaseTwo.Sys.Objects 
Where 1=1 
and [Name] like @ObjectName 
and Type in ('U', 'P') 
UNION ALL 
Select 'DatabaseThree' as DatabaseName, [name] as ObjectName, Type as ObjectType 
From DatabaseThree.Sys.Objects 
Where 1=1 
and [Name] like @ObjectName 
and Type in ('U', 'P') 
+3

'WHERE 1 = 1'' का क्या मतलब है? – itsho

+2

@itsho, अगर ब्रह्मांड टूट जाता है, तो राज मोर डेटाबेस क्वेरी चलाने में समय बर्बाद नहीं करना चाहता। :) – user1172763

+2

@itsho यह कोड पठनीयता के लिए है। प्रत्येक और एक अलग रेखा पर है, और हालांकि एसओ ने कोड प्रदर्शित करने के तरीके में यह स्पष्ट नहीं है, लेकिन अक्सर उन्हें इंडेंट किया जाएगा। साथ ही, यह किसी भी/सभी स्थितियों पर टिप्पणी करना कभी भी आसान बनाता है। 1 = 1 के बिना, आप अगली पंक्ति पर 'AND' को हटाए बिना पहली शर्त पर टिप्पणी नहीं कर सकते हैं। इसलिए, यह क्वेरी को प्रभावित करने के लिए कुछ भी नहीं करता है, लेकिन उपयोगकर्ता को आदेश चलाने के लिए यह आसान बनाता है। –

0

आप सभी डेटाबेस खोजने के लिए sp_MSforeachdb का उपयोग कर सकते हैं।

घोषित @RETURN_VALUE int

घोषित @ command1 nvarchar (2000)

सेट @ command1 = "आपका आदेश यहाँ जाता है"

कार्यकारी @RETURN_VALUE = sp_MSforeachdb @ command1 = @ command1

राज

2

सूचना_श्रेमा को हिट करने का सबसे आसान तरीका है ...

SELECT * 
FROM information_schema.Tables 
WHERE [Table_Name]='????' 

SELECT * 
FROM information_schema.Views 
WHERE [Table_Name]='????' 

SELECT * 
FROM information_schema.Routines 
WHERE [Routine_Name]='????' 
6
sp_MSforeachdb 'select db_name(), * From ?..sysobjects where xtype in (''U'', ''P'') And name = ''ObjectName''' 

के बजाय 'ObjectName' डालने वस्तु आप के लिए देख रहे हैं। पहला कॉलम डेटाबेस का नाम प्रदर्शित करेगा जहां ऑब्जेक्ट स्थित है।

+8

db_name() वर्तमान डेटाबेस है, ''? '' डेटाबेस की खोज की जाएगी। तो पहला कॉलम सभी रिकॉर्ड्स के लिए समान होगा, अगर आपको पता होना चाहिए कि ऑब्जेक्ट किस डेटाबेस में उपयोग में है: sp_MSforeachdb 'select' '?' ', * से? .. sysobjects जहां xtype in (' 'U' ', 'पी' ') और नाम =' ऑब्जेक्टनाम '' ' –

0
set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
go 


/********************************************************************** 
Naziv procedure  : sp_rfv_FIND 
Ime i prezime autora: Srdjan Nadrljanski 
Datum kreiranja  : 13.06.2013. 
Namena    : Traži sql objekat na celom serveru 
Tabele    : 
Ulazni parametri : 
Izlazni parametri : 
Datum zadnje izmene : 
Opis izmene   : 
exec sp_rfv_FIND 'TUN','' 
**********************************************************************/ 
CREATE PROCEDURE [dbo].[sp_rfv_FIND] ( @SEARCHSTRING VARCHAR(255), 
             @notcontain Varchar(255) 
             ) 
AS 


declare @text varchar(1500),@textinit varchar (1500) 
set @textinit= 
'USE @sifra 

insert into ##temp2 
select ''@sifra''as dbName,a.[Object Name],a.[Object Type] 
from(
SELECT DISTINCT sysobjects.name AS [Object Name] , 
case 
when sysobjects.xtype = ''C'' then ''CHECK constraint'' 
when sysobjects.xtype = ''D'' then ''Default or DEFAULT constraint'' 
when sysobjects.xtype = ''F'' then ''Foreign Key'' 
when sysobjects.xtype = ''FN'' then ''Scalar function'' 
when sysobjects.xtype = ''P'' then ''Stored Procedure'' 
when sysobjects.xtype = ''PK'' then ''PRIMARY KEY constraint'' 
when sysobjects.xtype = ''S'' then ''System table'' 
when sysobjects.xtype = ''TF'' then ''Function'' 
when sysobjects.xtype = ''TR'' then ''Trigger'' 
when sysobjects.xtype = ''U'' then ''User table'' 
when sysobjects.xtype = ''UQ'' then ''UNIQUE constraint'' 
when sysobjects.xtype = ''V'' then ''View'' 
when sysobjects.xtype = ''X'' then ''Extended stored procedure'' 
end as [Object Type] 
FROM sysobjects 
WHERE 
sysobjects.type in (''C'',''D'',''F'',''FN'',''P'',''K'',''S'',''TF'',''TR'',''U'',''V'',''X'') 
AND sysobjects.category = 0 
AND CHARINDEX(''@SEARCHSTRING'',sysobjects.name)>0 
AND ((CHARINDEX(''@notcontain'',sysobjects.name)=0 or 
CHARINDEX(''@notcontain'',sysobjects.name)<>0)) 
)a' 

    set @textinit=replace(@textinit,'@SEARCHSTRING',@SEARCHSTRING) 
    set @textinit=replace(@textinit,'@notcontain',@notcontain) 


SELECT name AS dbName,cast(null as varchar(255)) as ObjectName,cast(null as varchar(255)) as ObjectType 
into ##temp1 
from master.dbo.sysdatabases order by name 

SELECT * INTO ##temp2 FROM ##temp1 WHERE 1 = 0 


declare @sifra VARCHAR(255),@suma int,@brojac int 

set @suma=(select count(dbName) from ##temp1) 

DECLARE c_k CURSOR LOCAL FAST_FORWARD FOR 
SELECT dbName FROM ##temp1 ORDER BY dbName DESC 

OPEN c_k 
FETCH NEXT FROM c_K INTO @sifra 
SET @brojac = 1 
WHILE (@@fetch_status = 0) AND (@brojac <= @suma) 
BEGIN 

    set @text=replace(@textinit,'@sifra',@sifra) 

    exec (@text) 

    SET @brojac = @brojac +1 

    DELETE FROM ##temp1 WHERE dbName = @sifra 

     FETCH NEXT FROM c_k INTO @sifra 
END 
close c_k 
DEALLOCATE c_k 

select * from ##temp2 
order by dbName,ObjectType 
drop table ##temp2 
drop table ##temp1