我知道SqlContext.WindowsIdentity返回正在执行命令的当前用户(在CLR触发器中),但是,这仅适用于经过Windows身份验证的用户.如果是sql server用户,我如何获得用户名?任何帮助表示赞赏.
我在SQL Server和Exchange Web服务之间的CLR中有一个接口,用于在应用程序之间同步和发送电子邮件.在测试中,它没有任何问题地工作(编辑); 我们看到生产环境中的零星问题,其中较长的Web服务任务似乎已经重叠.
我的问题非常简单,我无法通过阅读MSDN上的CLR详细信息来决定 - 是CLR线程安全还是不开箱即用.
如果没有什么是最好的方式来调用CLR是线程安全的,那就是围绕我的程序进行解释,或者是否有一个不那么激烈的替代方案.
谢谢你的回复; 我们正在解决这个问题,而不是SQL问题,这是一个EWS /模拟问题.我们已经在系统上完成了一组新的负载测试,甚至在大量负载下(比应用程序到目前为止高出1000倍)我们无法看到内存泄漏/线程问题,这就是为什么我们现在正在寻找其他地方..
下面这两个方法是相似的,除了一个处理空值而另一个不处理.要处理空值,它使用SqlString类型并检查"get_IsNull"属性.
为什么第一个"A .NET Framework error occurred during execution of user-defined routine or aggregate "CheckMailingAddress": ."在SQL CLR中运行时会导致错误,而第二个不在?
特别是,TSQL错误是 "Msg 10329, Level 16, State 49, Line 1 .Net Framework execution was aborted."
.method public hidebysig static bool CheckMailingAddress(valuetype [System.Data]System.Data.SqlTypes.SqlString param0) cil managed
{
.maxstack 8
L_0000: ldarga.s param0
L_0002: nop
L_0003: nop
L_0004: call instance bool [System.Data]System.Data.SqlTypes.SqlString::get_IsNull()
L_0009: brfalse L_0010
L_000e: ldc.i4.1
L_000f: ret
L_0010: ldarga.s param0
L_0012: nop
L_0013: nop
L_0014: call instance string [System.Data]System.Data.SqlTypes.SqlString::get_Value()
L_0019: call class DatabaseValues.MailingAddress …Run Code Online (Sandbox Code Playgroud) 我正在尝试部署一个调用Web服务的UpdateContries SQL CRL过程,请按照此处的帮助进行操作
所以基本上我在Visual Studio 2010上有一个Visual C#SQL CLR数据库项目,它有一个简单的过程调用外部Web服务,该服务被添加为Web引用.
我已将项目复制到包含SQL Server 2008数据库的远程服务器.
在项目属性中,我将生成序列化程序集设置为"打开",将数据库权限级别设置为"外部",并且已激活部署代码.
同样在项目中,我手动创建并删除序列化程序集,如下所示:
PreDeployScript.sql
IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'ReportsWebServicesXML')
DROP ASSEMBLY [ReportsWebServicesXML];
GO
Run Code Online (Sandbox Code Playgroud)
PostDeployScript.sql
CREATE ASSEMBLY [ReportsWebServicesXML]
FROM 'E:\Projects\Reports\ReportsWebServices\ReportsWebServices\bin\Debug\ReportsWebServices.XmlSerializers.dll'
WITH PERMISSION_SET = SAFE;
GO
Run Code Online (Sandbox Code Playgroud)
项目构建和部署成功,我可以在Assembies文件夹下的Visual Studio 2010 Server资源管理器中看到ReportsWebServices和ReportsWebServicesXML,但是当我尝试运行该过程时,它仍然返回以下错误:
Msg 6522, Level 16, State 1, Procedure UpdateContries, Line 0
A .NET Framework error occurred during execution of user-defined …Run Code Online (Sandbox Code Playgroud) serialization web-services sqlclr visual-studio-2010 sql-server-2008
我有一个在SQL Server中注册的程序集:
CREATE ASSEMBLY [CLRFunctions]
AUTHORIZATION [dbo]
FROM 0x4D5A90000300000...
WITH PERMISSION_SET = SAFE
Run Code Online (Sandbox Code Playgroud)
我怎样才能找到这个组件的路径?
我正在使用visual studio 2012和MS SQL Server 2012.我创建了SQL CLR项目,并按照以下链接执行了以下步骤 :http://blogs.interfacett.com/how-create-net-stored-procedure-sql-server
现在,当我在附加触发器的表中插入数据时,会插入数据,但是我收到以下错误." 请求类型'System.Net.WebPermission,System,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'的权限失败. "
谁能告诉我,我怎么能解决它?
提前致谢.
我创建了一个简单的 1 方法 DLL,使用内部 Web 服务将字符串地址转换为纬度/经度字符串。代码很简单:
public class GeoCodeLib
{
[SqlFunction(IsDeterministic=false)]
public SqlString GetLatLon(SqlString addr)
{
Geo.GeoCode gc = new Geo.GeoCode();
Geo.Location loc = gc.GetLocation(addr.Value);
return new SqlString(string.Format("{0:N6}, {1:N6}", loc.LatLon.Latitude, loc.LatLon.Longitude));
}
}
Run Code Online (Sandbox Code Playgroud)
我的目标是.NET Framework 2.0。我们使用的是 SQL Server 2008 R2。该程序集已添加到数据库中(该程序集称为 GeoCodeSqlLib.dll)。我们没有对其设置任何权限。
我似乎无法调用它。我试过了:
select GeoCodeSqlLib.GeoCodeLib.GetLatLon('12143 Thompson Dr. Fayetteville, AR 72704')
Run Code Online (Sandbox Code Playgroud)
这给了我这样的信息,Cannot find either column "GeoCodeSqlLib" or the user-defined function or aggregate "GeoCodeSqlLib.GeoCodeLib.GetLatLon", or the name is ambiguous.
我试过了:
CREATE FUNCTION GetLatLon(@amount varchar(max)) RETURNS varchar(max)
AS EXTERNAL NAME GeoCodeSqlLib.GeoCodeLib.GetLatLon
Run Code Online (Sandbox Code Playgroud)
这给了我这样的信息,Could …
我正在尝试编写一个 SQLCLR 函数,它将返回一个可为空的布尔值。如果我像这样声明函数:public static SqlBoolean? IsTimeZoneDST(SqlString timeZone)那么在尝试使用程序集时会收到错误,指出返回值的类型不匹配。是否有我遗漏的东西,或者在这种情况下不可能返回可为空的布尔值?
我有一个 C# SQLCLR 存储过程,其中首先将数据填充到一些字典中并进行计算,然后将输出存储在其他一些字典中。
由于使用了字典,该计算完成得非常快,并且完全证明了我需要使用 CLR 存储过程而不是普通的 SQL 存储过程。
然而,我必须将这些输出字典中的数据保存在 SQL 中的某些表中,这部分花费了很多时间,并且满足了我对整个 SQLCLR 过程更快的需求。
我必须迭代每个输出字典的每个键,然后必须创建插入查询,然后必须按以下方式运行 ExecuteNonQuery:

