我想编写一个监视数据库表的服务(可能在c#中).当记录插入表中时,我希望服务获取新插入的数据,并使用它执行一些复杂的业务逻辑(对于TSQL来说太复杂).
一种选择是让服务定期检查表以查看是否已插入新记录.这样做的问题是我希望服务一旦发生就知道插件,我不想杀死数据库性能.
做一点研究,似乎写一个CLR触发器可以完成这项工作.我可以在c#中编写触发器,当插入发生时触发,然后将新插入的数据发送到Windows或WCF服务.
您认为,SQL CLR触发器的良好(甚至可能)使用是什么?
关于如何实现这一目标的任何其他想法?
我在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) 根据这个帖子,F#Core必须经SQLCLR批准才能标记组件SAFE.这是计划好的吗?甚至可以做到吗?
SQL Server的散列函数HASHBYTES的输入限制为8000字节.
你如何散列更大的字符串?
我有一个基于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存储过程.我只是需要建议是否可以支持我上面提到的场景.
如果我在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#中读到这个?
(一个用例可能是定期启用此功能并在生产环境中记录这些结果,以便密切关注索引建议.)
对于此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来提取节点的名称.我愿意接受这方面的建议.
据我所知,SQL Server 2008中支持(或将会)System.Core.dll和System.Xml.Linq.dll.
我试图在我的SQL 2008 CLR项目中使用Linq to Objects.
我将如何"添加"/注册这些dll?(我不能将它们添加为参考)
在此先感谢,奥里
我正在尝试在链接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) 我已经潜入研究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触发器代码不是透明代码或使其完全受信任?
我愿意接受建议.