2017-09-15 4 views
1

Microsoft SQL Server 데이터베이스를 동일한 구조로 동기화하는 응용 프로그램을 만들었습니다. 해결해야 할 작업 중 하나는 소스 데이터베이스에서 대상으로 데이터베이스 루틴 (프로 시저, 함수, 트리거 등)을 전송하는 것입니다. 일상적인 전송을 위해 내가 쿼리를 사용Microsoft SQL Server에서 CLR 기능 텍스트는 어디에서 찾을 수 있습니까?

SELECT [definition] FROM sys.sql_modules WITH (NOLOCK) WHERE object_id = OBJECT_ID('SOME_OBJECT_ID') 

또는

SELECT * FROM INFORMATION_SCHEMA.ROUTINES where routine_name like '%SOME_ROUTINE_NAME%' 

그리고 그것은 CLR 기능을 제외한 모든 루틴 ( [type_desc] = CLR_TABLE_VALUED_FUNCTION 또는 [type_desc] = CLR_SCALAR_FUNCTION와 기능)에 대해 완벽하게 작동합니다.

텍스트는 sys.sql_modules 데이터 테이블에 저장되지 않으며 시스템보기 INFORMATION_SCHEMA.ROUTINES[ROUTINE_BODY] = EXTERNAL[ROUTINE_DEFINITION] = NULL 값을 포함합니다.

하지만 CLR 기능 텍스트는 사용자가 변경하면 변경되고 저장 될 수 있기 때문에 열 때마다 다시 만들어지지 않습니다.

그래서 CLR 기능 텍스트 위치에 대한 힌트를 주시면 감사하겠습니다.

업데이트 : .NET 라이브러리 함수 자체를 전송할 필요가 없습니다. 프로그래머 빌리티> 함수> 테이블 반환 함수에서 수동으로 작성한 래퍼 함수를 ​​전송하려고합니다.

+0

CLR 함수는 .NET에서 생성되고 SQL 서버에 등록 된 어셈블리 (dll)입니다. 어셈블리 sys.assemblies에서 목록을 가져올 수 있습니다. 따라서 SQL Server 내에서 CLR 함수에 대한 텍스트 정의를 가져올 수 없습니다. –

+0

@RahulRichhariya, CLR 함수 (= .NET 라이브러리 함수)를 전송하고 싶지 않지만 CLR_TABLE_VALUED_FUNCTION 또는 CLR_SCALAR_FUNCTION - 프로그래밍 가능> 함수> 테이블 반환 함수 목록에서 찾을 수있는 객체에 관한 질문을했습니다. 그리고이 객체를 표준 함수처럼 편집하고 저장할 수 있습니다 (SQL_SCALAR_FUNCTION). – Dmitry

+0

그래서, 'CREATE FUNCTION [dbo]. [len_s] (@str nvarchar (4000)) RETURNS bigint EXTERNAL NAME [SurrogateStringFunction]. [Microsoft.Samples.SqlServer]와 동일한 기능을 생성하려고합니다. .SurrogateStringFunction]. [LenS];'? –

답변

0

Server Profiler에서는 Management Studio에서 CLR 래퍼 기능을 작성하는 데 사용되는 35 가지의 동적 쿼리를 보여줍니다. 따라서 함수 텍스트는 불행하게도 즉시 작성되며 시스템 데이터베이스의 깊이에는 아무 것도 저장되지 않습니다.

0

CLR 함수 또는 프로 시저를 살펴 보려면 CLR 함수로 일부 단계를 수행해야하며 프로 시저가 어셈블리에서 만들어집니다.

스텝 1 : - 시스템을 파일로 어셈블리를 내보내기 PowerShell을 사용

스텝 2-http://www.sqlservercentral.com/blogs/erichumphrey/2012/03/02/extract-clr-assemblies-from-sql-server/

  • 다른 CLR 어셈블리 Bycreating : - 사용 .NET 조립 Decompiler는을 http://ilspy.net/ 또는 redgate 리플렉터

    이 방법은 어셈블리 작성자가 수행하지 않은 경우 작동합니다 디 컴파일을 방지하기위한 추가 단계.

  • +0

    데이터베이스간에 .NET 라이브러리를 전송할 필요가 없으며 Programmability> Functions> Table-valued Functions에서 생성 된 CLR 래퍼 함수를 ​​전송하려고합니다[email protected] Damien_The_Unbeliever의 코멘트를 보시고, 요지를 얻었습니다. – Dmitry

    +0

    괜찮아. Powershell을 사용하는 것이 좋습니까? 아니면 sql 쿼리 만 사용 하시겠습니까? –

    +0

    SQL 쿼리를 사용하는 것을 선호하지만 제공 할 수있는 솔루션에 대해 매우 감사드립니다. 그러나 모든 쿼리가'sys.sql_modules' 데이터 테이블에 있고 쉽게 선택 될 수 있고 (동일한 방식으로 보이고 같은 방식으로 변경 될 수있는) CLR 래핑 쿼리가 PowerShell을 사용하여 추출되어야한다는 것은 매우 이상하게 들립니다 . – Dmitry