ชุดประกอบ 'system.web รุ่น = 4.0.0.0, วัฒนธรรม = เป็นกลาง, publickeytoken = b03f5f7f11d50a3a' ไม่พบในแคตตาล็อก SQL


9

ฉันพยายามปรับใช้ฟังก์ชัน SQL CLR โดยใช้วิธี HTTPUtility.UrlDecode ของ System.Web แต่ฉันไม่สามารถปรับใช้ ได้รับข้อผิดพลาด:

ผู้ให้บริการข้อมูล Net SqlClient: ข่าวสารเกี่ยวกับ 6503 ระดับ 16 สถานะ 12 แอสเซมบลีบรรทัดที่ 1 'system.web รุ่น = 4.0.0.0 วัฒนธรรม = เป็นกลาง 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);
    }
}

มันเกี่ยวกับหัวข้อนี้ ฉันเป็น SQL Server 2014 กับ VS2012 SSDT และโครงการฐานข้อมูล ได้ลองกับ Target Frameworks อื่น ๆ เช่น 3, 3.5, 4 และ 4.5

ฉันได้ลองสร้าง CREATE ASSEMBLY ด้วย System.Web แต่ต้องเพิ่มชุดประกอบอื่น ๆ เช่น Microsoft.Build, System.Xaml จนกว่าพวกเขาจะล้มเหลว ฉันเห็นว่า System.Web ไม่ได้อยู่ในรายการไลบรารีที่สนับสนุนดังนั้นแนวคิดใด ๆ

คำตอบ:


9

คุณสามารถใช้Uri.UnescapeDataString (ในSystem) ซึ่งในกรณีนี้คุณจะต้องทำReplace('+', ' ')บนสตริงก่อนที่จะส่งไปยังUri.UnescapeDataStringหรือถ้าคุณไม่อยากรบกวนมันฟังก์ชั่นนี้มีอยู่ในSQL #เวอร์ชั่นฟรี(ซึ่งฉันเป็นผู้เขียน)

การนำเข้าSystem.Webอาจทำงานได้มากกว่าที่คุ้มค่า และในความเป็นจริงมันอาจมีความเสี่ยง มีเหตุผลที่ดีที่System.Webไม่อยู่ในรายการ "ไลบรารีที่สนับสนุน" ที่คุณเชื่อมโยงกับคำถาม: ไม่รับประกันว่าจะทำงานได้! คุณอาจพบสถานการณ์โดยเฉพาะอย่างยิ่งเมื่อต้องรับมือกับชุดอักขระ ASCII ที่ไม่ใช่ของสหรัฐซึ่งไม่ทำงานตามที่คาดไว้และ Microsoft จะไม่แก้ไข ดังนั้นถ้าคุณอย่างต้อง, คุณควรจะระมัดระวังเกี่ยวกับการเพิ่มกำลังที่ไม่ได้รับการสนับสนุน DLLs ในรายการ "สนับสนุน" ได้รับการทดสอบและตรวจสอบอย่างสมบูรณ์เพื่อทำงานกับการเปรียบเทียบของ SQL Server และปัญหาสิ่งแวดล้อมอื่น ๆ ที่แตกต่างกันระหว่าง CLR มาตรฐานที่ใช้ใน Windows และ CLR ที่ทำงานอยู่ภายใน SQL Server

นี่คือทรัพยากรเพิ่มเติมจาก Microsoft เกี่ยวกับข้อผิดพลาดหลายประการในการรวมไลบรารี. NET Framework ที่ไม่สนับสนุน:


หมายเหตุเกี่ยวกับรหัสของคุณ:

  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 Books Online สำหรับรายละเอียดเพิ่มเติม

ในทำนองเดียวกัน แต่เพิ่ม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
ขอบคุณโทมัสที่ได้ผล ฉันพยายาม CREATE ASSEMBLY ชี้ไปที่ System.Web.dll scripted ผ่าน GUI ฉันกำลังทดลองกับสิ่งนี้เป็นคำตอบของโพสต์กลุ่มข่าวสาร (เชื่อมโยงก่อนหน้านี้) ดังนั้นจึงไม่มีความปรารถนาที่จะใช้มันด้วยตัวเอง
wBob

1
@wBob: หากคุณไม่จำเป็นต้องทำอย่างนั้นคุณควรระมัดระวังเกี่ยวกับการเพิ่ม DLLs ที่ไม่รองรับ มีเหตุผลที่ดีที่System.Webไม่อยู่ในรายการ "ไลบรารีที่สนับสนุน" ที่คุณเชื่อมโยง: ไม่รับประกันว่าจะทำงานได้! . คุณอาจพบสถานการณ์โดยเฉพาะอย่างยิ่งเมื่อต้องรับมือกับชุดอักขระ ASCII ที่ไม่ใช่ของสหรัฐซึ่งไม่ทำงานตามที่คาดไว้และ Microsoft จะไม่แก้ไข ฉันจะเพิ่มบันทึกเกี่ยวกับสิ่งนี้ในคำตอบของฉันเพื่อให้ชัดเจนสำหรับผู้ที่อาจไม่ทราบ
โซโลมอน Rutzky

@srutzky ฉันเห็นด้วย
wBob

1
คุณเป็นผู้ช่วยชีวิต ฉันจะเป็น SOL ถ้าฉันไม่สามารถนำเข้าห้องสมุดนี้ (มันเป็นหนึ่งในกรณีที่หายากมากเหล่านั้น.)
devinbost

5

ลองดูคำตอบนี้ คุณไม่จำเป็นต้องใช้หรือUri.UnescapeDataString System.Webมีระดับที่เรียกว่าเป็นWebUtilityภายในSystem.Netที่มีฟังก์ชั่นและHtmlEncodeHtmlDecode


คุณควรชี้ให้เห็นว่าWebUtilityมีให้เฉพาะผู้ที่ใช้ SQL Server 2012, 2014 หรือใหม่กว่า ผู้ที่ยังอยู่ใน SQL Server 2005, 2008 และ 2008 R2 จะไม่สามารถใช้สิ่งนี้ได้เนื่องจากมีการเปิดตัวใน. NET Framework 4.0
โซโลมอน Rutzky

@srutzky คำถามสำหรับปี 2014 แต่เป็นสิ่งสำคัญที่จะต้องให้ผู้ใช้ทราบเกี่ยวกับข้อ จำกัด นี้ คุณมีลิงค์ที่ฉันสามารถโพสต์ที่แสดงความสัมพันธ์ระหว่าง. NET Framework และ SQL Server เวอร์ชั่นได้หรือไม่
skeletank

บทความของฉันได้รับการเผยแพร่ในวันนี้ดังนั้นตอนนี้ไม่มีแผนภูมิแสดงความสัมพันธ์ระหว่างรุ่นของ SQL Server และคุณสมบัติ SQLCLR (รวมถึงรุ่น Framework และ CLR): Stairway to SQLCLR ระดับ 5: การพัฒนา (ใช้. NET ภายใน SQL Server) (ต้องลงทะเบียนฟรี )
โซโลมอน Rutzky
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.