2017-03-16 4 views
0

をデータベースを変更する、procsの、などTSQL - 私は新会社にいる、およびデータベースをループし、すべてのテーブルでキーワードを検索しますPROCを書き込もうと動的

それは理論的には素晴らしい作品しかし、私はデータベースが決して変化しないことに気づいた。

私は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

これは私がやっていることですが、もう少し次の手順です。特定のインスタンス上のすべてのDBをループし、それらの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 
関連する問題