MSSQLSERVER_6522

적용 대상:SQL Server

세부 사항

attribute
제품 이름 SQL Server
이벤트 ID 6522
이벤트 원본 MSSQLSERVER
구성 요소 SQLEngine
심볼 이름 SQLCLR_UDF_EXEC_FAILED
메시지 텍스트 사용자 정의 루틴 또는 집계 "%.*ls"를 실행하는 동안 .NET Framework 오류가 발생했습니다. %ls.

설명

다음과 같은 시나리오를 고려해 보세요.

시나리오 1

Microsoft .NET Framework 어셈블리를 참조하는 CLR(공용 언어 런타임) 루틴을 만듭니다. .NET Framework 어셈블리는 922672 문서화되지 않습니다. 그런 다음 .NET Framework 3.5 또는 .NET Framework 2.0 기반 핫픽스를 설치합니다.

시나리오 2

어셈블리를 만든 다음 SQL Server 데이터베이스에 어셈블리를 등록합니다. 그런 다음 GAC(전역 어셈블리 캐시)에 다른 버전의 어셈블리를 설치합니다.

SQL Server에서 CLR 루틴을 실행하거나 이러한 시나리오 중 하나에서 어셈블리를 사용하는 경우 다음과 유사한 오류 메시지가 표시됩니다.

서버: Msg 6522, 수준 16, 상태 2, 줄 1
사용자 정의 루틴 또는 집계 'getsid'를 실행하는 동안 .NET Framework 오류가 발생했습니다.

System.IO.FileLoadException: 파일 또는 어셈블리 'System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 또는 해당 종속성 중 하나를 로드할 수 없습니다. 호스트 저장소의 어셈블리에는 GAC의 어셈블리와 다른 서명이 있습니다. (HRESULT 예외: 0x80131050)

가능한 원인

CLR이 어셈블리를 로드할 때 CLR은 동일한 어셈블리가 GAC에 있는지 확인합니다. 동일한 어셈블리가 GAC에 있는 경우 CLR은 이러한 어셈블리의 MVID(모듈 버전 ID)가 일치하는지 확인합니다. 이러한 어셈블리의 MVID가 일치하지 않으면 설명 섹션에 설명된 오류 메시지가 표시됩니다.

어셈블리가 다시 컴파일되면 어셈블리의 MVID가 변경됩니다. 따라서 .NET Framework를 업데이트하는 경우 해당 어셈블리가 다시 컴파일되므로 .NET Framework 어셈블리의 MVID가 다릅니다. 또한 고유한 어셈블리를 업데이트하면 어셈블리가 다시 컴파일됩니다. 따라서 어셈블리에도 다른 MVID가 있습니다.

사용자 작업

작업 1

설명 섹션의 시나리오 1을 해결하려면 SQL Server에서 .NET Framework 어셈블리를 수동으로 업데이트해야 합니다. 이렇게 하려면 ALTER ASSEMBLY 문을 사용하여 다음 폴더에 있는 .NET Framework 어셈블리의 새 버전을 가리킵니다.

%Windir%\Microsoft.NET\Framework\Version

참고 항목

버전은 설치하거나 업데이트한 .NET Framework의 버전을 나타냅니다.

작업 2

설명 섹션에서 시나리오 2를 해결하려면 문을 사용하여 ALTER ASSEMBLY 데이터베이스의 어셈블리를 업데이트합니다.

이렇게 해도 문제가 지속되면 데이터베이스에서 어셈블리를 삭제한 다음 데이터베이스에 새 버전의 어셈블리를 등록합니다.

추가 정보

SQL Server CLR 호스팅 환경에서 테스트되지 않은 .NET Framework 어셈블리에 대한 지원 정책에 문서화되지 않은 .NET Framework 어셈블리를 사용하지 않는 것이 좋습니다. SQL Server CLR 호스팅 환경에서 테스트되는 어셈블리를 나열합니다.

CLR 루틴에 대한 설명

CLR 루틴에는 .NET Framework CLR과 SQL Server 통합을 사용하여 구현되는 다음 개체가 포함됩니다.

  • 스칼라 반환 사용자 정의 함수(스칼라 UDF)
  • 테이블 반환 TVF(사용자 정의 함수)
  • UDP(사용자 정의 프로시저)
  • 사용자 정의 트리거
  • 사용자 정의 데이터 형식
  • 사용자 정의 집계

.NET Framework 3.5를 설치한 후 업데이트할 어셈블리

.NET Framework 3.5를 설치한 후 ALTER ASSEMBLY 문을 사용하여 다음 어셈블리를 업데이트해야 합니다.

  • Accessibility.dll
  • AspNetMMCExt.dll
  • Cscompmgd.dll
  • IEExecRemote.dll
  • IEHost.dll
  • IIEHost.dll
  • Microsoft.Build.Conversion.dll
  • Microsoft.Build.Engine.dll
  • Microsoft.Build.Framework.dll
  • Microsoft.Build.Tasks.dll
  • Microsoft.Build.Utilities.dll
  • Microsoft.CompactFramework.Build.Tasks.dll
  • Microsoft.JScript.dll
  • Microsoft.VisualBasic.Vsa.dll
  • Microsoft.Vsa.dll
  • Microsoft.Vsa.Vb.CodeDOMProcessor.dll
  • Microsoft_VsaVb.dll
  • Sysglobl.dll
  • System.Configuration.Install.dll
  • System.Design.dll
  • System.DirectoryServices.dll
  • System.DirectoryServices.Protocols.dll
  • System.Drawing.dll
  • System.Drawing.Design.dll
  • System.EnterpriseServices.dll
  • System.Management.dll
  • System.Messaging.dll
  • System.Runtime.Serialization.Formatters.Soap.dll
  • System.ServiceProcess.dll
  • System.Web.dll
  • System.Web.Mobile.dll
  • System.Web.RegularExpressions.dll

