una - procedimiento almacenado para buscar un registro en sql
Encuentre todos los procedimientos almacenados que hacen referencia a una columna especĂfica en alguna tabla (8)
Tengo un valor en una tabla que cambió inesperadamente. La columna en cuestión es CreatedDate
: se establece cuando se crea mi elemento, pero está siendo modificado por un procedimiento almacenado.
¿Podría escribir algún tipo de instrucción SELECT
para obtener todos los nombres de procedimientos que hacen referencia a esta columna de mi tabla?
Puede usar la consulta siguiente para identificar los valores. Pero tenga en cuenta que esto no le dará los resultados del procedimiento almacenado encriptado.
SELECT DISTINCT OBJECT_NAME(comments.id) OBJECT_NAME
,objects.type_desc
FROM syscomments comments
,sys.objects objects
WHERE comments.id = objects.object_id
AND TEXT LIKE ''%CreatedDate%''
ORDER BY 1
Puede usar ApexSQL Search , es un complemento gratuito de SSMS y Visual Studio y puede enumerar todos los objetos que hacen referencia a una columna de tabla específica. También puede encontrar datos almacenados en tablas y vistas. Puede filtrar fácilmente los resultados para mostrar un tipo de objeto de base de datos específico que haga referencia a la columna
Descargo de responsabilidad: trabajo para ApexSQL como ingeniero de soporte
Puede usar las vistas del sistema contenidas en information_schema
para buscar en tablas , vistas y procedimientos almacenados (sin cifrar) con una secuencia de comandos. Desarrollé un script de este tipo hace algún tiempo porque necesitaba buscar nombres de campo en todas partes en la base de datos.
La siguiente secuencia de comandos enumera las tablas / vistas que contienen el nombre de la columna que está buscando y luego el código fuente de los procedimientos almacenados donde se encuentra la columna. Muestra el resultado en una tabla que distingue "BASE TABLE", "VIEW" y "PROCEDURE" , y (opcionalmente) el código fuente en una segunda tabla:
DECLARE @SearchFor nvarchar(max)=''%CustomerID%'' -- search for this string
DECLARE @SearchSP bit = 1 -- 1=search in SPs as well
DECLARE @DisplaySPSource bit = 1 -- 1=display SP source code
-- tables
if (@SearchSP=1) begin
(
select ''[''+c.table_Schema+''].[''+c.table_Name+''].[''+c.column_name+'']'' [schema_object],
t.table_type
from information_schema.columns c
left join information_schema.Tables t on c.table_name=t.table_name
where column_name like @SearchFor
union
select ''[''+routine_Schema+''].[''+routine_Name+'']'' [schema_object],
''PROCEDURE'' as table_type from information_schema.routines
where routine_definition like @SearchFor
and routine_type=''procedure''
)
order by table_type, schema_object
end else begin
select ''[''+c.table_Schema+''].[''+c.table_Name+''].[''+c.column_name+'']'' [schema_object],
t.table_type
from information_schema.columns c
left join information_schema.Tables t on c.table_name=t.table_name
where column_name like @SearchFor
order by c.table_Name, c.column_name
end
-- stored procedure (source listing)
if (@SearchSP=1) begin
if (@DisplaySPSource=1) begin
select ''[''+routine_Schema+''].[''+routine_Name+'']'' [schema.sp], routine_definition
from information_schema.routines
where routine_definition like @SearchFor
and routine_type=''procedure''
order by routine_name
end
end
Si ejecuta la consulta, use la opción "resultado como texto", luego puede usar "buscar" para ubicar el texto de búsqueda en el conjunto de resultados (útil para el código fuente largo).
Tenga en cuenta que puede establecer @DisplaySPSource
en 0
si solo desea mostrar los nombres SP, y si solo está buscando tablas / vistas, pero no para SP, puede establecer @SearchSP
en 0
.
Ejemplo de resultado (busque CustomerID
en la base de datos Northwind, los resultados se muestran a través de LinqPad):
Tenga en cuenta que he verificado este script con una vista de prueba dbo.TestOrders
y encontró el dbo.TestOrders
CustomerID
en esta vista aunque c.*
Se usó en la declaración SELECT
(la tabla referenciada Customers
contiene el CustomerID
y por lo tanto, la vista muestra esta columna) .
Si desea obtener procedimientos almacenados utilizando solo una columna específica, puede utilizar esta consulta:
SELECT DISTINCT Name
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE ''%CreatedDate%'';
Si desea obtener procedimientos almacenados utilizando una columna específica de la tabla, puede utilizar la siguiente consulta:
SELECT DISTINCT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE ''%tbl_name%''
AND OBJECT_DEFINITION(OBJECT_ID) LIKE ''%CreatedDate%'';
Tuve el mismo problema y encontré que Microsoft tiene un systable que muestra dependencies .
SELECT
referenced_id
, referenced_entity_name AS table_name
, referenced_minor_name as column_name
, is_all_columns_found
FROM sys.dm_sql_referenced_entities (''dbo.Proc1'', ''OBJECT'');
Y esto funciona tanto con Views
como con Triggers
.
Una opción es crear un archivo de script.
Haga clic derecho en la base de datos -> Tareas -> Generar secuencias de comandos
Luego puede seleccionar todos los procedimientos almacenados y generar el script con todos los sps. Entonces puedes encontrar la referencia desde allí.
O
-- Search in All Objects
SELECT OBJECT_NAME(OBJECT_ID),
definition
FROM sys.sql_modules
WHERE definition LIKE ''%'' + ''CreatedDate'' + ''%''
GO
-- Search in Stored Procedure Only
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE ''%'' + ''CreatedDate'' + ''%''
GO
SERVER SQL de origen : columna de búsqueda utilizada en el procedimiento almacenado - Buscar procedimiento almacenado para el nombre de columna
prueba esto..
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE ''%CreatedDate%''
GO
o puede generar scripts de todos los procedimientos y buscar desde allí.
SELECT *
FROM sys.all_sql_modules
WHERE definition LIKE ''%CreatedDate%''