어셈블리 'system.web, 버전 = 4.0.0.0, culture = 중립, publickeytoken = b03f5f7f11d50a3a.' SQL 카탈로그에서 찾을 수 없습니다


9

System.Web의 HTTPUtility.UrlDecode 메서드를 사용하여 SQL CLR 함수를 배포하려고하는데 배포 할 수 없습니다. 수신 된 오류 :

.Net SqlClient 데이터 공급자 : 메시지 6503, 수준 16, 상태 12, 줄 1 어셈블리 'system.web, version = 4.0.0.0, culture = neutral, publickeytoken = b03f5f7f11d50a3a.' SQL 카탈로그에서 찾을 수 없습니다.

기능 (SSDT 프로젝트의 일부) :

using System;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true)]
    public static SqlString udf_UrlDecode(SqlString encodedXML)
    {
        string decodedXML;

        decodedXML = HttpUtility.UrlDecode(encodedXML.ToString());

        return new SqlString(decodedXML);
    }
}

스레드 와 관련이 있습니다. VS2012 SSDT 및 데이터베이스 프로젝트가있는 SQL Server 2014입니다. 3, 3.5, 4 및 4.5와 같은 다른 대상 프레임 워크를 사용해 보았습니다.

또한 System.Web을 사용하여 CREATE ASSEMBLY를 시도했지만 실패 할 때까지 Microsoft.Build, System.Xaml과 같은 다른 어셈블리를 추가해야합니다. System.Web이 지원되는 라이브러리 목록에 없으므로 아이디어가 있습니까?

답변:


9

Uri.UnescapeDataString (in System)을 사용할 수 있습니다 .이 경우 Replace('+', ' ')문자열 을에 전달 하기 전에 문자열 을 수행해야 Uri.UnescapeDataString하거나 귀찮게하지 않으려면이 버전의 SQL # 무료 버전에서이 함수를 사용할 수 있습니다 . (저는 저자입니다).

가져 오기 System.Web는 아마도 가치보다 많은 작업 일 것입니다. 실제로 위험 할 수 있습니다. System.Web질문에서 링크 한 "지원되는 라이브러리"목록에없는 적절한 이유가 있습니다. 작동하지 않을 수도 있습니다! 특히 미국 이외의 ASCII 문자 집합을 처리 할 때 예상대로 작동하지 않는 상황이 발생할 수 있으며 Microsoft는이를 수정하지 않습니다. 당신이하지 않는 그래서, 절대적으로 해야합니다, 당신은 지원되지 않는 DLL을 추가하는 방법에 대한주의해야합니다. "지원되는"목록의 DLL은 SQL Server 데이터 정렬 및 Windows에서 실행되는 표준 CLR과 SQL Server 내부에서 실행되는 CLR간에 다른 환경 문제에 대해 작동하도록 완전히 테스트되고 검증되었습니다.

지원되지 않는 .NET Framework 라이브러리 통합과 관련된 몇 가지 함정에 관한 Microsoft의 추가 리소스는 다음과 같습니다.


코드에 대한 몇 가지 참고 사항 :

  1. 매개 변수, 입력 또는 출력에 .NET 유형을 사용하지 마십시오. 따라서, 변화 string encodedXMLSqlString encodedXML.
  2. 이 기능은 결정적이므로 표시해야합니다. 그렇지 않으면 성능이 저하 될 수 있습니다. 추가 IsDeterministic = true받는 SqlFunction속성.

8

언급했듯이 System.Web지원되지 않는 라이브러리입니다. 참조 System.Web하려면로 전화를 걸어야합니다 CREATE ASSEMBLY. 시도한 것처럼 보이지만 어떻게 위치를 참조 했 System.Web.dll습니까? 다른 위치에 복사 / 붙여 넣었습니까? SQL Server는 동일한 위치에서 종속 어셈블리를 찾으려고합니다. 즉, System.Web.dll동일한 디렉토리에있는 다른 모든 종속 라이브러리 의 위치를 ​​참조하면 제대로 작동합니다. 다음은 실제 예입니다. System.Web어셈블리와 어셈블리를 모두 추가 할 수있었습니다 .

create assembly [System.Web]
from 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Web.dll'
with permission_set = unsafe;
go

create assembly SystemWebTest
from 'c:\SqlServer\SystemWebTest.dll'
with permission_set = safe;
go

클라이언트 메시지에서 SQL Server가로드하는 다른 모든 어셈블리를 볼 수 있습니다. 그러나 SQL Server는 이들 각각에 대해 다음과 같은 경고를 표시합니다.

등록한 SQL Server 호스팅 환경에서 완전히 테스트되지 않았으며 지원되지 않습니다. 나중에이 어셈블리 나 .NET Framework를 업그레이드하거나 서비스하면 CLR 통합 루틴이 작동하지 않을 수 있습니다. 자세한 내용은 SQL Server 온라인 설명서를 참조하십시오.

