2012-04-22 10 views
9

En realidad, esta es una pregunta de 2 partes.La forma más rápida/más fácil de utilizar Buscar/Reemplazar a través de todos los procedimientos almacenados

  1. ¿Es posible utilizar algún tipo de funcionalidad para buscar a través de todos los procedimientos almacenados para una cadena y posiblemente reemplazarlo, como un estándar de Buscar/Reemplazar la función?

  2. Si ha todo el código de procedimiento almacenado incluir la ruta completa base de datos como éste [db1].[dbo].[table1] y cambiar el nombre de la base de [db2] ¿hay alguna manera para SQL Server para actualizar automáticamente todo el código de [db1] tablas a [db2]? ¿O tiene que hacerse manualmente?

Respuesta

10

a buscar: si usted necesita para encontrar objetos de bases de datos (por ejemplo, tablas, columnas, triggers) por su nombre - echar un vistazo a la herramienta GRATIS Rojo-Puerta llamada SQL Search que hace esto - se busca en su base de datos para cualquier tipo de cuerda (s).

enter image description here

enter image description here

Es una gran herramienta indispensable para cualquier desarrollador DBA o base de datos - lo que ya se menciono que es absolutamente GRATIS a utilizar para cualquier tipo de uso?

Esta herramienta no es compatible con el reemplazo de texto, sin embargo, aunque solo sea capaz de encontrar, todos los procedimientos almacenados relevantes (u otros objetos DB) son muy útiles.

+0

No necesita una herramienta para Buscar. Hay consultas que pueden hacer eso. 'Seleccionar * De sys.sql_modules M Inner Unir sys.objects O en M.object_id = O.object_id Donde M.definition como '% text%'' – mbomb007

5
  1. Exportar todo a los SP archivo. Use su herramienta de edición de texto favorita para buscar/reemplazar. Actualice la base de datos ejecutando el script (siempre que no cambie el nombre de los procedimientos).

  2. Si define explícitamente la ruta completa de la base de datos, necesita actualizar manualmente (ver arriba) los procedimientos almacenados. Si no incluye el nombre de la base de datos, o utiliza un servidor vinculado o similar, no es necesario realizar cambios.

+0

Gracias pero me gustaría evitar cualquier trabajo de campo, también podría abrir todos los SP en una ventana de SQL, y usar la búsqueda/reemplazo de SQL en la Solución completa, parece ser un poco más fácil, pero me gusta la herramienta de marc_s , esto también se ve genial. –

3

procedimientos almacenados no pueden ser actualizados en su lugar sin antes secuencias de comandos a cabo como ALTER PROCEDURE declaraciones (o DROP/CREATE, pero yo prefiero ALTER PROCEDURE ..más sobre esto en un momento). La buena noticia es que puede secuenciar todos los procedimientos en un único archivo a través de SSMS. Las declaraciones DDL inicialmente serán CREATE PROCEDURE, que deberá reemplazar con ALTER PROCEDURE, junto con sus otros cambios.

Si bien podría guiar alternativamente los procedimientos como DROP/CREATE, no me gusta hacer esto para un gran número de secuencias de comandos, ya que tiende a causar errores de dependencia.

En cuanto a la parte 2 de su pregunta, deberá editar los cambios de ruta de la base de datos manualmente a través del script.

+0

Definitivamente no es un método que estaba buscando, pero gracias por su aporte. –

+0

¿No es el método que está buscando secuenciar sus procesos almacenados en un solo archivo y luego buscar/reemplazar dentro de ese archivo? ¿Por qué? Me parece que cualquier otro método sería mucho más trabajo. –

+1

Para la secuencia de comandos, haga clic con el botón derecho en el nombre de la base de datos en el explorador de objetos .. Tareas .. Generar secuencias de comandos ... elija sus objetos con el asistente. Busque y reemplace todas las apariciones de 'CREATE VIEW [' con 'ALTER VIEW [', y del mismo modo para 'PROCEDURE',' PROC' y 'FUNCTION'. Como beneficio adicional, esta es también una excelente forma de encontrar cualquier error, como "tiene demasiados argumentos especificados". cuando sus funciones han cambiado la cantidad de parámetros y el resto de la base del código no se ha alcanzado. –

30

Desde la ventana Detalles del explorador de objetos en SSMS, abra la carpeta de procedimientos almacenados. Seleccione todos los objetos (puede seleccionar varias veces desde esta ventana, que es prácticamente el único propósito de la ventana Detalles del explorador de objetos) y haga clic con el botón secundario, eligiendo guiones como DROP y CREAR. Ahora puede hacer una búsqueda/reemplazo en esto, reemplazando todo lo que necesita de una vez antes de ejecutarlo.

Edición: He escribió en su blog acerca de esta solución: http://www.simple-talk.com/blogs/2012/04/24/ever-wondered-what-the-object-explorer-details-window-is-for/

+1

Exactamente lo que necesitaba. También creo que esta es la mejor respuesta a la pregunta 1 del PO. –

+1

Gracias por el voto popular. Agregué un enlace a una publicación de blog que escribí para describir mejor esta útil sugerencia de SSMS. –

+1

Esto definitivamente debería ser la respuesta elegida. Muy útil, gracias. – EvilDr

