标签: sqlclr

SQL CLR触发器可以执行此操作吗?或者,还有更好的方法?

我想编写一个监视数据库表的服务(可能在c#中).当记录插入表中时,我希望服务获取新插入的数据,并使用它执行一些复杂的业务逻辑(对于TSQL来说太复杂).

一种选择是让服务定期检查表以查看是否已插入新记录.这样做的问题是我希望服务一旦发生就知道插件,我不想杀死数据库性能.

做一点研究,似乎写一个CLR触发器可以完成这项工作.我可以在c#中编写触发器,当插入发生时触发,然后将新插入的数据发送到Windows或WCF服务.

您认为,SQL CLR触发器的良好(甚至可能)使用是什么?

关于如何实现这一目标的任何其他想法?

sql t-sql sql-server triggers sqlclr

7
推荐指数
1
解决办法
4631
查看次数

SQL Server - 使用OnNullCall处理CLR用户定义函数(UDF)中的空输入

我在SQL Server(用.NET编写)中有一个用户定义的函数来清理文本.我想知道如何处理空输入.

这是C#中的函数:

[Microsoft.SqlServer.Server.SqlFunction]
public static SqlChars cleanEstActText(SqlChars input)
{
    SqlChars cascadingSqlChar = removeNBSP(input);
    cascadingSqlChar = optimizeFontTags(cascadingSqlChar);

    return cascadingSqlChar;
}
Run Code Online (Sandbox Code Playgroud)

如果函数获取任何空数据,则这是SQL中的错误:

A .NET Framework error occurred during execution of user-defined routine or aggregate "removeNBSP": 
System.Data.SqlTypes.SqlNullValueException: Data is Null. This method or property cannot be called on Null values.
System.Data.SqlTypes.SqlNullValueException: 
   at System.Data.SqlTypes.SqlChars.get_Value()
   at UserDefinedFunctions.removeNBSP(SqlChars input)
Run Code Online (Sandbox Code Playgroud)

阅读SO和Google让我看到了OnNullCall属性,这看起来很有希望.

来自MSDN:

如果在方法调用中指定null(在Visual Basic中为Nothing)输入参数时调用该方法,则为true;否则为false.如果方法在其任何输入参数为null时返回null(在Visual Basic中为Nothing)值,则返回false(在Visual Basic中为Nothing).

听起来和我想要的完全一样; 如果我得到null,只需传递null.我不太确定如何实现它,所以我再次检查MSDN(http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.server.sqlmethodattribute.aspx),并重写第一行我的功能来自

[Microsoft.SqlServer.Server.SqlFunction]
Run Code Online (Sandbox Code Playgroud)

[Microsoft.SqlServer.Server.SqlMethod(OnNullCall = false, IsMutator = false, InvokeIfReceiverIsNull = false)]
Run Code Online (Sandbox Code Playgroud)

如果我这样做,我在使用它时会在SQL中出错:

Cannot find either column …
Run Code Online (Sandbox Code Playgroud)

sql-server null sqlclr user-defined-functions

7
推荐指数
2
解决办法
6193
查看次数

F#核心库是否可以获得SQLCLR批准?

根据这个帖子,F#Core必须经SQLCLR批准才能标记组件SAFE.这是计划好的吗?甚至可以做到吗?

f# sqlclr

7
推荐指数
1
解决办法
418
查看次数

在SQL Server中散列超过8000个字节

SQL Server的散列函数HASHBYTES的输入限制为8000字节.

你如何散列更大的字符串?

t-sql sql-server sqlclr sql-server-2008

7
推荐指数
2
解决办法
5110
查看次数

在SQL Server 2012中注册CLR功能(基于WCF)

我有一个基于CLR的存储过程,用于MsmqIntegrationBinding将消息发布到远程MSMQ.在SQL Server 2005中一切正常,但现在有一个从2005年到2012年的升级,假设发生.我尝试在SQL Server 2012中注册CLR(SP),但在注册System.ServiceModell.DLL时出现了以下错误.

Msg 6544,Level 16,State 1,Line 1
为程序集'System.ServiceModel'创建程序集失败,因为程序集'microsoft.visualbasic.activities.compiler'格式错误或不是纯.NET程序集.无法验证的PE标头/本机存根.

我搜索了解决方案,似乎很少有其他人遇到同样的问题,而现在还没有解决方法.

使用的主要原因MSMQIntegrationBinding是我们希望确保每条消息只发送一次.正如你所看到的那样,我ExactlyOnce对普通system.messaging类中没有的属性非常感兴趣.我们处理数千条消息并且消息的排序非常重要,每条消息都标有一个id,如果发送的任何消息的id小于先前发送的消息,则客户端系统停止(大问题).

我还使用system.messaging重写了CLR存储过程.我只是需要建议是否可以支持我上面提到的场景.

sql wcf sqlclr .net-assembly sql-server-2012

7
推荐指数
1
解决办法
2241
查看次数

以编程方式读取SQL Server的查询计划建议的SQL特定执行索引?

如果我在SSMS中运行此命令:

set showplan_xml on
GO
exec some_procedure 'arg1', 'arg2','arg3'
GO
set showplan_xml off
GO
Run Code Online (Sandbox Code Playgroud)

我获得了查询执行中涉及的完整调用堆栈的XML输出,以及任何建议的索引等.

怎么可能从C#中读到这个?

(一个用例可能是定期启用此功能并在生产环境中记录这些结果,以便密切关注索引建议.)

c# sql-server sqlclr sql-execution-plan

7
推荐指数
1
解决办法
1238
查看次数

从SQL XML列中的元素获取属性的名称

对于此xml(在SQL 2005 XML列中):

<doc>
 <a>1</a>
 <b ba="1" bb="2" bc="3" />
 <c bd="3"/>
<doc>
Run Code Online (Sandbox Code Playgroud)

我希望能够检索属性(ba,bb,bc,bd)的名称,而不是SQL Server 2005中的值.好吧,XPath肯定允许使用name(),但SQL不支持.这是我在SQL中使用XML的主要抱怨; 你必须弄清楚XML/Xpath/XQuery规范的哪些部分.

我能想到的唯一方法是构建一个CLR proc,它将XML加载到XML Document(iirc)中并运行XPath来提取节点的名称.我愿意接受这方面的建议.

.net xml sql-server xpath sqlclr

6
推荐指数
2
解决办法
1万
查看次数

如何在SQL CLR中添加Linq支持

据我所知,SQL Server 2008中支持(或将会)System.Core.dll和System.Xml.Linq.dll.

我试图在我的SQL 2008 CLR项目中使用Linq to Objects.

我将如何"添加"/注册这些dll?(我不能将它们添加为参考)

在此先感谢,奥里

linq sqlclr

6
推荐指数
1
解决办法
2834
查看次数

创建更快的正则表达式clr函数

我正在尝试在链接http://msdn.microsoft.com/en-us/magazine/cc163473.aspx中改进Clr功能.

public static partial class UserDefinedFunctions 
{
    public static readonly RegexOptions Options =
        RegexOptions.IgnorePatternWhitespace |
        RegexOptions.Singleline;

    [SqlFunction]
    public static SqlBoolean RegexMatch(
        SqlChars input, SqlString pattern)
    {
        Regex regex = new Regex( pattern.Value, Options );
        return regex.IsMatch( new string( input.Value ) );
    }
}
Run Code Online (Sandbox Code Playgroud)

执行时select * from Table1 where dbo.RegexMatch(col1, 'pattern') = 1,Clr函数为表中的每一行创建一个新的Regex对象.

是否可以为每个Sql语句只创建一个Regex对象?对于每一行只需致电regex.Ismatch(...).以下代码是否有效?

public static partial class UserDefinedFunctions 
{
    public static readonly RegexOptions Options =
        RegexOptions.IgnorePatternWhitespace |
        RegexOptions.Singleline;

    static Regex regex = null;

    [SqlFunction] …
Run Code Online (Sandbox Code Playgroud)

c# sql-server sql-server-2005 sqlclr sql-server-2008

6
推荐指数
1
解决办法
2158
查看次数

SQL CLR触发器,如何通过透明代码调用关键代码使程序集受信任?

我已经潜入研究SQL CLR.不幸的是,我的第一个例子有透明代码调用安全代码的问题.

关键是我的SQL CLR触发器被视为透明代码.在触发器中,我使用Quartz来调用Quartz Windows服务:

var properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "ServerScheduler";

properties["quartz.scheduler.proxy"] = "true";
properties["quartz.scheduler.proxy.address"] = string.Format("tcp://{0}:{1}/{2}", "localhost", "555",
                "QuartzScheduler");

var schedulerFactory = new StdSchedulerFactory(properties);

IScheduler scheduler = schedulerFactory.GetScheduler();
Run Code Online (Sandbox Code Playgroud)

错误:

(135,1):SQL72014:.Net SqlClient数据提供程序:消息6522,级别16,状态1,过程AfterMarketSessionInserted,第1行在执行用户定义的例程或聚合"AfterMarketSessionInserted"期间发生.NET Framework错误:System.MethodAccessException :尝试通过安全透明方法 '.Database.Triggers.MarketSessionTriggers.AfterMarketSessionInserted()' 访问安全关键方法 'Quartz.Impl.StdSchedulerFactory..ctor(System.Collections.Specialized.NameValueCollection)' 失败.

程序集"数据库,版本= 1.0.5275.15169,Culture = neutral,PublicKeyToken = null"部分受信任,这使得CLR使其完全安全透明,而不管程序集本身是否有任何透明度注释. 为了访问安全关键代码,必须完全信任此程序集. System.MethodAccessException:at Database.Triggers.FinancialMarketSessionTriggers.AfterFinancialMarketSessionInserted()

--------------

为什么SQL CLR触发器代码被视为透明代码并且部分受信任?

如何使SQL CLR触发器代码不是透明代码或使其完全受信任?

我愿意接受建议.

c# sql-server security sqlclr

6
推荐指数
1
解决办法
2229
查看次数