标签: sqlclr

重新部署包含CLR存储过程的.NET程序集

我编写了一个程序集中的CLR存储过程.

我有一个构建系统,可以从我们的源代码控制库自动构建和部署.net应用程序.

我希望这两件事能一起工作,这样我就可以重新部署承载CLR存储过程的程序集.

但是看起来,与IIS不同,只是替换二进制文件不起作用.看起来你必须对数据库进行DROP ASSEMBLY.为此,您需要删除引用该程序集的所有对象.

这在某种程度上似乎是合理的 - 即,从数据库完整性的角度来看 - 在另一种方式中是不合理的 - JIT方法适用于.NET的依赖关系的运行时评估.

那么,是否有可能做一些事情,所以我可以替换二进制文件,然后给SQL服务器一脚,让它弄清楚新程序集满足所有要求(即,具有正确的公共命名空间,类型,方法等来满足sprocs这是绑定它的).

sql-server deployment continuous-integration stored-procedures sqlclr

4
推荐指数
1
解决办法
5769
查看次数

t-sql中的正确/标题案例

我正在使用SQL 2012 RC0,并寻找一个可以将包含名字和姓氏的列转换为正确/标题大小写的函数.我已经看了一下,但似乎找不到任何东西,如果有另一个帖子请告诉我,我会关闭这个.

