programing

SQL Server Management Studio GUI에서 반환한 소스와 동일한 SQL Server 저장 프로시저 소스를 프로그래밍 방식으로 검색하시겠습니까?

oldcodes 2023. 6. 28. 21:57
반응형

SQL Server Management Studio GUI에서 반환한 소스와 동일한 SQL Server 저장 프로시저 소스를 프로그래밍 방식으로 검색하시겠습니까?

SQL Server Management Studio에서 저장 프로시저를 마우스 오른쪽 단추로 클릭하고 modify를 선택할 때와 같이 정확히 동일한 저장 프로시저 소스를 SQL Server 2005에서 프로그래밍 방식으로 가져올 수 있는 방법에 대한 포인터가 있습니까?

저는 SMO를 사용하려고 노력하고 있지만, 몇 가지 텍스트 차이가 있습니다.프로시저에는 항상 ALTER가 아닌 CREATE가 있으며, 제가 프로그래밍 방식으로 받는 버전에서 GO가 누락되는 등 헤더에 약간의 차이가 있습니다.제가 고칠 수는 있지만, 더 좋은 방법이 있을까요?

저는 SQL Server 2005에서 SMSE를 사용하고 있습니다.Visual Studio 8 2008을 통한 SMO 사용.

업데이트: 저장 프로시저를 검색하는 방법에 대한 기본 사항을 알려주는 몇 가지 답변을 받았습니다.제가 찾고 있는 것은 GUI가 생성하는 것과 동일한(또는 거의 동일한) 텍스트를 검색하는 것입니다.

예: sp_mysp의 경우 Management Studio에서 마우스 오른쪽 버튼을 클릭하고 modify를 선택합니다.이렇게 하면 다음이 생성됩니다.

[MY_DB] 사용가세요개체:저장 프로시저 [dbo].[sp_mysp] 스크립트 날짜: 01/21/2009 17:43:18 *****/ANSI_NULLSON 설정가세요따옴표_식별자 설정가세요-- =============================================작성자:작성 날짜:설명:-- =============================================절차 변경 [dbo].[sp_mysp]

저는 프로그래밍 방식으로 동일한 것을 얻고 싶습니다(헤더의 GO와 ALTER 절차라는 사실에 주목하십시오).이상적으로는 소스의 최소한의 프로그램 수정으로 이 정보를 얻고 싶습니다.

스크립트 날짜 세부 정보에 차이가 있는 것만 얻으면 좋겠습니다. .

EXEC sp_helptext 'your procedure name';

이렇게 하면 저장 프로시저가 너무 길면 중단되는 INFORMATION_SCHEMA 접근 방식의 문제를 피할 수 있습니다.

업데이트: 데이비드는 이것이 자신의 프로시저와 동일하지 않다고 쓰고 있습니다.서식을 보존하기 위해 행을 '슬립'으로 반환하기 때문일까요?결과를 보다 '자연스러운' 형식으로 보려면 Ctrl-T를 먼저 사용하면(텍스트로 출력) 입력한 대로 정확히 출력됩니다.코드에서 이 작업을 수행하는 경우 결과를 정확히 동일한 방식으로 조합하기 위해 각 작업을 수행하는 것은 사소한 일입니다.

업데이트 2: 이렇게 하면 소스에 "ALTER PROCEDURE"가 아닌 "CREATE PROCEDURE"가 제공되지만, "ALTER"를 대신 사용할 수 있는 방법은 없습니다.하지만, 좀 사소한 일이죠, 그렇죠?

업데이트 3: 소스 제어 시스템에서 SQL DDL(데이터베이스 구조)을 유지 관리하는 방법에 대한 자세한 내용은 의견을 참조하십시오.그것이 정말로 이 질문의 핵심입니다.

수동으로 코딩해야 합니다. SQL Profiler는 다음과 같이 밝혔습니다.

SMSE는 문을 생성할 때 상당히 긴 쿼리 문자열을 실행합니다.

다음 쿼리(또는 해당 줄에 있는 쿼리)를 사용하여 텍스트를 추출합니다.

SELECT
NULL AS [Text],
ISNULL(smsp.definition, ssmsp.definition) AS [Definition]
FROM
sys.all_objects AS sp
LEFT OUTER JOIN sys.sql_modules AS smsp ON smsp.object_id = sp.object_id
LEFT OUTER JOIN sys.system_sql_modules AS ssmsp ON ssmsp.object_id = sp.object_id
WHERE
(sp.type = N'P' OR sp.type = N'RF' OR sp.type='PC')and(sp.name=N'#test___________________________________________________________________________________________________________________00003EE1' and SCHEMA_NAME(sp.schema_id)=N'dbo')

그것은 순수 CREATE를 반환하고 코드 어딘가에서 ALTER로 대체됩니다.

