在CLR存储过程中进行HttpWebRequest时(根据下面的代码),在(重新)启动Sql Server之后或在给定(但不确定)的时间段之后的第一次调用等待相当长的时间. GetResponse()方法调用.
有没有办法解决这个问题,不涉及"黑客",如每隔几分钟运行一次Sql Server Agent作业,以确保代理进行第一次"慢速"调用,而不是"真正的"生产码?
function SqlString MakeWebRequest(string address, string parameters, int connectTO)
{
SqlString returnData;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(String.Concat(address.ToString(), "?", parameters.ToString()));
request.Timeout = (int)connectTO;
request.Method = "GET";
using (WebResponse response = request.GetResponse())
{
using (Stream responseStream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(responseStream))
{
SqlString responseFromServer = reader.ReadToEnd();
returnData = responseFromServer;
}
}
}
response.Close();
return returnData;
}
Run Code Online (Sandbox Code Playgroud)
(为简洁起见,已删除错误处理和其他非关键代码)
另请参见此Sql Server论坛主题.
我有一个非常简单的CLR函数来进行正则表达式匹配
public static SqlBoolean RegExMatch(SqlString input, SqlString pattern)
{
if (input.IsNull || pattern.IsNull)
return SqlBoolean.False;
return Regex.IsMatch(input.Value, pattern.Value, RegexOptions.IgnoreCase);
}
Run Code Online (Sandbox Code Playgroud)
它允许我编写一个SQL语句.
SELECT * FROM dbo.table1 WHERE dbo.RegexMatch(column1, '[0-9][A-Z]') = 1
-- match entries in col1 like 1A, 2B etc...
Run Code Online (Sandbox Code Playgroud)
我只是认为重新构造该查询会很好,所以可以调用它
SELECT * FROM dbo.table1 WHERE column1 REGEXLIKE '[0-9][A-Z]'
Run Code Online (Sandbox Code Playgroud)
是否可以使用CLR代码创建新的比较运算符.(我猜测从我在网上看到的答案是否定的,但没有任何伤害)
运行此命令:
CREATE ASSEMBLY
[System.Web] from
'C:\Windows\Microsoft.NET\Framework\v2.0.50727\system.web.dll'
with permission_set = UNSAFE
Run Code Online (Sandbox Code Playgroud)
给我这个错误:
消息10300,级别16,状态2,第1行
程序集"System.Web"引用程序集"system.web,version = 2.0.0.0,culture = neutral,publickeytoken = b03f5f7f11d50a3a.",它在当前数据库中不存在.SQL Server尝试从引用程序集来自的相同位置定位并自动加载引用的程序集,但该操作失败(原因:版本,区域性或公钥不匹配).请将引用的程序集加载到当前数据库中,然后重试您的请求.
......这听起来有点傻.看起来SQL Server认为System.Web程序集正在引用它自己.我怎样才能解决这个问题?
我正在使用CLR表值函数来SELECT并返回使用许多变量的复杂数据库搜索的结果.
文档显示您以类似于此的方式构建此类函数:
public partial class UserDefinedFunctions
{
private class ResultRow
// This class holds a row which we want to return.
{
public SqlInt32 CustId;
public SqlString Name;
public ResultRow(SqlInt32 custId_, SqlString name_)
{
CustId = custId_;
Name = name_;
}
}
[SqlFunction(
DataAccess = DataAccessKind.Read,
FillRowMethodName = "Test_FillRow",
TableDefinition = "CustId int" +
"Name nvarchar(50)")]
public static IEnumerable Test()
// This function contains the actual logic.
{
ArrayList results = new ArrayList();
using (SqlConnection connection = new …Run Code Online (Sandbox Code Playgroud) 我们的许多DAL代码都使用TransactionScope进行交易.这很好用但是当我在SQLCLR程序中使用这个DAL代码时会出现问题.交易升级到MSDTC我不想要的.
问题可以轻松复制:
CLR实施
[SqlProcedure]
public static void ClrWithScope(string cmdText)
{
/* escalates to MSDTC when a transaction is already open */
using ( var scope = new TransactionScope())
{
using (var connection = new SqlConnection("context connection=true;"))
{
connection.Open();
using (var cmd = new SqlCommand(cmdText, connection))
{
SqlContext.Pipe.ExecuteAndSend(cmd);
}
}
scope.Complete();
}
}
[SqlProcedure]
public static void ClrWithTrans(string cmdText)
{
/* works as expected (without MSDTC escalation ) */
using (var connection = new SqlConnection("context connection=true;"))
{
connection.Open();
using (var tx …Run Code Online (Sandbox Code Playgroud)我有一项任务是从二进制文字0x0上的数据库表中拆分多行varbinary(8000)列.但是,这可能会改变,所以我想保留这个变量.我想使用SQLCLR作为流表值函数快速执行此操作.我知道我的字符串总是至少有几千字节.
编辑:我已经更新了我的算法.为了避免内环展开的肮脏.但很难说服CLR对寄存器分配做出正确的选择.如果有一个简单的方法来说服CLR j和我真的是同一件事,那将是非常棒的.但相反,它确实是愚蠢的事情.优化第一个路径循环会很不错.但你不能使用goto进入循环.
我决定改编C函数memchr的64位实现.基本上不是一次扫描一个字节并进行比较,而是使用一些比特来一次扫描8个字节.作为参考,Array.IndexOf<Byte>对于一个答案执行与4字节扫描类似的操作,我只想继续这样做.有几点需要注意:
内存压力是SQLCLR功能中的一个非常现实的问题.String.Split因为它预先分配了很多我真正想避免的内存.它也适用于UCS-2字符串,这需要我将我的ascii字符串转换为unicode字符串,因此在返回时将我的数据视为lob数据类型.(SqlChars/ SqlString在转换为lob类型之前只能返回4000个字节).
我想流.避免String.Split它的另一个原因是同时完成其工作,造成大量内存压力.在具有大量分隔符的代码上,纯T-SQL方法将开始击败它.
我想保持它"安全".所以都管理好了.在安全检查中似乎有很大的惩罚.
Buffer.BlockCopy真的很快,而且比不断支付BitConverter的成本似乎更好地支付前一次成本.这仍然比将我的输入转换为字符串并保持该引用更便宜.
代码非常快,但似乎我在初始循环和关键部分支付了相当多的绑定检查,当我找到匹配时.作为具有大量分隔符的代码的结果,我倾向于输入一个更简单的C#枚举器,它只进行字节比较.
这是我的代码,
class SplitBytesEnumeratorA : IEnumerator
{
// Fields
private readonly byte[] _bytes;
private readonly ulong[] _longs;
private readonly ulong _comparer;
private readonly Record _record = new Record();
private int _start;
private readonly int _length;
// Methods
internal SplitBytesEnumeratorA(byte[] bytes, byte delimiter)
{
this._bytes = bytes;
this._length = bytes.Length;
// we do this so that we can avoid a spillover scan …Run Code Online (Sandbox Code Playgroud) 我有一个SQLCLR标量函数,它将把我需要根据需要粉碎的XmlReader传入一个内联结果集.这些XML对象是按需生成的,因此我无法使用XML索引.在结果数据集中有超过100列是常见的.考虑以下示例代码:
CREATE XML SCHEMA COLLECTION RAB AS '
<xsd:schema xmlns:schema="urn:schemas-microsoft-com:sql:SqlRowSet1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
<xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
<xsd:element name="r" type="r"/>
<xsd:complexType name="r">
<xsd:attribute name="a" type="sqltypes:int" use="required"/>
<xsd:attribute name="b" type="sqltypes:int" use="required"/>
<xsd:attribute name="c" type="sqltypes:int" use="required"/>
</xsd:complexType>
</xsd:schema>';
GO
DECLARE @D TABLE(x XML(DOCUMENT RAB) NOT NULL);
INSERT INTO @D
VALUES
('<r a="3" b="4" c="34"/>'),
('<r a="5" b="6" c="56"/>'),
('<r a="7" b="8" c="78"/>')
SELECT x.value('/r/@a', 'int') a, x.value('/r/@b', 'int') b, x.value('/r/@c', 'int') c
FROM @d a
Run Code Online (Sandbox Code Playgroud)
这将使用某些XML值填充表变量中的类型化XML列,并将属性分解为单独的列.对此的执行计划似乎过于混乱:
|--Compute Scalar(DEFINE:([Expr1009]=[Expr1008], [Expr1016]=[Expr1015], [Expr1023]=[Expr1022]))
|--Nested Loops(Inner …Run Code Online (Sandbox Code Playgroud) 我在我的SQL CLR项目中使用线程,当我尝试运行用户定义的函数时,我收到以下错误.如何在项目中启用并行库和await/async等线程化操作?
__PRE__
用户定义的类型(UDT)和用户定义的数据类型(UDDT)有什么区别?
t-sql sql-server sqlclr user-defined-types user-defined-data-types
我正在疯狂尝试在我的类库中使用Json序列化器/反序列化器并在SQL Server中导入我的程序集。
我正在使用响应Json字符串的WebAPI,并且我想创建调用该API并使用api结果的CLR Sql Procedure。
我尝试了两种方法来反序列化Json字符串:
1)System.Web.Script.Serialization
2)System.Runtime.Serialization.Json
第一个让我看到这个错误:
程序集'system.web.extensions,版本= 4.0.0.0,区域性=中性,publickeytoken = 31bf3856ad364e35。” 在SQL目录中找不到。(Microsoft SQL Server,错误:6503)
第二个:
程序集'system.runtime.serialization,版本= 4.0.0.0,文化=中性,publickeytoken = b77a5c561934e089。' 在SQL目录中找不到。(Microsoft SQL Server,错误:6503)
有什么方法可以解析我的类库中的json吗?(除了在类库中为我自己创建一个Json Serializer / Deserializer之外!)
Visual Studio 2015社区,Microsoft Sql Server 2016开发人员
先感谢您。