标签: sqlclr

HttpWebRequest在SQLCLR中第一次运行缓慢

在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论坛主题.

sql-server-2005 sqlclr

5
推荐指数
1
解决办法
3579
查看次数

是否可以在SQL Server中使用CLR代码创建新的T-SQL运算符?

我有一个非常简单的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代码创建新的比较运算符.(我猜测从我在网上看到的答案是否定的,但没有任何伤害)

sql sql-server sqlclr sql-server-2008

5
推荐指数
1
解决办法
262
查看次数

为什么我不能在SQL Server 2008中注册System.Web?

运行此命令:

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程序集正在引用它自己.我怎样才能解决这个问题?

sql-server sqlclr

5
推荐指数
2
解决办法
4276
查看次数

DRY CLR表值函数

我正在使用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)

.net c# sql-server sqlclr user-defined-functions

5
推荐指数
1
解决办法
3370
查看次数

如何在SQLCLR中使用TransactionScope而不升级到MSDTC

我们的许多DAL代码都使用TransactionScope进行交易.这很好用但是当我在SQLCLR程序中使用这个DAL代码时会出现问题.交易升级到MSDTC我不想要的.

问题可以轻松复制:

  1. 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)

c# sqlclr sql-server-2008-r2

5
推荐指数
1
解决办法
1675
查看次数

如何消除此循环向量化的数组绑定检查?

我有一项任务是从二进制文字0x0上的数据库表中拆分多行varbinary(8000)列.但是,这可能会改变,所以我想保留这个变量.我想使用SQLCLR作为流表值函数快速执行此操作.我知道我的字符串总是至少有几千字节.

编辑:我已经更新了我的算法.为了避免内环展开的肮脏.但很难说服CLR对寄存器分配做出正确的选择.如果有一个简单的方法来说服CLR j和我真的是同一件事,那将是非常棒的.但相反,它确实是愚蠢的事情.优化第一个路径循环会很不错.但你不能使用goto进入循环.

我决定改编C函数memchr的64位实现.基本上不是一次扫描一个字节并进行比较,而是使用一些比特来一次扫描8个字节.作为参考,Array.IndexOf<Byte>对于一个答案执行与4字节扫描类似的操作,我只想继续这样做.有几点需要注意:

  1. 内存压力是SQLCLR功能中的一个非常现实的问题.String.Split因为它预先分配了很多我真正想避免的内存.它也适用于UCS-2字符串,这需要我将我的ascii字符串转换为unicode字符串,因此在返回时将我的数据视为lob数据类型.(SqlChars/ SqlString在转换为lob类型之前只能返回4000个字节).

  2. 我想流.避免String.Split它的另一个原因是同时完成其工作,造成大量内存压力.在具有大量分隔符的代码上,纯T-SQL方法将开始击败它.

  3. 我想保持它"安全".所以都管理好了.在安全检查中似乎有很大的惩罚.

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)

c# arrays clr performance sqlclr

5
推荐指数
1
解决办法
502
查看次数

XQuery计划复杂性

我有一个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-server xquery sqlclr sql-server-2008-r2

5
推荐指数
1
解决办法
644
查看次数

System.Security.HostProtectionException:尝试执行CLR主机禁止的操作

我在我的SQL CLR项目中使用线程,当我尝试运行用户定义的函数时,我收到以下错误.如何在项目中启用并行库和await/async等线程化操作?

__PRE__

.net c# sql-server multithreading sqlclr

5
推荐指数
1
解决办法
9625
查看次数

SQL Server:UDT与UDDT?

用户定义的类型(UDT)和用户定义的数据类型(UDDT)有什么区别?

t-sql sql-server sqlclr user-defined-types user-defined-data-types

5
推荐指数
1
解决办法
2112
查看次数

如何在CLR过程中使用Json Parser?

我正在疯狂尝试在我的类库中使用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开发人员

先感谢您。

c# sql-server serialization json sqlclr

5
推荐指数
1
解决办法
4484
查看次数