마찬가지로을 추가 System.Web하면 다음과 같은 어셈블리가 추가됩니다.

select
    name,
    permission_set_desc,
    is_visible
from sys.assemblies
where is_user_defined = 1
order by is_visible desc;

name                                            permission_set_desc is_visible
System.Web                                      UNSAFE_ACCESS       1
SystemWebTest                                   SAFE_ACCESS         1
Microsoft.Build.Framework                       UNSAFE_ACCESS       0
System.Xaml                                     UNSAFE_ACCESS       0
System.ComponentModel.DataAnnotations           UNSAFE_ACCESS       0
System.Runtime.Caching                          UNSAFE_ACCESS       0
System.Web.ApplicationServices                  UNSAFE_ACCESS       0
System.Drawing                                  UNSAFE_ACCESS       0
Microsoft.Build.Utilities.v4.0                  UNSAFE_ACCESS       0
System.DirectoryServices                        UNSAFE_ACCESS       0
System.DirectoryServices.Protocols              UNSAFE_ACCESS       0
System.EnterpriseServices                       UNSAFE_ACCESS       0
System.Runtime.Remoting                         UNSAFE_ACCESS       0
System.Runtime.Serialization.Formatters.Soap    UNSAFE_ACCESS       0
System.Design                                   UNSAFE_ACCESS       0
System.Windows.Forms                            UNSAFE_ACCESS       0
Accessibility                                   UNSAFE_ACCESS       0
System.Drawing.Design                           UNSAFE_ACCESS       0
System.Web.RegularExpressions                   UNSAFE_ACCESS       0
Microsoft.Build.Tasks.v4.0                      UNSAFE_ACCESS       0
System.ServiceProcess                           UNSAFE_ACCESS       0
System.Configuration.Install                    UNSAFE_ACCESS       0
System.Runtime.Serialization                    UNSAFE_ACCESS       0
System.ServiceModel.Internals                   UNSAFE_ACCESS       0
SMDiagnostics                                   UNSAFE_ACCESS       0

여기서 실제로 일어나는 일을 염두에 두어야 할 가치가 있으며 다른 추가 어셈블리에는 T-SQL 진입 점을위한 방법이 없지만 이제는 종속성입니다. 나는 당신이 정말로 참조 할 필요가System.Web 있는지 또는 당신이 원하는 것을 성취 할 수있는 다른 길이 있는지 알아보기 위해 옵션을 평가할 것 입니다.


1
고마워 토마스. GUI를 통해 스크립트 된 System.Web.dll을 가리키는 CREATE ASSEMBLY를 시도했습니다. 나는 이것을 이전에 링크 된 뉴스 그룹 게시물에 대한 답변으로 실험하고 있었으므로 직접 사용하려는 욕구가 없습니다.
wBob

1
@wBob : 반드시 필요한 경우가 아니면 지원되지 않는 DLL을 추가하는 데주의해야합니다. System.Web링크 된 "지원되는 라이브러리"목록에없는 적절한 이유가 있습니다. 작동하지 않을 수도 있습니다! . 특히 미국 이외의 ASCII 문자 집합을 처리 할 때 예상대로 작동하지 않는 상황이 발생할 수 있으며 Microsoft는이를 수정하지 않습니다. 나는 모르는 사람들을 위해 명확하게 대답 할 것입니다.
Solomon Rutzky

@srutzky 동의합니다.
wBob

1
당신은 생명의 은인입니다. 이 라이브러리를 가져올 수 없으면 SOL이 될 것입니다. (이것은 매우 드문 경우 중 하나입니다.)
devinbost

5

이 답변을 확인하십시오 . 당신은 사용할 필요가 없습니다 Uri.UnescapeDataStringSystem.Web. WebUtility내부 System.Net함수 HtmlEncode와로 불리는 클래스가 있습니다 HtmlDecode.


WebUtilitySQL Server 2012, 2014 이상을 사용하는 사용자 만 사용할 수 있음을 지적해야합니다 . 아직도 SQL Server 2005, 2008 및 2008 R2에있는 사용자는 .NET Framework 4.0에 도입되어이 기능을 사용할 수 없습니다.
Solomon Rutzky

@srutzky 2014 년에 대한 질문이지만 사용자에게이 제한에 대해 알리는 것이 중요합니다. .NET Framework 버전과 SQL Server 버전 간의 관계를 보여주는 게시 가능한 링크가 있습니까?
skeletank 2019

: 내 문서는 이제 SQL Server 버전과 SQLCLR (프레임 워크 및 CLR 버전 포함) 기능 사이의 관계를 보여주는 차트가 존재 오늘 발표 된 (SQL 서버 내에서 사용하여 .NET) 개발 : 계단 SQLCLR 레벨 5를 (무료 등록이 필요합니다 ).
Solomon Rutzky
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.