0

No hay manera de hacer esto con funcionalidad incorporada. Si bien no te ayuda hoy, te sugiero que cambies todas tus referencias al synonyms mientras estás allí. De esta forma, cuando esto vuelva a ocurrir en el futuro (y volverá a suceder), todas sus referencias externas estarán en un solo lugar y se actualizarán fácilmente. Por cierto, tengo un blog post en este último.

2

puede buscar en el texto de las definiciones de procedimientos almacenados usando este

SELECT 
    Name 
FROM 
    sys.procedures 
WHERE 
    OBJECT_DEFINITION(OBJECT_ID) LIKE '%YourSearchText%' 

Sustitución es generalmente una mala idea, ya que no se conoce el contexto del texto que encontrará en los procedimientos almacenados. Es probable que sea posible a través de scripts de Powershell.

Prefiero esta solución a cualquier otra, ya que me siento cómodo escribiendo consultas, por lo que encontrar texto en todos los procesos almacenados, que están en esquema (x) y base de datos (y) y nombres que comienzan con (z) es bastante una consulta fácil e intuitiva.

+0

Incidentalmente uso esta técnica regularmente para describir con precisión lo que describe el op -> Buscar referencias de bases de datos codificadas que se cuelan en las bases de datos de desarrollo a veces. – Runonthespot

22

Último pero útil.

Hay un free search tool from ApexSQL que puede encontrar y cambiar el nombre de los objetos en la base de datos.

Dicen que tiene una opción de cambio de nombre inteligente que buscará/reemplazará todas las apariciones de algún objeto como tabla, función o procedimiento almacenado.

Debo agregar que no he usado la funcionalidad de cambio de nombre, pero puedo confirmar que la búsqueda está funcionando bastante bien.

Además, no estoy afiliado a ApexSQL pero sí uso sus herramientas.

-1

Hmm, dejando caer y reconstruyendo todos los procedimientos trabajados, desafortunadamente se estrelló el servidor SQL en el que se basaba el SCADA para una fábrica bastante grande.

Se guardó un poco de esfuerzo editándolos individualmente y la fábrica solo se detuvo hasta que reinicié el servidor.

Pero tenga un poco de precaución me parece. Estaba justo craying por un momento allí.

0

Encontré este script donde puede definir buscar y reemplazar por texto y simplemente ejecutarlo para obtener el texto reemplazado en todos los procedimientos a la vez. Espero que esto te ayude a granel.

-- set "Result to Text" mode by pressing Ctrl+T 
SET NOCOUNT ON 

DECLARE @sqlToRun VARCHAR(1000), @searchFor VARCHAR(100), @replaceWith VARCHAR(100) 

-- text to search for 
SET @searchFor = '[MY-SERVER]' 
-- text to replace with 
SET @replaceWith = '[MY-SERVER2]' 

-- this will hold stored procedures text 
DECLARE @temp TABLE (spText VARCHAR(MAX)) 

DECLARE curHelp CURSOR FAST_FORWARD 
FOR 
-- get text of all stored procedures that contain search string 
-- I am using custom escape character here since i need to espape [ and ] in search string 
SELECT DISTINCT 'sp_helptext '''+OBJECT_SCHEMA_NAME(id)+'.'+OBJECT_NAME(id)+''' ' 
FROM syscomments WHERE TEXT LIKE '%' + REPLACE(REPLACE(@searchFor,']','\]'),'[','\[') + '%' ESCAPE '\' 
ORDER BY 'sp_helptext '''+OBJECT_SCHEMA_NAME(id)+'.'+OBJECT_NAME(id)+''' ' 

OPEN curHelp 

FETCH next FROM curHelp INTO @sqlToRun 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    --insert stored procedure text into a temporary table 
    INSERT INTO @temp 
    EXEC (@sqlToRun) 

    -- add GO after each stored procedure 
    INSERT INTO @temp 
    VALUES ('GO') 

    FETCH next FROM curHelp INTO @sqlToRun 
END 

CLOSE curHelp 
DEALLOCATE curHelp 

-- find and replace search string in stored procedures 
-- also replace CREATE PROCEDURE with ALTER PROCEDURE 
UPDATE @temp 
SET spText = REPLACE(REPLACE(spText,'CREATE PROCEDURE', 'ALTER PROCEDURE'),@searchFor,@replaceWith) 

SELECT spText FROM @temp 
-- now copy and paste result into new window 
-- then make sure everything looks good and run 
GO 

Aquí es el enlace de referencia:
http://www.ideosity.com/ourblog/post/ideosphere-blog/2013/06/14/how-to-find-and-replace-text-in-all-stored-procedures

1

acabo de ejecutar este código para encontrar un texto específico en todos los procedimientos almacenados:

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 '%textToFind%' 
    or m.definition Like '%\[ifTextIsAColNameWithBrackets\]%' ESCAPE '\'; 
0

Si usted tiene el tiempo de inactividad disponible.

Vaya a "Generar scripts" y genere scripts 'crear' para todas sus sprocs que quiera editar.

Reemplace el texto en el script y simplemente suelte y vuelva a crear todos ellos.

Cuestiones relacionadas