문제

한 데이터베이스에 존재하지만 다른 데이터베이스에는 존재하지 않는 Information_schema.routines를 사용하여 저장된 프로 시저 정의 목록을 쿼리하려고합니다.

SELECT 
    t1.Routine_Definition
FROM
    [server1].MyDatabase.INFORMATION_SCHEMA.Routines t1 
LEFT JOIN
    [server2].MyDatabase.INFORMATION_SCHEMA.Routines t2 ON t1.Routine_Name = t2.Routine_Name
WHERE
    t2.Routine_Name is null


이것은 나에게 단일 줄의 쿼리 정의를 제공하므로 다음과 같은 주석이있을 때

--Some comment
SELECT Column
FROM Somewhere

SQL은 댓글을 달고 정의를 사용하여 sp를 만들 수 없습니다.

적절한 라인 브레이크로 이것을 다시 구문 분석하는 방법은 무엇입니까?
또는
이 스크립트를 얻는 더 좋은 방법이 있습니까 (코드 사용)?

도움이 되었습니까?

해결책

저장된 절차는 관리 스튜디오에서 한 줄에만 표시됩니다. 텍스트로 결과와 함께 쿼리를 실행하면 또는 다음을 사용하면 올바른 라인 브레이크를 얻을 수 있습니다.

declare @sql varchar(8000) -- varchar(max) in SQL 2005+

SELECT 
        @sql = t1.Routine_Definition
FROM
        INFORMATION_SCHEMA.Routines t1 

print @sql

다른 팁

DECLARE MY_CURSOR Cursor
FOR

SELECT 
        t1.Routine_Definition
FROM
        [server1].MyDatabase.INFORMATION_SCHEMA.Routines t1 
LEFT JOIN
        [server2].MyDatabase.INFORMATION_SCHEMA.Routines t2 ON t1.Routine_Name = t2.Routine_Name
WHERE
        t2.Routine_Name is null AND
        LEN(t1.Routine_Definition) < 4000



Open My_Cursor
DECLARE @sql VARCHAR(MAX) 

FETCH NEXT FROM MY_Cursor INTO @sql
While (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)

Print @sql

FETCH NEXT FROM MY_CURSOR INTO @sql
END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR
GO

CK의 솔루션을 구현 한 방법은 다음과 같습니다.

information_schema view는 정의에서 처음 4000 자만 리턴합니다. (이상적으로 당신은 그렇게 길지 않은 SP를 가지고 있지 않습니다) 당신은 수동으로 또는 다른 방법으로 스크립트를 만들고 싶을 것입니다.

저장된 절차를 얻는 가장 쉬운 방법은 SQL Server Management Studio에 내장 된 가져 오기/내보내기 유틸리티를 사용하는 것입니다. 여기에서 저장된 프로 시저 개체를 코드 창 또는 즉시 실행할 수있는 파일로 내보낼 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top