이러한 어셈블리는 다음 폴더에 있습니다.

%Windir%\Microsoft.NET\Framework\v2.0.50727

어셈블리를 삭제한 후 사용자 정의 데이터 형식에서 데이터를 유지하는 방법

SQL Server에서 사용자 정의 데이터 형식이 사용하는 어셈블리를 삭제하는 경우 다음 방법 중 하나를 사용하여 데이터를 유지할 수 있습니다.

시나리오는 다음과 같다고 가정합니다.

  • 이름이 MyAssembly.dll어셈블리를 만듭니다.
  • MyAssembly 어셈블리는 어셈블리를 System.DirectoryServices.dll 참조합니다.
  • 이름이 MyDateTime인 사용자 정의 데이터 형식이 있습니다.
  • MyDateTime 데이터 형식은 MyAssembly.dll 어셈블리를 사용합니다.
  • 이름이 MyTable테이블을 만듭니다.
  • MyTable 테이블에는 MyDateTime 데이터 형식의 데이터가 포함됩니다.

방법 1: bcp.exe 유틸리티 사용

  1. Bcp.exe 유틸리티를 -n 스위치와 함께 사용하여 MyTable 테이블에서 파일로 데이터를 복사합니다. 예를 들어 명령 프롬프트에서 다음 명령을 실행합니다.

    bcp MyDatabase.dbo.MyTable out C:\MyFile.bcp -n -SSQLServerName -T
    
  2. SQL Server Management Studio에서 다음 단계를 수행합니다.

    1. MyTable 테이블을 삭제합니다.
    2. MyDateTime 데이터 형식을 삭제합니다.
    3. System.DirectoryServices.dll 어셈블리를 삭제합니다.
    4. MyAssembly 어셈블리를 삭제합니다.
  3. SQL Server Management Studio에서 다음 단계를 수행합니다.

    1. 어셈블리를 등록합니다 System.DirectoryServices.dll .
    2. MyAssembly 어셈블리를 등록합니다.
    3. MyDateTime 데이터 형식을 만듭니다.
    4. MyTable 테이블과 테이블 구조가 동일한 새 테이블을 만듭니다.
  4. Bcp.exe 유틸리티를 -n 스위치와 함께 사용하여 파일의 데이터를 MyTable 테이블로 가져옵니다. 예를 들어 명령 프롬프트에서 다음 명령을 실행합니다.

    bcp MyDatabase.dbo.MyTable in C:\MyFile.bcp -n -SSQLServerName -T
    

방법 2: INSERT 사용 ... SELECT 문

MyDateTime 데이터 형식이 스토리지에서 9바이트를 차지한다고 가정합니다.

  1. SQL Server Management Studio에서 다음 문을 실행하여 데이터 형식의 열이 VARBINARY(9) 포함된 새 테이블을 만듭니다.

    CREATE TABLE TempTable (c1 VARBINARY(9));
    
  2. 다음 INSERT를 실행합니다. TempTable 테이블을 채우는 SELECT 문:

    INSERT INTO TempTable SELECT CAST(c1 as VARBINARY(9)) FROM MyTable;
    
  3. SQL Server Management Studio에서 다음 단계를 수행합니다.

    1. MyTable 테이블을 삭제합니다.
    2. MyDateTime 데이터 형식을 삭제합니다.
    3. System.DirectoryServices.dll 어셈블리를 삭제합니다.
    4. MyAssembly 어셈블리를 삭제합니다.
  4. SQL Server Management Studio에서 다음 단계를 수행합니다.

    1. System.DirectoryServices.dll 어셈블리를 등록합니다.
    2. MyAssembly 어셈블리를 등록합니다.
    3. MyDateTime 데이터 형식을 만듭니다.
    4. MyTable 테이블과 테이블 구조가 동일한 새 테이블을 만듭니다.
  5. 다음 INSERT를 실행합니다. MyTable 테이블을 채우는 SELECT 문:

    INSERT INTO MyTable SELECT c1 FROM TempTable;
    

참조

  • 어셈블리 버전에 대한 자세한 내용은 Visual Studio 2005 사용 중지 설명서를 참조 하세요.
  • 어셈블리를 업데이트하는 방법에 대한 자세한 내용은 ALTER ASSEMBLY(Transact-SQL)를 참조하세요.
  • 어셈블리를 삭제하는 방법에 대한 자세한 내용은 DROP ASSEMBLY(Transact-SQL)를 참조하세요.
  • SQL Server 데이터베이스에 어셈블리를 등록하는 방법에 대한 자세한 내용은 CREATE ASSEMBLY(Transact-SQL)를 참조하세요.
  • Bcp.exe 유틸리티에 대한 자세한 내용은 다음을 참조하세요 https://msdn2.microsoft.com/library/ms162802.aspx.