Search inside objects (Sprocs, FUnctions, etc) - sql-server

I am currently using sys.syscomments to locate objects where a certain parameter exists. Is there another method / process for doing this that would make it easier to find the objects that contain that parameter or term?
Thanks,
S

It would be preferable to use the definition column of sys.sql_modules instead. sys.syscomments text is nvarchar(4000) so you can have issues with truncation when a definition splits across multiple rows.
select quotename(s.name)+'.'+quotename(o.name) as object_name, o.type_desc
from sys.sql_modules m
inner join sys.objects o
on m.object_id = o.object_id
inner join sys.schemas s
on o.schema_id = s.schema_id
where m.definition like '%YourSearchText%'

Also, if you're not doing this programmatically, Red Gate offers a free plug-in for SSMS called SQL Search; I'm not sure if there are other tools available.

Related

How to list all database objects with no dependencies?

I would like to list all database objects in a Microsoft SQL database that have no dependencies - e.g. there are no other database objects that depend on them.
I could find this for each table in SQL Server Management Studio, but this is very time consuming (right click on a table, "Check Dependencies"):
(example of a table with no dependencies)
I'm looking how to do this programatically for all database objects in a database - in T-SQL.
You can use the following script to get all objects with no dependendcies.
SELECT
schema_name = s.name,
o.name,
FROM sys.objects o
JOIN sys.schemas s ON s.schema_id = o.schema_id
WHERE NOT EXISTS (SELECT 1
FROM sys.objects o2
WHERE o2.parent_object_id = o.object_id
)
AND NOT EXISTS (SELECT 1
FROM sys.sql_expression_dependencies sed
WHERE sed.referenced_id = o.object_id
);
Note that the first NOT EXISTS will exclude all objects with keys, indexes or defaults. If you only want to look at procedures, functions and views, then remove that.
SELECT
schema_name = s.name,
o.name,
FROM sys.objects o
JOIN sys.schemas s ON s.schema_id = o.schema_id
WHERE NOT EXISTS (SELECT 1
FROM sys.sql_expression_dependencies sed
WHERE sed.referenced_id = o.object_id
);
Note also that dependency checking is not perfect. In particular, dynamic SQL obviously doesn't work, and it won't check application code.
But it's also not reliable for cases when the schema is not specified in the reference.
Charlieface, thanks again for your answer!
I just needed this again and I revisited your answer. I have a small update to your solution / query.
The query returns system tables too, which is something one probably doesn't want to have in the results list.
Updated query:
SELECT
schema_name = s.name,
o.name,
o.type_desc
FROM
sys.objects o
INNER JOIN
sys.schemas s ON s.schema_id = o.schema_id
WHERE
NOT EXISTS (SELECT 1 FROM sys.objects o2 WHERE o2.parent_object_id = o.object_id)
AND NOT EXISTS (SELECT 1 FROM sys.sql_expression_dependencies sed WHERE sed.referenced_id = o.object_id)
AND o.type_desc<>'SYSTEM_TABLE'

How to check a SQL Server view dependencies

I need to modify a SQL Server view in a large database and need to know what other objects in this database use this view. How can I do that?
I tried viewing dependencies in SQL Server Management Studio but that does not list the objects that depend on this view (I know of at least one stored procedure that depends on this view, and it is not listed as a dependency).
The other option that I considered is scripting the whole database and doing the text search in it, but I want to see if there is an automated way to do this.
Try to query syscomments table and find the usage.
select o.name,o.type from sys.syscomments c
inner join sys.objects o
on o. object_id = c.id
where c.text like '%your view name%'
Update #1
select o.name,o.type from sys.sql_modules m
inner join sys.objects o
on o.object_id = m.object_id
where m.definition like '%your view name%'

How to know which stored procedure has cross database query

I want to know which stored procedure has cross database/ linked server call.
I know i can do some kind string search with database name being string to search.
One of the example of it as below
SELECT DISTINCT
o.name AS Object_Name,
o.type_desc
FROM sys.sql_modules m
INNER JOIN
sys.objects o
ON m.object_id = o.object_id
WHERE m.definition Like '%{{DBNAME}}%';
but if possible then i do not want to go for string search so is there any other way to find all procedure which might have cross database/ linked server ?
There is a system view sys.sql_expression_dependencies that provides exactly this information:
select d.*
from sys.sql_expression_dependencies d
where d.referenced_database_name is not null
and d.is_ambiguous = 0;
Pay attention, however, that some of the references might be "fake", or rather not what you expect. For example, XML methods are also listed in it, which might cause some confusion.

list of views referencing a table

Is there any way to know if a particular table is being referenced by any Views or not.I used the below code which gives only SP's and function names:
select * from sys.objects p inner join sys.sql_modules m
on p.object_id = m.object_id
where m.definition like '%abc%'
Please help!!!
select *
from INFORMATION_SCHEMA.VIEWS
where VIEW_DEFINITION like '%abc%'
First, your query gives views in the result set (I tried it on AdentureWorks2012 -> Production.Product table):
If you're using SQL Server 2008 or above, you can use the sys.sql_expression_dependencies catalog view. For example:
SELECT
referencing_object_name = o.name,
referencing_object_type_desc = o.type_desc,
referenced_object_name = referenced_entity_name,
referenced_object_type_desc = o1.type_desc
FROM sys.sql_expression_dependencies sed
INNER JOIN sys.objects o
ON sed.referencing_id = o.[object_id]
LEFT OUTER JOIN sys.objects o1
ON sed.referenced_id = o1.[object_id]
WHERE referenced_entity_name = 'YourTable'
It will give you nice look on each by-name dependency on a user-defined entity
For column level dependencies you can use the sys.dm_sql_referenced_entities function
Hope this helps
If you need to find database objects (e.g. tables, columns, triggers) by name - have a look at the FREE Red-Gate tool called SQL Search which does this - it searches your entire database for any kind of string(s).
It's a great must-have tool for any DBA or database developer - did I already mention it's absolutely FREE to use for any kind of use??
If that doesn't fit your bill - you could also check out the sysdepends catalog view in SQL Server - it lists what objects depend on what (see details in the MSDN docs).
To find out what objects depend on a given table, you could use something like:
SELECT
id,
OBJECT_NAME(ID)
FROM sys.sysdepends
WHERE depid = OBJECT_ID('YourTable')
That should give you a list of all objects depending on that table (or view or whatever you're checking)

Is it possible to find the objects which depend on a synonym?

I tried exec sp_depends #objname = 'sfel.elpc' but I did not get any results, but I know the synonym is referenced in at least one stored procedure.
try:
SELECT DISTINCT
o.name,o.type_desc
FROM sys.sql_modules m
INNER JOIN sys.objects o ON m.object_id=o.object_id
WHERE m.definition Like '%sfel.elpc%'
You could try SQL Search by Red Gate, which is free. I'm by no means sure whether it supports synonyms, but might be worth a try if no other solutions are suggested.
this code is better:
SELECT
*
FROM sys.sql_modules m
INNER JOIN sys.objects o ON m.object_id=o.object_id
WHERE m.definition Like '%sfel.elpc%' and type = 'p'
this code give you a more limited list of objects.

Resources