में कोई ऑब्जेक्ट खोजें यदि मुझे एक तालिका (या proc) नाम बताया गया है, लेकिन ऑब्जेक्ट में कौन सा कनेक्टेड डेटाबेस स्थित नहीं है, तो क्या इसकी खोज करने के लिए कोई साधारण स्क्रिप्ट है? शायद सिस्टम डेटाबेस में कहीं खोज करें? (मैं SQL सर्वर 2005 का उपयोग कर रहा हूं)SQL सर्वर (क्रॉस-डेटाबेस)
उत्तर
एक सूचना_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')
आप सभी डेटाबेस खोजने के लिए sp_MSforeachdb का उपयोग कर सकते हैं।
घोषित @RETURN_VALUE int
घोषित @ command1 nvarchar (2000)
सेट @ command1 = "आपका आदेश यहाँ जाता है"
कार्यकारी @RETURN_VALUE = sp_MSforeachdb @ command1 = @ command1
राज
सूचना_श्रेमा को हिट करने का सबसे आसान तरीका है ...
SELECT *
FROM information_schema.Tables
WHERE [Table_Name]='????'
SELECT *
FROM information_schema.Views
WHERE [Table_Name]='????'
SELECT *
FROM information_schema.Routines
WHERE [Routine_Name]='????'
sp_MSforeachdb 'select db_name(), * From ?..sysobjects where xtype in (''U'', ''P'') And name = ''ObjectName'''
के बजाय 'ObjectName' डालने वस्तु आप के लिए देख रहे हैं। पहला कॉलम डेटाबेस का नाम प्रदर्शित करेगा जहां ऑब्जेक्ट स्थित है।
db_name() वर्तमान डेटाबेस है, ''? '' डेटाबेस की खोज की जाएगी। तो पहला कॉलम सभी रिकॉर्ड्स के लिए समान होगा, अगर आपको पता होना चाहिए कि ऑब्जेक्ट किस डेटाबेस में उपयोग में है: sp_MSforeachdb 'select' '?' ', * से? .. sysobjects जहां xtype in (' 'U' ', 'पी' ') और नाम =' ऑब्जेक्टनाम '' ' –
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
- 1. SQL सर्वर
- 2. SQL सर्वर
- 3. SQL सर्वर
- 4. SQL सर्वर
- 5. SQL सर्वर
- 6. SQL सर्वर
- 7. SQL सर्वर
- 8. SQL सर्वर
- 9. SQL सर्वर
- 10. SQL सर्वर
- 11. SQL सर्वर
- 12. SQL सर्वर
- 13. SQL सर्वर
- 14. SQL सर्वर
- 15. SQL सर्वर
- 16. SQL सर्वर
- 17. SQL सर्वर
- 18. SQL सर्वर
- 19. SQL सर्वर
- 20. SQL सर्वर
- 21. SQL सर्वर
- 22. SQL सर्वर
- 23. SQL सर्वर
- 24. SQL सर्वर
- 25. SQL सर्वर
- 26. SQL सर्वर
- 27. SQL सर्वर
- 28. SQL सर्वर
- 29. SQL सर्वर
- 30. SQL सर्वर
'WHERE 1 = 1'' का क्या मतलब है? – itsho
@itsho, अगर ब्रह्मांड टूट जाता है, तो राज मोर डेटाबेस क्वेरी चलाने में समय बर्बाद नहीं करना चाहता। :) – user1172763
@itsho यह कोड पठनीयता के लिए है। प्रत्येक और एक अलग रेखा पर है, और हालांकि एसओ ने कोड प्रदर्शित करने के तरीके में यह स्पष्ट नहीं है, लेकिन अक्सर उन्हें इंडेंट किया जाएगा। साथ ही, यह किसी भी/सभी स्थितियों पर टिप्पणी करना कभी भी आसान बनाता है। 1 = 1 के बिना, आप अगली पंक्ति पर 'AND' को हटाए बिना पहली शर्त पर टिप्पणी नहीं कर सकते हैं। इसलिए, यह क्वेरी को प्रभावित करने के लिए कुछ भी नहीं करता है, लेकिन उपयोगकर्ता को आदेश चलाने के लिए यह आसान बनाता है। –