代码之家  ›  专栏  ›  技术社区  ›  philsquared

SQL Server 2008中CLR过程的表值参数-可能吗?

  •  16
  • philsquared  · 技术社区  · 17 年前

    This page from SQL Server 2008 BOL ,讨论CLR存储过程,并有一个标题为“表值参数”的部分,其中讨论了它们的优势。那太好了-我很想在CLR程序中使用TVPs,但不幸的是,这似乎是宇宙中唯一提到这种可能性的地方,本节没有描述语法是什么(本段末尾链接的更多信息也没有)

    当然,我可以很容易地找到关于如何从T-SQL过程中使用TVP的描述,或者通常如何执行CLR过程的描述。但是写一个需要TVP的CLR进程?没有什么这是非常不寻常的,因为将多行数据传递到存储的进程是一个常见的问题。

    这让我想知道,该页面上出现的部分是否是一个错误。有人请告诉我不是这样,并告诉我更多的信息/例子。

    [编辑]

    我正要把这篇文章发到微软的一个论坛上,突然我看到了 this, which seems to be the final nail in the coffin . 看来这是不可能的。

    5 回复  |  直到 17 年前
        1
  •  5
  •   Ronald Wildenberg    17 年前

    我能找到一个 lot more references . 然而,这些都是用于将表值参数传递给TSQL过程的,所以这没有什么用处。

    list of mappings 在CLR和SQL类型之间。对于表类型,没有映射,因此以下操作不起作用,例如:

    [SqlProcedure]
    public static void StoredProcedure(DataTable tvp, out int sum)
    {
        return 42;
    }
    

    CREATE TYPE MyTableType AS TABLE 
    (
        Id INT NOT NULL PRIMARY KEY,
        [Count] INT NOT NULL
    )
    GO
    CREATE ASSEMBLY ClrTest FROM '<somePath>'
    GO
    CREATE PROCEDURE ClrTest
    AS EXTERNAL NAME ClrTest.StoredProcedures.StoredProcedure
    GO
    

    不管你试什么类型的( DataTable , DbDataReader , IEnumerable CREATE PROCEDURE 呼叫不断生成错误6552: “ClrTest”的创建过程失败,因为参数“@tvp”的T-SQL和CLR类型不匹配。

    其次,您链接到的页面上的文档说明: 用户定义的表类型不能作为表值参数传递给SQL Server进程中执行的托管存储过程或函数,也不能从中返回。

    也许你可以在微软论坛的某个地方问你的问题。奇怪的是,他们在CLR存储过程页面上提到了表值参数,但从未解释如何实现这一点。如果你能找到解决办法,我想知道。

        2
  •  4
  •   Boban Stojanovski    14 年前

    可以使用在调用过程和读取clr过程中的表之前创建和填充的临时表。

        3
  •  2
  •   JG Coding    14 年前

    解决方案是将表格数据序列化为Json格式的字符串,然后将该字符串传递到CLR进程中。在clr过程或函数中,您可以将json解析为IEnumerable、list或Tablear对象。然后,您可以像处理任何其他类型的表格数据一样处理这些数据。

    我已经编写了一些实用程序,能够将任何sql表序列化为Json格式的字符串。我很乐意与提供其电子邮件地址的任何人分享。Phil Factor编写了一个很好的T-SQL Json解析器,他称之为parseJson。我已将他的解决方案改编为clr,该clr执行速度更快。两者都接受Json格式的字符串,并从该字符串生成一个表。我还为T-SQL和CLR使用了各种Json实用程序,它们能够序列化、解析、插入、删除和更新存储在SQL列中的Json格式字符串。

        4
  •  2
  •   Buggieboy    14 年前

    如果使用C#(与缺少自定义迭代器的VB相反),则可以编写ADO.NET代码来调用ExecuteOnQuery()并使用 参数(即TVP)。

    作为TVP值传递的集合必须实现 IEnumerable<SqlDataRecord> . 每次这个数字都是 生利 被执行,一个 SqlDataRecord -行-通过管道连接到“table”参数。

    看见 this article 详情请参阅。

        5
  •  1
  •   jaundice    15 年前

    • 定义TSQL表值UDT FooTable
    • 将结果XML传递给CLR函数/过程,而不是表本身

    不太理想,但离得更近了一点。