2017-03-16 65 views
0

我在一個新的公司,並試圖寫一個進程,通過數據庫循環和查找關鍵字的所有表中,特效等TSQL - 更改數據庫動態

它在理論上的偉大工程,但是我注意到數據庫從不改變。

我輸出了SQL,並運行它,沒問題。但是如果我運行這段代碼,它不會改變。

我也玩過代碼並硬編碼表名並獲得它的工作,所以它可能是一個安全功能?

這裏的TSQL:

Declare @Dbname varchar(250); --Stores Database Name<br> 
Declare @SearchTerm varchar(250); --What we're searching the DB for<br> 
Declare @vSQL varchar(550)=''; --Variable that will hold our dynamic queries<br> 
set @SearchTerm='LoadID';  <br> 

select name 
from sys.databases 
where owner_sid != 0x01; 

print @Dbname; 
set @vSQL = 'use [' + @dbname + ']'; 
exec (@vSQL); 

--exec @vSQL; 
--execute (@vSQL); 
--execute @vSQL); 

回答

3

EXEC在自己的環境中運行。把整個腳本寫入@vSql類

set @vSQL = 'use [' + @dbname + '];' +'--do what you need ' ; 
+0

這很好,謝謝! – yoelbenyossef

0

我有這樣做的東西,多一點是以下過程。應循環訪問給定實例上的所有數據庫,在這些dbs中的對象定義中查找關鍵字,以及是否有任何作業使用這些對象及其最後執行持續時間。

USE [master] 
GO 

Create Proc dbo.DependencyCheck @SearchKey Varchar(150) As 

Begin 

--DB Refs 

Drop Table If Exists #Databases 

Create Table #Databases 

(
    DatabaseName Varchar(50) Primary Key 
    ,Checked Int Default 0 Not Null 
    ,SearchKey Varchar(150) 
    ,DependencyText As 'Insert Into #Dependencies 
              Select Distinct ' 

              + '''' + DatabaseName + '''' + 
              ', 
              D.id As ObjectID, 
              O.name As ObjectName, 
              xtype As ObjectType, 
              S.name As SchemaName 

              From ' 

              + DatabaseName + '.dbo.syscomments D 

              Inner Join ' + DatabaseName + '.dbo.sysobjects O 
               On O.ID = D.id 

              Inner Join ' + DatabaseName + '.sys.schemas As S 
               On s.schema_id = O.uid 

              Where D.text Like ''%' + SearchKey + '%''' 
) 


Insert Into #Databases (DatabaseName, SearchKey) 

    Select 

    Name, @SearchKey 

    From sys.sysdatabases As S 

    Where S.filename Not Like '%.SS' --Not DB Snapshots 

Declare @TargetDatabase Varchar(25) = (Select Top 1 DatabaseName From #Databases As D Where D.Checked = 0) 

--Dependency Table 

Drop Table If Exists #Dependencies 

Create Table #Dependencies 

(
    DatabaseName Varchar(50) Not Null, 
    ObjectID Int Not Null, 
    ObjectName Varchar(150) Not Null, 
    ObjectType Varchar(15) Not Null, 
    SchamaName Varchar(150) Not null 
) 

--Dynamic SQL for Insert 
Declare @DynamicDependency Varchar(8000) = (Select D.DependencyText From #Databases As D Where D.DatabaseName = @TargetDatabase) 

While @TargetDatabase Is Not Null 

    Begin 

     Exec(@DynamicDependency) 

     Update D Set Checked = 1 From #Databases D Where DatabaseName = @TargetDatabase 

     Set @TargetDatabase = (Select Top 1 DatabaseName From #Databases As D Where D.Checked = 0) 
     Set @DynamicDependency = (Select D.DependencyText From #Databases As D Where D.DatabaseName = @TargetDatabase) 

    End 

;With JobStats As 
(
Select Distinct 

J.name, 
JH.step_id, 
First_Value(JH.run_duration) Over (Partition By J.name, JH.step_id Order By CA.StartTime Desc) As Last_Duration, 
Avg(JH.run_duration) Over (Partition By J.name, JH.step_id) As Avg_Duration 

From msdb.dbo.sysjobhistory As JH 

Cross Apply (Select Convert(Datetime, Convert(varchar(8),run_date)) 
+ Convert(datetime, Stuff(STUFF(RIGHT(REPLICATE('0', 6) + CAST(run_time as varchar(6)), 6), 3, 0, ':'), 6, 0, ':')) As StartTime) CA 

Inner Join msdb.dbo.sysjobs As J 
    On J.job_id = JH.job_id 

Where JH.step_id <> 0 
And JH.run_status = 1 -- Success 
) 

Select 

D.ObjectID 
,D.DatabaseName 
,D.SchamaName 
,D.ObjectName 
,D.ObjectType 
,J.name As JobName 
,JS.step_id As JoBStepID 
,JS.step_name As JobStepName 
,JStat.Last_Duration 
,JStat.Avg_Duration 

From #Dependencies As D 

Left Join msdb.dbo.sysjobsteps JS 
    On JS.command Like '%' + D.ObjectName + '%' 
    And JS.subsystem = 'TSQL' 
Left Join msdb.dbo.sysjobs J 
    On J.job_id = JS.job_id 

Left Join JobStats JStat 
    On JStat.name = J.name 
    And JStat.step_id = JS.step_id 

Order By 1, 3 

End