【问题标题】:SQL Server 2008 Receive an user-defined table type in a CLR Stored Procedure?SQL Server 2008 在 CLR 存储过程中接收到用户定义的表类型?
【发布时间】:2010-12-30 08:49:22
【问题描述】:

我在 SQL Server 2008 中有表值参数,例如:

CREATE TYPE UserType AS TABLE
(
    UserID int,
    UserName nvarchar(100),
    UserPassword nvarchar(100)
)

我可以在我的 SQL CLR 存储过程中以某种方式使用这种类型吗?比如作为输入参数?

[SqlProcedure]
public static void SomeFunction (/* what type should be here ?? */)
{
     //
}

【问题讨论】:

  • 在 MSDN 的论坛上here 提出了同样的问题。同样的答案也出来了。 ://

标签: c# sql sql-server-2008 sqlclr


【解决方案1】:

我不相信你可以。页 Mapping CLR Parameter Data 表示表数据类型没有(SQL Server CLR 或 .NET Framework)等效项。


或者,引用@Jani 的link

用户定义的表类型不能作为表值参数传递给在 SQL Server 进程中执行的托管存储过程或函数,也不能从其返回

【讨论】:

  • 是的,我也找到了。谢谢你
【解决方案2】:

Transact-SQL 表值函数将调用函数的结果具体化为中间表。由于它们使用中间表,因此它们可以支持对结果的约束和唯一索引。当返回较大的结果时,这些功能非常有用。

相比之下,CLR 表值函数代表了一种流式替代方案。不要求将整个结果集具体化在一个表中。托管函数返回的IEnumerable对象被调用表值函数的查询的执行计划直接调用,结果以增量方式消费。这种流模型确保可以在第一行可用后立即使用结果,而不是等待填充整个表。如果返回的行数非常多,这也是一个更好的选择,因为它们不必作为一个整体在内存中实现。例如,托管表值函数可用于解析文本文件并将每一行作为一行返回。

Reference

【讨论】:

    【解决方案3】:

    尝试使用类而不是表值参数:

    public class UserType
    {
        int UserID { get; set; }
        string UserName { get; set; }
        string UserPassword { get; set; }
    )
    
    [SqlProcedure]
    public static void SomeFunction (UserType type)
    {
         //
    }
    

    【讨论】:

    • 这给出:CREATE PROCEDURE [dbo].[SomeProcedure] @param /* 错误:不支持的类型。 */
    猜你喜欢
    • 2021-11-04
    • 1970-01-01
    • 2017-04-02
    • 2013-09-06
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    相关资源
    最近更新 更多