2011-08-15 3 views
0

모든 프로 시저에서 특정 문자열을 검색하고 바꾸는 프로 시저를 만드는 방법이 있습니까?SQL Server의 프로 시저간에 문자열 교체

+0

조금 더 자세한 정보를 제공해주세요. 모든 테이블 또는 특정 필드의 모든 필드를 검색하려고합니까? – Marc

+0

인스턴트 메신저 저장 프로 시저에서 소프트웨어 자체와 의견을 교환하려고 시도했지만 수동으로 너무 많은 프로 시저를 하나씩 수행하는 방법이 있습니다 –

+2

그래서 사용자 정의 프로 시저 정의를 대량으로 업데이트하려고합니다. ? –

답변

2

아마도 응용 프로그램을 수정하는 것이 더 쉬울 것입니다. 왜 소프트웨어는 코멘트에 관심을 갖습니까? 그것은 또한 확장 속성에 barf합니까? 댓글이 항상 동일 가정

, 텍스트 결과 Management Studio에서이 작업을 실행

SET NOCOUNT ON; 

SELECT 'GO 
    ' + REPLACE([definition], '/* offending comment */', '') 
    FROM sys.sql_modules 
    WHERE [definition] LIKE '%/* offending comment */%'; 

GO로 구분 CREATE PROCEDURE 일련의 명령을 얻을 것입니다. CREATE PROCEDURE에 대해 검색/작성을 수행하고 저장 프로 시저 본문에 실제 CREATE PROCEDURE 문자열이있는 경우 ALTER으로 변경할 수 없습니다. 이것은 당신이 의견 이없는 것으로 가정했지만 (

GO 
ALTER PROCEDURE 

:로 대체

GO 
CREATE PROCEDURE 

: 대한 그래서 그 대신 당신은 당신이 좋아하는 텍스트 편집기에이 결과를 끌어와 검색을 수행하고 교체 할 수 있습니다 . 당신이 할 경우CREATE PROCEDURE 라인 전에, 당신은 당신의 검색으로 더 창조적하고 교체해야합니다)

을 유효한 문자열 CREATE PROCEDURE를 포함하는 절차에 대해 걱정할 필요가없는 경우 -. 당신이 걱정하지 않는 경우 D

SET NOCOUNT ON; 

SELECT 'GO 
    ' + REPLACE(REPLACE([definition], '/* offending comment */', ''), 
    'CREATE PROCEDURE', 'ALTER PROCEDURE') 
    FROM sys.sql_modules 
    WHERE [definition] LIKE '%/* offending comment */%'; 

... 당신의 구문은 실제로 CREATE PROCEDURE하지 CREATE PROC 또는 CREATEPROC 사이에 시스템이 대소 문자를 구분하지 않습니다 당신이 create proc 또는 Create Proc를 사용하는 임의의 간격이라고 가정 저장 프로 시저와 관련된 기존 유형의 개체 (예 :

SELECT 'DROP PROCEDURE ' 
    + QUOTENAME(OBJECT_SCHEMA_NAME([object_id])) 
    + '.' + QUOTENAME(OBJECT_NAME([object_id])) + '; 
    ' + 'GO 
    ' + REPLACE([definition], '/* offending comment */', '') 
FROM sys.sql_modules 
WHERE [definition] LIKE '%/* offending comment */%'; 

이 그냥 절차을 삭제하고 재 - 생성하기 때문에 (그래서 변경할 필요가 없습니다, 갈 준비가 훨씬 더 가까이있는 스크립트를 생성합니다 : 권한, 당신은 이런 식으로 할도 수 CREATE to ALTER)하지만 권한 및/또는 종속성으로 인해 개체를 삭제하고 다시 만들 수는 없습니다.

CREATE OR REPLACE 또는 이와 유사한 DDL을 사용하면 스크립트를 훨씬 쉽게 작성할 수 있습니다. 당신이 SQL Server에 귀중한 보탬이 될 것이라고 판단되는 경우, 다음과 같은 제안에 대한 투표 (및 사용 사례를 추가하거나 당신이 생각하는 이유는 코멘트에 도움이 될 것입니다)하십시오

http://connect.microsoft.com/SQLServer/feedback/details/127219/create-or-replace

+0

감사합니다 ur 설명을 많이!주석의 간섭에 대해서, 그것 때문에 우리가 엄청난 양의 절차와 라인을 이야기하고 있기 때문에 수동으로 처리하는 것이 영원히 필요합니다. –

+0

오 검사! 매우 유용한 스크립트에 대해 Aaron Bertrand에게 감사드립니다. 두 테이블에서 "update statistics"를 실행하는 일련의 저장 프로 시저가 있었으며 "fullscan, columns를 사용하여 통계 업데이트"라고 말하도록 변경해야했습니다. 이 (두 번째 것)은 내가하고 싶었던 것 - ALTER 스크립트를 생성합니다. "sp_MSforEachDB"루프와 통합하여 Presto! – NateJ

+0

아니요, sp_msforeachdb를 사용하지 마십시오. http://sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/a-more-reliable-and-more-flexible-sp-msforeachdb.aspx –

0

방법 .sql 파일로 저장된 프로 시저의 모든 스크립트를 생성 한 다음 생성 된 파일의 주석을 CTRL + H의 도움말로 바꾸십시오. 더 쉬운 옵션이 아닙니까?

+0

수도 있습니다. ,하지만 5,000 개의 프로 시저가 있고 그 중 150 개의 프로 시저에 주석이 포함되어 있다면 ... 주석을 포함하는 프로 시저 (WHERE 절이 필요함)로 제한하려고한다면 REPLACE()'호출 전에 출력을 얻으시겠습니까? –

+0

나는 당신의 요지를 확실히 봅니다. 그러나 마법사를 통해 스크립트를 생성하면 스크립트의 형식은 그대로 유지됩니다. 반면 우리가 이것을 가져 오기 위해 우리 자신의 쿼리를 실행한다면 포맷팅은 토스 (toss)를 취할 것이고 나는 그것이 저자를 혼란스럽게하는지 궁금해하고있다. 모든 주석이 SP의 시작 부분에 있다면 괜찮을 것입니다.하지만 해당 SP 내의 특정 코드 블록의 주석을 대체하고 싶다면 어떻게해야합니까? – vmvadivel

+0

서식이 "던지기"를하는 이유는 무엇입니까? 어쩌면 결과를 그리드에 사용하지만 텍스트에 대한 결과가 정확해야합니다 (프로 시저가 최대 텍스트 출력보다 긴 경우). 주석의 유형과 주석이 프로 시저 본문에있는 경우에는 문제의 세부 사항이 부족하기 때문에 어느 것에 대해서도 알지 못하지만 문제가되지 않아야합니다. –

관련 문제