那么我该如何改进我的这种方法,以便在插入数据时不需要花费时间。我无法使用SqlBulkCopy,因为它不接受进程内上下文连接(即"Context Connection = true;")作为连接字符串。那么还有其他更快的方法可用吗?提前致谢。
我想知道如何(如果可能的话)颠倒从TSQL字符串(varchar)返回的单词的顺序.
我知道TSQL REVERSE函数,但也反转了单词中的字母,例如:
输入> We want to tell you we all love StackOverflow
输出>wolfrevOkcatS evol lla ew uoy llet ot tnaw eW
我想在TSQL中实际实现以下功能:
输入> We want to tell you we all love StackOverflow
输出>Stackoverflow love all we you tell to want We
我在任何地方找到的唯一一个稍微类似的问题是这个,但是包括拆分逗号分隔的字符串,我不需要这样做.
我确信有一种方法可以实现上述目标,即使它是自定义函数或SQL-CLR函数,任何帮助都将非常感激.
编辑:
我设法使用以下方法拆分我的字符串:
-- Create a space delimited string for testing
declare @str varchar(max)
select @str = 'We want to tell you we all love StackOverflow'
-- XML tag the …Run Code Online (Sandbox Code Playgroud) sqlclr ×10
sql-server ×9
c# ×3
.net ×2
clr ×1
import ×1
nullable ×1
sql ×1
t-sql ×1
web-services ×1