Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server F#类/模块中自动生成的静态字段阻止创建SQL CLR函数_Sql Server_F#_Static Members - Fatal编程技术网

Sql server F#类/模块中自动生成的静态字段阻止创建SQL CLR函数

Sql server F#类/模块中自动生成的静态字段阻止创建SQL CLR函数,sql-server,f#,static-members,Sql Server,F#,Static Members,我试图在F#中编写CLR用户定义函数,但CREATE ASSEMBLY给出错误: 创建程序集失败,因为安全程序集“MyNamespace.SqlServer.Text”中的类型“StringMetrics”具有静态字段“field1776@”。安全组件中静态字段的属性必须在VisualC中只读标记,在Visual Basic中只读,或者仅在Visual C++和中间语言中使用。 下面是它在反射器中的外观。这不是我明确创建的字段 [DebuggerBrowsable(DebuggerBrowsab

我试图在F#中编写CLR用户定义函数,但
CREATE ASSEMBLY
给出错误:

创建程序集失败,因为安全程序集“MyNamespace.SqlServer.Text”中的类型“StringMetrics”具有静态字段“field1776@”。安全组件中静态字段的属性必须在VisualC中只读标记,在Visual Basic中只读,或者仅在Visual C++和中间语言中使用。 下面是它在反射器中的外观。这不是我明确创建的字段

[DebuggerBrowsable(DebuggerBrowsableState.Never)]
internal static <PrivateImplementationDetails$MyNamespace-SqlServer-Text>.T1775_18Bytes@ field1776@; // data size: 18 bytes
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
内部静态.t177518bytes@field1776@;//数据大小:18字节
我试过使用一个模块和一个类。两者都在不同的位置生成字段。这个场地是干什么的?有没有办法避免它的产生?我是否应该使用另一种方法在F#中创建CLR函数?有可能吗

完整代码
namespace MyNamespace.SqlServer.Text
模块StringMetrics=
开放系统
open System.Collections.Generic
开放系统.数据
open System.Data.SqlTypes
[]
let fuzzyMatch(strA:SqlString)(strB:SqlString)=
如果strA.IsNull | | strB.IsNull,则SqlInt32.Zero
其他的
让comparer=StringComparer.OrdinalIgnoreCase
让WordBounders=[|'''.'\t'.'\n'.'\r'.',';':';';';'(';'))'|]
设stringEquals a b=comparer.Equals(a,b)
让isSubstring(search:string)(find:string)=find.Length>=search.Length/2&&search.IndexOf(find,StringComparison.OrdinalIgnoreCase)>=0
let split(str:string)=str.split(字边界)
让分数(strA:string)(strB:string)=
如果STRING等于strA strB,则strA.Length*3
其他的
设lenA,lenB=strA.Length,strB.Length
如果strA |>发布strB strB,则lenA*2
elif strB |>发布STRING strA然后lenB*2
其他0
设arrA,arrB=拆分的strA.Value,拆分的strB.Value
让dictA,dictB=Dictionary(),Dictionary()
arrA |>Seq.iteri(乐趣i a->
arrB |>Seq.iteri(乐趣j b->
把a分和b分配对
| 0 -> ()
|s->
将dictB.TryGetValue(j)与
|是的,(s',i')->/'
如果s>s'那么/'
添加(i,j)
dictB[j]
添加(i,j)
添加(j,(s,i)))
让matchScore=dictB |>Seq.sumBy(函数(KeyValue(,(s,))->s)
设非匹配=
阿拉
|>Seq.mapi(乐趣i a->i,a)
|>序号:折叠(有趣的s(i,a)->
如果dictA.ContainsKey(i)那么s
else s+a.Length)0
让wordsB=HashSet(dictB->arrB.[i]}中的seq{for(KeyValue(i,))),比较器)
设非匹配B=
arrB>Seq.fold(乐趣s b->
如果单词sb.加上(b),那么s+b.长度
(s)0
SqlInt32(匹配分数-非匹配A-非匹配B)

它似乎是由
wordbounders
数组生成的。如果将其表示为列表,并在运行时将其转换为数组,则不会生成此内部静态字段:

let wordBoundaries = Array.ofList [' '; '\t'; '\n'; '\r'; ','; ':'; ';'; '('; ')']
然而,函数本身似乎也被表示为静态的、非只读的 字段:


也许用类而不是模块可以解决这个问题。

我会用Reflector浏览代码,试图找到该字段的使用位置,然后追踪到F代码。@Mauricio:Reflector说它正被
fuzzyMatch
使用,但我找不到。@Daniel:fuzzyMatch本身,或者它里面的什么东西?@Mauricio:by
fuzzyMatch
itself因为CLR只是指“公共语言运行时”,并不意味着“SQL Server”,如果您提到这是专门关于兼容性的,那么您的问题可能会更清楚。现在它在
系统上失败了。LazyFailure
出于同样的原因。我认为这是没有希望的。谢谢您的帮助。@Daniel:您可以将SQL Server配置为接受不安全的程序集。@Mauricio:这不取决于我,但可能不取决于我。太糟糕了,我更愿意用F#来写它。@Daniel:找到了它,这证实了目前无法编写SQL Server安全的F#程序集:-(请注意,如果您能够接受不安全的程序集,它可以正常工作。
let wordBoundaries = Array.ofList [' '; '\t'; '\n'; '\r'; ','; ':'; ';'; '('; ')']
public static SqlInt32 fuzzyMatch(SqlString strA, SqlString strB);