将整行传递给SQL CLR函数/存储过程

将整行传递给SQL CLR函数/存储过程,sql,sql-server,sqlclr,clrstoredprocedure,table-valued-parameters,Sql,Sql Server,Sqlclr,Clrstoredprocedure,Table Valued Parameters,我有一个过程,需要对包含诸如Forename、姓氏、Address1等列的SQL表执行一些复杂的字符串操作 为了执行此数据操作,我设置了各种SQL CLR C#函数,但现在我想将整行传递给一个CLR函数或存储过程 做这件事最好的方法是什么 我正在考虑创建一个表值参数表,然后创建一个SQL CLR存储过程来接受数据,但是数据是只读的还是可以在C#中执行数据操作并返回一个新的数据集 有什么想法吗?您不能将TVP(表值参数)传递给SQLCLR过程或函数。它们在数据库中定义,而.NET代码对它们一无所知

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

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

做这件事最好的方法是什么

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

有什么想法吗?

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

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

您在输出上有两个选项:

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

    更新tbl
    设置tbl.Field=myclr函数(tbl.Field1、tbl.Field2、tbl.Field3、tbl.Field4)
    来自dbo.Table tbl
    其中tbl.Field5=某个值;
    
  • 如果需要传回多个值(但假设仍然是一行),则创建一个表值函数,该函数可通过交叉应用使用,如下所示:

    更新tbl
    设置tbl.Field6=fnc.FieldA,
    tbl.Field7=fnc.FieldB,
    tbl.FIELD 8=fnc.FIELD C,
    来自dbo.Table tbl
    交叉应用MyCLR函数(tbl.Field1、tbl.Field2、tbl.Field3、tbl.Field4)fnc
    其中tbl.Field5=某个值;
    

  • 从技术上讲,与常规T-SQL函数相比,这不需要SQLCLR,但根据正在进行的操作,在SQLCLR中可能会更快。

    我知道一段时间过去了,这可能不再是一个问题,但我想知道您是否有机会看看我的答案。谢谢