It’s T-SQL Tuesday time again, and this month the host is Bert Wagner (b|t) whose topic of choice is “write about code you’ve written that you would hate to live without.”
There are so many different scripts I use every day it’s difficult to pick just one, but I find myself using the following script frequently. I don’t have this wrapped into a stored procedure because I’m often working with different clients who may or may not have permission to create a stored procedure, or they may have a change process to follow when any objects are to be added to the production database.
The script accepts 2 input variables:
@SearchPattern – This is going to be the text we’re trying to find amongst all the object definitions, columns, and jobs (see @incjobs variable).
@incjob – I do not search the agent jobs by default, but you can set this flag to 1 if you want. When this is set to 1, I look for a match in the job step along with the job name.
In the example below, I used the AdventureWorks2012 database and searched for ‘%hiredate%’
/*dan.clemens drcdba.com*/ DECLARE @SearchPattern NVARCHAR(128) ,@incjob bit SET @SearchPattern = '%%' SET @incjob = 0 --Set to 0 to ignore jobs /*Creates list of all tables and associated columns to do easy multi-column comparisons with a like.*/ DECLARE @tabletbl TABLE ( objectid int, tablename varchar(max), tabletype varchar(5), tablecolumns varchar(max) ) insert into @tabletbl select o.[object_id] ,o.name ,o.[type] ,STUFF(( SELECT ',' + c.Name As [text()] FROM sys.columns c WHERE c.[object_id] = o.[object_id] FOR XML PATH('') ), 1,1,'') As TableColumns from sys.objects o WHERE o.[type] IN ('S' --System Tables ,'U' --User Tables ,'V') --Views /*****************Table column creation end*****************/ DECLARE @jobtbl TABLE ( [schema] varchar(20), name varchar(max), [type] varchar(5), FullName varchar(max), [Source] nvarchar(max) ) IF @incjob = 1 BEGIN INSERT INTO @jobtbl SELECT 'job' as [Schema] ,name As Name ,'J' 'Type' ,name 'FullName' ,sjs.command 'Source' FROM msdb.dbo.sysjobs s inner join msdb.dbo.sysjobsteps sjs ON sjs.job_id = s.job_id where sjs.command like lower(@SearchPattern) or s.[name] like lower(@SearchPattern) END SELECT SCHEMA_NAME(o.schema_id) as [schema] ,o.[name] COLLATE DATABASE_DEFAULT As Name ,o.[type] COLLATE DATABASE_DEFAULT AS [Type] ,'['+SCHEMA_NAME(o.schema_id)+'].['+o.[name]+']' as FullName ,CASE WHEN o.[type] IN ('U','S') THEN t.tablecolumns ELSE OBJECT_DEFINITION(o.object_id) END AS [Source] ,@SearchPattern as[SearchPattern] FROM sys.objects AS o LEFT JOIN @tabletbl AS t ON t.[objectid] = o.[object_id] WHERE (lower(OBJECT_DEFINITION(o.object_id)) LIKE lower(@SearchPattern) OR (t.tablecolumns like lower(@SearchPattern) OR t.tablename LIKE lower(@Searchpattern))) AND o.[type] IN ( 'C',--- = Check constraint 'D',--- = Default (constraint or stand-alone) 'P',--- = SQL stored procedure 'FN',--- = SQL scalar function 'R',--- = Rule 'RF',--- = Replication filter procedure 'TR',--- = SQL trigger 'IF',--- = SQL inline table-valued function 'TF',--- = SQL table-valued function 'U', --- = User Table 'S', --- = System Table 'V') --- = View UNION ALL SELECT *,@SearchPattern FROM @jobtbl ORDER BY 3
If you find this script useful, you’re welcome to use it. I look forward to seeing what others contribute! Thank you Bert for an awesome topic!
As always, thank you for reading.
One thought on “T-SQL Tuesday #104: Code I’d Hate To Live Without”