SET ANSI NULL 항목과 GO 문 및 날짜는 모두 여기에 추가됩니다.

sp_helptext와 함께 사용하면 더 간단합니다...

프로그래밍 방식으로 말씀하셨죠?C#가 괜찮기를 바랍니다.SMO를 사용해 보았지만 원하는 대로 작동하지 않았다고 말씀하셨기 때문에 요청에 적합하지 않을 수도 있지만 저장 프로시저를 재생성하기 위해 실행할 수 있는 합법적인 SQL 문을 프로그래밍 방식으로 읽을 수 있습니다.만약 그것이 없다면 그것은GO당신이 원하는 진술, 당신은 아마도 각각의 문자열들을 가정할 수 있습니다.StringCollection가질 수 있었습니다.GOㅠㅠㅠㅠ 는 받지 도 있지만, 모든 배포 툴되었습니다.날짜와 시간이 포함된 코멘트를 받지 못할 수도 있지만, 유사한 프로젝트(모든 것을 개별적으로 백업해야 하는 대규모 배포 툴)에서는 이 작업이 상당히 잘 수행되었습니다.작업할 이전 기반이 있고 이를 실행할 원본 데이터베이스가 남아 있다면 초기 작업을 포기하고 이 출력에 대한 표준화를 다시 설정하는 것을 고려해 보겠습니다.

using System.Data.SqlClient;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
…
string connectionString = … /* some connection string */;
ServerConnection sc = new ServerConnection(connectionString);
Server s = new Server(connection);
Database db = new Database(s, … /* database name */);
StoredProcedure sp = new StoredProcedure(db, … /* stored procedure name */);
StringCollection statements = sp.Script;

전체 정의를 가져오려면 다음 select 문을 사용합니다.

select ROUTINE_DEFINITION 
  from INFORMATION_SCHEMA.ROUTINES 
 where ROUTINE_NAME = 'someprocname'

SSMS와 다른 도구들이 이것을 읽고 CREATE를 ALTER로 변경하는 등 필요한 부분을 변경하는 것 같습니다.제가 알기로는 SQL은 절차의 다른 표현을 저장하지 않습니다.

마크 말에 동의합니다.출력을 텍스트 모드로 설정한 다음 sp_HelpText 'proc'를 설정합니다.나는 이것을 쉽게 하기 위해 Crtl-F1에 바인딩했습니다.

데이터베이스 게시 마법사는 명령줄에서 스키마(및 기타 개체)를 덤프할 수 있습니다.

저는 단지 찾기 및 바꾸기를 사용하여 생성 절차를 변경하는 대신 드롭을 사용하는 것이 좋습니다. 드롭을 바로 위에 놓을 수 있고 텍스트 검색이 필요합니다.

IF exists (SELECT * FROM sys.objects 
        WHERE object_id = OBJECT_ID(N'sp_name')
            and type in ('P','V') --procedure or view
        )
    DROP sp_name
GO

만약 당신이 그것이 거기에 있다는 것이 확실하다면, 나는 당신도 그것을 떨어뜨릴 수 있다고 생각하지만, 나는 그것을 추천하지 않을 것입니다.생성 프로시저는 일괄 처리의 처음이자 유일한 문이어야 하므로 이동을 잊지 마십시오.

또는 게으른 접근법:

IF OBJECT_ID(N'sp_name') is not null
    DROP sp_name
GO

링크를 통해 기사를 보았습니다.네 가지 방법이 있습니다. 다른 프로그래머를 돕기 위해 여기서 간단히 요약했습니다.

  1. EXEC sp_help 텍스트 'sp_name';

  2. 객체 선택_ID( 'p_name')

  3. OBJECT_Definition(OBJECT_) 선택ID('p_name') AS [Definition];

  4. 시스템에서 *를 선택합니다.sql_message WHERE object_id = object_id("sp_name");

저장 프로시저를 변경하려면 C# 코드를 사용합니다.

SqlConnection con = new SqlConnection("your connection string");
con.Open();
cmd.CommandType = System.Data.CommandType.Text;
string sql = File.ReadAllText(YUOR_SP_SCRIPT_FILENAME);
cmd.CommandText = sql;   
cmd.Connection = con;
cmd.ExecuteNonQuery();
con.Close();

주의할 사항:

  1. 연결 문자열의 사용자에게 SP를 변경할 수 있는 권한이 있는지 확인합니다.
  2. 모든 항목 제거GO,SET ANSI_NULLS XX,SET QUOTED_IDENTIFIER스크립트 파일의 문입니다. 그렇지 않으면 SqlCommand에서 오류가 발생합니다.

언급URL : https://stackoverflow.com/questions/467482/programmatically-retrieve-sql-server-stored-procedure-source-that-is-identical-t

반응형