Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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 2008 r2 SQL Server:如何使用不同的排序规则调用相同的UDF_Sql Server 2008 R2_User Defined Functions_Collation - Fatal编程技术网

Sql server 2008 r2 SQL Server:如何使用不同的排序规则调用相同的UDF

Sql server 2008 r2 SQL Server:如何使用不同的排序规则调用相同的UDF,sql-server-2008-r2,user-defined-functions,collation,Sql Server 2008 R2,User Defined Functions,Collation,我正在SQLServer2008R2中编写一个用户定义函数(UDF)。我希望UDF对不同的调用使用不同的排序规则。这可能吗?是否可以根据用户输入动态更改排序规则 从Intellisense(我在网上几乎找不到)来看,排序规则似乎必须在实际的T-SQL代码中指定,不能作为变量或输入参数应用。有没有办法解决这个问题,特别是可以在UDF中工作的方法 编辑:根据要求,这里是我正在使用的UDF。我的目的是在使用和不使用“xxxx敏感”设置的情况下调用它,以便根据“相关性”对查询结果进行排序 /* Leve

我正在SQLServer2008R2中编写一个用户定义函数(UDF)。我希望UDF对不同的调用使用不同的排序规则。这可能吗?是否可以根据用户输入动态更改排序规则

从Intellisense(我在网上几乎找不到)来看,排序规则似乎必须在实际的T-SQL代码中指定,不能作为变量或输入参数应用。有没有办法解决这个问题,特别是可以在UDF中工作的方法

编辑:根据要求,这里是我正在使用的UDF。我的目的是在使用和不使用“xxxx敏感”设置的情况下调用它,以便根据“相关性”对查询结果进行排序

/*
Levenshtein编辑距离的T-SQL实现。
*/
创建函数[dbo]。[LevenshteinDistanceSQL](
@textA varchar(最大值)
,@textB varchar(最大值)
)
返回整数
作为
开始
声明
@A长度整数
,@bLength int
,@prevSize int
,@currentSize int
,@previousDistances varbinary(最大值)
,@currentDistances变量二进制(最大值)
,@result int
设置@aLength=LEN(@textA)
设置@bLength=LEN(@textB)
设置@result=NULL
--退化病例
--要调用例程指定此比较的排序规则吗
如果(@textA=@textB)设置@result=0;
如果(@aLength=0)设置@result=@bLength;
如果(@bLength=0)设置@result=@aLength;
如果(@result为空)
开始
--将表格大小设置为最大输入文本的长度加1
当@aLength>@bLength时设置@prevSize=CASE,然后设置@aLength ELSE@bLength END+1;
当@aLength>@bLength时设置@currentSize=CASE,然后设置@aLength ELSE@bLength END+1;
--初始化以前的距离
声明
@i int
,@j int
,@cost int
,@curDistLastCost int
,@prevDistcurInt
,@prevDistLastCost int
,@charA char(1)
,@charB char(1)
设置@i=0
设置@previousDistances=0x--空varbinary
而(@i<@prevSize)
开始
设置@previousDistances=@previousDistances+转换(二进制(4),@i)
设置@i=@i+1;
终点
--进程@textA
设置@i=0
而(@i<@aLength)
开始
设置@currentDistances=CONVERT(二进制(4),@i+1);
--进程@textB
设置@j=0
而(@j<@bLength)
开始
设置@charA=SUBSTRING(@textA,@i+1,1)
设置@charB=SUBSTRING(@textB,@j+1,1)
--要调用例程指定此比较的排序规则吗
当@charA=@charB时,设置@cost=CASE,然后0,否则1结束;
设置@curDistLastCost=CONVERT(int,子字符串(@currentdestances,@j*4+1,4))
设置@prevDistCurCost=CONVERT(int,子字符串(@previousDistances,(@j+1)*4+1,4))
设置@prevDistLastCost=CONVERT(int,子字符串(@previousdistance,@j*4+1,4))
设置@currentDistances=@currentDistances+转换(二进制(4),大小写
当@curDistLastCost<@prevDistCurCost和@curDistLastCost<@prevDistLastCost时,则@curDistLastCost+1
当@prevDistCurCost<@CurdDistLastCost和@prevDistCurCost<@prevDistLastCost时,则@prevDistCurCost+1
ELSE@PrevDistrastCost+@cost
(完)
设置@j=@j+1
终点
--将当前距离复制到上一个距离,以便下一次迭代
设置@previousDistances=@currentDistances
设置@i=@i+1;
终点
设置@result=CONVERT(int,子字符串(@currentDistances,@bLength*4+1,4))
终点
返回@result
终点
这样称呼:

declare@text varchar(50)
set@text='c'
选择
*
从…起
作为一名律师的技能
哪里
s、 名称类似“%”++@text++“%”
订购人
dbo.levenshteindication(@text,s.Name)——校对拉丁文1\u General\u 100\u CI\u AI
,dbo.levenshteindication(@text,s.Name)--校对拉丁文1_General_100_CS_AS_KS_WS
,s.姓名

能够指定排序规则将允许我对结果顶部的最短编辑距离(不敏感)进行排序;在不敏感的编辑距离内,大小写、重音等匹配项将位于顶部。

有两种方法可以实现这一点,并且都需要SQLCLR。如您所见,T-SQL不允许动态指定排序规则,但在.Net中可以:)。事实上,为此目的使用SQLCLR还有两个额外的好处:

  • 您可以对进行比较的选项进行更精细的控制。看看枚举。例如,它有一个用于
    IgnoreSymbols
    的选项:

    指示字符串比较必须忽略符号,例如空格字符、标点符号、货币符号、百分号、数学符号、符号等

  • SQLCLR UDF可以允许并行执行计划,而T-SQL UDF总是不允许并行计划。为了允许并行计划,SQLCLR UDF需要是确定性的,并且标记为
    IsDeterministic=true
    ,并且不进行任何数据访问(无需显式标记,因为这是默认设置)

  • 也就是说,这里有一些附加说明:

    • 我所看到的Levenshtein距离算法的所有实现都假定顺序比较(即任何
      *\u BIN
      排序规则)。但我认为,对于你正在努力实现的目标来说,这可能会很有趣:)

    • 考虑到您试图完成的任务,在采用SQLCLR方法时,实际上不需要传递任何排序规则信息。原因是每种特定语言(即排序规则)都控制着相等和排序的比较选项。