我要转换的表格列是从Web前端的用户输入字段填充的,因此有时不会以可用于在客户报表上填写名称字段的格式输入(请在前端可以更严格,但这并不能解决已经存在于数据库中的客户的问题.

有谁知道如何在t-sql中执行此操作?SQL 2012是否有可用于执行此操作的字符串函数?或者我应该通过CLR(C#)存储过程来寻找一种方法吗?

t-sql sqlclr sql-server-2012

4
推荐指数
1
解决办法
7859
查看次数

参数如何从 SQL Server 传递到基于 CLR 的存储过程?

使用这个例子:

http://www.sommarskog.se/dynsearch-2008/search_orders_cs.cs

....我构建了一个基于 CLR 的存储过程并将其成功部署到 SQL Server。当在 SSMS 中查看生成的存储过程定义时(请参见下面的代码),我注意到 C# 定义中定义的参数确实是 SP 定义的一部分,但是当您查看对存储过程的实际调用时,没有引用参数,所以我很好奇参数值实际上是如何传递的?

(我具体询问的原因是,在 C# 代码中,我想知道是否可以将Query变量设置为我想要的任何现有存储过程,然后在一个大 varchar 参数中将所有相关参数作为分隔的 KeyValue 对传递,然后拆分它们并将它们添加为循环内的 Command.Parameters 基本上,我正在尝试构建一个通用存储过程,它可以执行任何其他存储过程,而对参数的变化计数或数据类型没有任何限制,所有这些将在运行时读取。所以基本上,除了在 SQL Server 中实现之外,从 C# 调用到 SQL Server 时具有相同的灵活性。)

生成的存储过程(在 SSMS 中查看):

CREATE PROCEDURE [dbo].[search_orders_cs]
    @Orderid [int],
    @Fromdate [datetime],
    @Todate [datetime],
    @Minprice [money],
    @Maxprice [money],
    @Custid [nvarchar](4000),
    @Custname [nvarchar](4000),
    @City [nvarchar](4000),
    @Region [nvarchar](4000),
    @Country [nvarchar](4000),
    @Prodid [int],
    @Prodname [nvarchar](4000),
    @Debug [bit]
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [SqlServerProject1].[StoredProcedures].[search_orders_cs]
GO


EXEC sys.sp_addextendedproperty @name=N'SqlAssemblyFile', @value=N'twg_clr_based_sp.cs' , …
Run Code Online (Sandbox Code Playgroud)

c# sql-server ssms sqlclr

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

如果找到多个匹配,则正则表达式失败

采取以下正则表达式:

P[0-9]{6}(\s|\.|,)
Run Code Online (Sandbox Code Playgroud)

这是为了检查一个字符串中以"P"开头的6位数字 - 大部分工作正常.

问题是,如果发现多个匹配,我们需要失败 - 这可能吗?

即,使以下屏幕截图中的文本4失败,但仍然保持所有其他失败/通过,如下所示:

在此输入图像描述

(此RegEx正在SQL .net CLR中执行)

regex sqlclr

4
推荐指数
1
解决办法
347
查看次数

使用非对称密钥签署不安全的程序集

我想部署我自己的 CLR,这需要不安全的权限并将数据库设置为值得信赖的。

我在 interwebz 上发现可以使用非对称密钥对具有外部访问权限的程序集进行签名,但我没有找到一种方法来使用它对不安全的程序集进行签名。

那可能吗?如果是,执行此操作的步骤是什么?

sql-server sqlclr assembly-signing

4
推荐指数
2
解决办法
3199
查看次数

VS 2019 升级后无法调试 .NET

我正在使用 VS 2019 调试 SQL Server CLR C# .NET 代码。我收到了来自 VS 的升级通知,我做了并重新启动。我现在在尝试调试时收到错误

无法调试 .NET 代码。无法附加到“....”上的 SQL Server。64 位版本的 Visual Studio 远程调试器 (MSVSMON.EXE) 不能用于调试 32 位进程或 32 位转储。请改用 32 位版本。

现在我的 SQL Server (2019) 是 64 位的,而 SQLCLR 平台目标是 x64,那么是什么让它认为涉及 32 位进程呢?

此外,SQL Server 和 VS 2019 在同一台机器上,这不是远程机器问题。

c# sql-server sqlclr sql-server-2019

4
推荐指数
1
解决办法
156
查看次数

为什么我们使用CLR程序

为什么我们使用CLR程序.CLR程序或CLR程序是唯一解决方案的任何示例是否有任何意义?

.net c# vb.net sql-server sqlclr

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

SQL Server 2008:自定义聚合函数和索引视图

我在使用自定义CLR聚合函数的视图上创建索引时遇到问题.

我没有看到任何方法将聚合函数标记为确定性或使用模式绑定.

我正在创建我的函数:

CREATE ASSEMBLY StringUtil
AUTHORIZATION dbo
FROM 'C:\StringUtil.dll'
WITH PERMISSION_SET = UNSAFE
GO

CREATE AGGREGATE SUMSTRING (@input nvarchar(200)) 
RETURNS nvarchar(max) WITH SCHEMABINDING 
EXTERNAL NAME StringUtil.Concatenate
Run Code Online (Sandbox Code Playgroud)

我的观点定义为:

CREATE VIEW RolledValues WITH SCHEMABINDING
AS
SELECT ID, SumString(ValueText) as Value FROM [dbo].[IDValue]
GROUP BY ID
Run Code Online (Sandbox Code Playgroud)

当我尝试在该视图上创建索引时,会出现此问题:

CREATE UNIQUE CLUSTERED INDEX IDX_RollValues_ID_VALUE on RolledValues (ID)

Error:  Cannot create index on view "dbo.RolledValues" because it uses aggregate
"dbo.SumString". Consider eliminating the aggregate, not indexing the view, or 
using alternate aggregates.
Run Code Online (Sandbox Code Playgroud)

那么可以在索引视图中使用自定义聚合函数吗?我找不到任何关于此的文件......

sql-server sqlclr sql-server-2008

3
推荐指数
1
解决办法
1489
查看次数

.NET Regex整个字符串匹配

如果我们采取以下模式:70000 @*和970000 @*字符串970000@ILoveFishSticksAndTarTarSauce.com:.5060返回一个匹配到70000 @*

我理解为什么它匹配,但我需要修改正则表达式只进行完整的字符串匹配.

有任何想法吗?

谢谢!

我正在使用.Net 3.5库

这是代码:

[Microsoft.SqlServer.Server.SqlProcedure]
    public static void RouteRegex(string phoneNumber, out string value)
    {
        if (string.IsNullOrEmpty(phoneNumber))
        {
            value = string.Empty;
            return;
        }
        const string strCommand =
            "Select RouteID,sequence,Pattern From SIPProxyConfiguration.dbo.Routes order by routeid, sequence asc";
        using (var connection = new SqlConnection("context connection=true"))
        {
            try
            {
                connection.Open();
                using (var command =new SqlCommand(strCommand,connection))
                {
                    using (var reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            var regEx = reader[2] as string;
                            if (string.IsNullOrEmpty(regEx)) continue;
                            var routeId = reader[0]; …
Run Code Online (Sandbox Code Playgroud)

.net c# regex sqlclr

3
推荐指数
1
解决办法
4445
查看次数

SQLCLR带有可选参数/默认值的存储过程

现在C#支持可选参数,有没有办法编写SQL CLR存储过程,以便从Visual Studio发布将使用C#中定义的可选参数在SQL Server中创建存储过程?

过去唯一的方法是手动编写包装函数:
SQL Server 2005中.NET存储过程的默认参数值/可选参数

我宁愿避免这种情况,因为它需要两次编写接口,以及在事情发生变化时维护两个接口.

例:

[Microsoft.SqlServer.Server.SqlProcedure]
public static void help(string FunctionName = "")
{
    SqlPipe pipe = SqlContext.Pipe;
    pipe.Send("help> " + FunctionName + "<");
}
Run Code Online (Sandbox Code Playgroud)

从VS2013发布(在生成的发布脚本中):

CREATE PROCEDURE [dbo].[help] @FunctionName [nvarchar](MAX)
AS EXTERNAL NAME [YOURDB].[StoredProcedures].[help];
Run Code Online (Sandbox Code Playgroud)

运行它:

exec help
Procedure or function 'help' expects parameter '@FunctionName', which was not supplied.
Run Code Online (Sandbox Code Playgroud)

但是,如果您手动编写过程创建如下:

drop procedure [help]
CREATE PROCEDURE [dbo].[help] 
( @FunctionName nvarchar(100) = null)
AS EXTERNAL NAME [YOURDB].[StoredProcedures].[help];

exec help 
help> <
Run Code Online (Sandbox Code Playgroud)

....它现在按预期运行.

Visual Studio具有将参数发布为可选的所有信息,因为C#支持它们,所以要么我做错了,要么他们只是没有更新发布实现来识别可选参数.

c# sql-server sqlclr

3
推荐指数
1
解决办法
3059
查看次数