对于此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来提取节点的名称.我愿意接受这方面的建议.
目前我们有MS SQL Server 2005(32位).我们有1个汇编(只有1个汇编),我们用它来加密和解密.只有512 MB的系统内存分配给CLR.程序集运行得很慢,我试图排除它是否来自内存.当我在查询分析器中运行SQL代码(而不是在程序集中)时,它会快速运行.我们使用对称密钥和证书进行加密/解密.
是否有建议的内存分配给CLR?如何判断缺少内存分配是否会降低此程序集的性能?
我们在安装SQL Server 2005(32位)时使用带有一些用户定义函数的程序集.我们使用如下脚本将其部署到生产中:
CREATE ASSEMBLY [Ourfunctions]
AUTHORIZATION [dbo]
FROM 0x4D5A9000...000
WITH PERMISSION_SET = SAFE
GO
CREATE FUNCTION [dbo].[GLOBAL_FormatString](@input [nvarchar](4000))
RETURNS [nvarchar](4000) WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [Ourfunctions].[UserDefinedFunctions].[GLOBAL_FormatString]
GO
Run Code Online (Sandbox Code Playgroud)
我们从未遇到过这些功能的任何问题.现在,当我们尝试将其中一个服务器升级到x64时,我们在调用任何函数时遇到错误.样本堆栈跟踪:
System.Data.SqlClient.SqlException:尝试加载程序集ID为65549时,Microsoft .NET Framework中发生错误.服务器可能资源不足,或者程序集可能不受PERMISSION_SET = EXTERNAL_ACCESS或UNSAFE信任.再次运行查询,或检查文档以了解如何解决程序集信任问题.有关此错误的更多信息:System.IO.FileLoadException:无法加载文件或程序集'ourfunctions,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一.给定的程序集名称或代码库无效.(来自HRESULT的异常:0x80131047)System.IO.FileLoadException:at System.Reflection.Assembly.nLoad(AssemblyName fileName,String codeBase,Evidence assemblySecurity,Assembly locationHint,StackCrawlMark&stackMark,Boolean throwOnFileNotFound,Boolean -snip-
错误提到权限集EXTERNAL_ACCESSAND UNSAFE而我们使用级别SAFE.
.dll文件是在目标平台设置为'Any CPU'的情况下构建的,当我们尝试从文件而不是varbinary语法加载dll时,我们得到相同的结果.我们已经在http://support.microsoft.com/kb/918040中尝试了这些建议
我们在32位机器上尝试了完全相同的程序,一切正常.它必须是x86和x64之间的差异.有任何想法吗?
解决方案:我们终于找到了解决方案 事实证明我们的程序集确实是32位编译的.在Visual Studio中,我们使用了目标"Any CPU",但在检查底层.csproj时,我发现了以下代码段:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
...other elements...
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
所以我们的"任何CPU"目标实际上是构建一个x86程序集!Aaargh.我已经在颠覆中找回了这一行,但它在2006年首次登记已经存在.也许这是数据库项目的早期模板中的一个错误?
无论如何,谢谢你的帮助.我会接受拉斯的答案,因为我怀疑许多遇到同样问题的人最能得到他的回答.
据我所知,SQL Server 2008中支持(或将会)System.Core.dll和System.Xml.Linq.dll.
我试图在我的SQL 2008 CLR项目中使用Linq to Objects.
我将如何"添加"/注册这些dll?(我不能将它们添加为参考)
在此先感谢,奥里
使用SQL Server 2008,Visual Studio 2005,.net 2.0 with SP2(支持新的SQL Server 2008数据类型).
我正在尝试编写一个SQLCLR函数,它将DateTime2作为输入并返回另一个DateTime2.例如:
using System;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
namespace MyCompany.SQLCLR
{
public class DateTimeHelpCLR
{
[SqlFunction(DataAccess = DataAccessKind.None)]
public static SqlDateTime UTCToLocalDT(SqlDateTime val)
{
if (val.IsNull)
return SqlDateTime.Null;
TimeZone tz = System.TimeZone.CurrentTimeZone;
DateTime res = tz.ToLocalTime(val.Value);
return new SqlDateTime(res);
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,上面的编译很好.我希望这些SqlDateTimes映射到SQL Server的DateTime2,所以我尝试运行这个T-SQL:
CREATE function hubg.f_UTCToLocalDT
(
@dt DATETIME2
)
returns DATETIME2
AS
EXTERNAL NAME [SQLCLR].[MyCompany.SQLCLR.DateTimeHelpCLR].UTCToLocalDT
GO
Run Code Online (Sandbox Code Playgroud)
这会出现以下错误:
Msg 6551,级别16,状态2,过程f_UTCToLocalDT,第1行"f_UTCToLocalDT"的CREATE FUNCTION失败,因为返回值的T-SQL和CLR类型不匹配.
使用DATETIME(而不是DATETIME2)工作正常.但我宁愿使用DATETIME2来支持提高的精度.我做错了什么,或者SQLCLR没有(完全)支持DateTime2?
我在程序集中有一个方法,如下所示:
namespace MyNameSpace
{
public class MyClass
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void MyMethod(SqlChars myMessage)
{
// Stuff here
}
}
}
Run Code Online (Sandbox Code Playgroud)
我将其编译为一个DLL并将其加载到我的SQL Server中,如下所示:
drop assembly MyAssembly
create assembly MyAssemblyfrom 'C:\Scripts\MyAssembly.dll'
Run Code Online (Sandbox Code Playgroud)
一切正常.
但现在我尝试运行这个:
CREATE PROCEDURE MySproc @message nvarchar(max)
AS EXTERNAL NAME MyAssembly.[MyNameSpace.MyClass].MyMethod
Run Code Online (Sandbox Code Playgroud)
当我运行时,我收到此错误:
"MySproc"的CREATE PROCEDURE失败,因为参数"@myMessage"的T-SQL和CLR类型不匹配.
我有什么想法可以解决这个问题?
我也试过这些方法签名:
public static void MyMethod(string myMessage)public static void MyMethod([SqlFacet(MaxSize = -1)] string myMessage)是否可以将用户定义的聚合(clr)与窗口函数(over)一起使用?
在文档中找不到答案:http://technet.microsoft.com/en-us/library/ms190678.aspx
序言 我一直在调查一个概念,我在下面发布的内容是我一直在努力的简化版本.如果你看一下并且想"这样做没有任何意义"那么可能是因为我没有任何意义 - 可能有更有效的方法来做到这一点.我只想尝试一下,因为它看起来很有趣.
我正在尝试使用反向波兰式实现在SQL中使用CLR自定义聚合来计算任意计算.我正在使用这些数据:
K | Amt | Instruction | Order
--+-----+-------------+------
A | 100 | Push | 1
A | 1 | Multiply | 2
A | 10 | Push | 3
A | 2 | Multiply | 4
A | | Add | 5
A | 1 | Push | 6
A | 3 | Multiply | 7
A | | Add | 8
Run Code Online (Sandbox Code Playgroud)
计算结果应该是123 ( = (100 * 1) + (10 * 2) + (1 …
我知道这是一个常见的错误,但我对项目中添加的System.Data.DataSetExtensions.dll有正确的引用,我的项目是为.net 4.5构建的SQL CLR项目,我在下一行收到错误:
using System.Data.DataSetExtensions;
Run Code Online (Sandbox Code Playgroud)
我还检查了dll的属性,它引用了4.5 dll的正确版本,那么还有什么可能导致这个问题呢?这是SQL CLR项目的问题吗?
第一次发帖,请善待!:-) VB/C#的新手,试图修复一个调用Web服务的CLR函数.我拼凑了以下内容:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Collections;
using System.Globalization;
// For the SQL Server integration
using Microsoft.SqlServer.Server;
// Other things we need for WebRequest
using System.Net;
using System.Text;
using System.IO;
public partial class UserDefinedFunctions
{
// Function to return a web URL as a string value.
[Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
public static SqlChars GET(SqlString uri, SqlString username, SqlString passwd)
{
// The SqlPipe is how we send data back to the caller
SqlPipe pipe = SqlContext.Pipe; …Run Code Online (Sandbox Code Playgroud) sqlclr ×10
.net ×5
c# ×5
sql-server ×5
sql ×2
64-bit ×1
assemblies ×1
encryption ×1
linq ×1
memory ×1
reference ×1
t-sql ×1
web-services ×1
xml ×1
xpath ×1