标签: sqlclr

从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 Server CLR内存分配

目前我们有MS SQL Server 2005(32位).我们有1个汇编(只有1个汇编),我们用它来加密和解密.只有512 MB的系统内存分配给CLR.程序集运行得很慢,我试图排除它是否来自内存.当我在查询分析器中运行SQL代码(而不是在程序集中)时,它会快速运行.我们使用对称密钥和证书进行加密/解密.

是否有建议的内存分配给CLR?如何判断缺少内存分配是否会降低此程序集的性能?

memory sql-server encryption assemblies sqlclr

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

CLR程序集将不会加载64位SQL Server 2005

我们在安装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年首次登记已经存在.也许这是数据库项目的早期模板中的一个错误?

无论如何,谢谢你的帮助.我会接受拉斯的答案,因为我怀疑许多遇到同样问题的人最能得到他的回答.

.net sql-server 64-bit sqlclr

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

如何在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
查看次数

SQLCLR和DateTime2

使用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?

.net c# t-sql sqlclr sql-server-2008

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

类型与创建CLR存储过程不匹配

我在程序集中有一个方法,如下所示:

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)

.net c# sqlclr sql-server-2008

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

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

OVER子句中的SQL ORDER BY与CLR聚合不兼容?

序言 我一直在调查一个概念,我在下面发布的内容是我一直在努力的简化版本.如果你看一下并且想"这样做没有任何意义"那么可能是因为我没有任何意义 - 可能有更有效的方法来做到这一点.我只想尝试一下,因为它看起来很有趣.

我正在尝试使用反向波兰式实现在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 …

c# sql sqlclr

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

命名空间'System.Data'中不存在类型或命名空间名称'DataSetExtensions'(您是否缺少程序集引用?)

我知道这是一个常见的错误,但我对项目中添加的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项目的问题吗?

.net c# sql sqlclr reference

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

CLR功能不会返回超过4000个字符

第一次发帖,请善待!:-) 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)

c# sql-server web-services sqlclr

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