0

我有一个过程,我需要对包含 Forename、Surname、Address1 等列的 SQL 表执行一些复杂的字符串操作

为了执行此数据操作,我设置了各种 SQL CLR C# 函数,但现在我想将整行传递给一个 CLR 函数或存储过程。

你最好的方法是什么?

我正在考虑创建一个表值参数,然后创建一个 SQL CLR SPROC 来接受数据,但数据是只读的还是我可以在 C# 中执行数据操作并返回一个新的数据集?

有任何想法吗?

4

1 回答 1

0

您不能将 TVP(表值参数)传递给 SQLCLR 过程或函数。它们是在数据库中定义的,.NET 代码对它们一无所知。

如果您要将所有字段都传递给此函数,那么此函数很可能特定于此表,那么为什么不将每个字段作为单独的输入参数传递呢?

您有几个输出选项:

  1. 如果您只有一个值要返回,则创建一个标量函数,它可以按如下方式使用:

    UPDATE tbl  
    SET tbl.Field = MyCLRFunction(tbl.Field1, tbl.Field2, tbl.Field3, tbl.Field4)  
    FROM dbo.Table tbl  
    WHERE tbl.Field5 = SomeValue;
    
  2. 如果您需要传回多个值(但假定仍然是单行),则创建一个可以通过 CROSS APPLY 使用的表值函数,如下所示:

    UPDATE tbl  
    SET tbl.Field6 = fnc.FieldA,  
        tbl.Field7 = fnc.FieldB,  
        tbl.Field8 = fnc.FieldC,  
    FROM dbo.Table tbl  
    CROSS APPLY MyCLRFunction(tbl.Field1, tbl.Field2, tbl.Field3, tbl.Field4) fnc  
    WHERE tbl.Field5 = SomeValue;
    

从技术上讲,这不需要 SQLCLR 而不是常规的 T-SQL 函数,但是根据正在执行的操作,在 SQLCLR 中它可能会更快。

于 2013-04-19T22:12:28.450 回答