C# SQL Server CLR和T-SQL存储过程是否与调用方相同?

C# SQL Server CLR和T-SQL存储过程是否与调用方相同?,c#,sql-server,stored-procedures,clrstoredprocedure,C#,Sql Server,Stored Procedures,Clrstoredprocedure,为了编写一些虚拟存储过程,我想知道是否可以用C#编写它们,因为我对t-SQL不太了解 同一过程的C#和T-SQL版本是否与使用标准数据库库类调用代码(例如C++/C#/Java代码)无法区分?是的,调用方不会知道区别。但是,存在一些API差异: LOB类型的参数(即NVARCHAR(MAX)、VARBINARY(MAX)和XML)在SQLCLR对象中不能具有默认值。(可能需要投票支持的Microsoft Connect建议:) 不能将TVPs传递给SQLCLR对象 无法从SQLCLR对象返回以

为了编写一些虚拟存储过程,我想知道是否可以用C#编写它们,因为我对t-SQL不太了解


同一过程的C#和T-SQL版本是否与使用标准数据库库类调用代码(例如C++/C#/Java代码)无法区分?

是的,调用方不会知道区别。但是,存在一些API差异:

  • LOB类型的参数(即
    NVARCHAR(MAX)
    VARBINARY(MAX)
    XML
    )在SQLCLR对象中不能具有默认值。(可能需要投票支持的Microsoft Connect建议:)
  • 不能将TVPs传递给SQLCLR对象
  • 无法从SQLCLR对象返回以下数据类型:
    • SMALLDATETIME
    • SMALLMONEY
  • 无法向SQLCLR对象传入或从中返回以下数据类型:
    • CHAR
    • VARCHAR
    • TEXT
    • NTEXT
    • 图像

除了这个问题的技术答案之外,还有一些事情需要考虑:

  • 你觉得用C#比用T-SQL更容易做什么
  • 到底什么才是“哑巴”?你只是需要签名吗?如果是这样,那么在普通的T-SQL中实现这一点要容易得多。T-SQL执行模拟存储过程所需的一切是:

    CREATE PROCEDURE SchemaName.ProcedureName
    (
    @Param1name Param1Type,
    @Param2name Param2Type,
    ...
    )
    作为
    选择CONVERT(resultField1type,NULL)作为[resultField1name],
    将(resultField2type,NULL)转换为[resultField2name],
    ...
    ;
    
  • 术语“虚拟”意味着这些将在以后被其他东西取代。它们将被什么取代?T-SQL存储过程?如果你不懂t-SQL,谁来写呢

  • 如果您不了解t-SQL,并且没有任何人帮助您了解t-SQL(因此需要在SQLCLR中创建“虚拟”存储过程),那么您如何知道您正在正确构造此解决方案?不管T-SQL和SQLCLR是什么,您都可能会朝着完全错误的方向前进
我个人的观点是,虽然C#/CLR程序有其位置,但你的应用程序中的所有东西都使用它们,这是在把一个方形的钉子砸进一个圆形的洞。小心行事@TT。是的,对不起。为了更清楚地了解这一点,我已经更新了一个链接,链接到我的建议,以支持这些类型的默认值:-)为了回答您的好问题,一个外部供应商正在提供带有商定声明的程序。我只想写一些本地版本,我可以测试我的ODBC代码。我想这会很有趣;)@Boy先生,如果您已经同意签名,那么在T-SQL中这样做就容易多了。我用一个例子更新了我的答案。即使您对t-SQL了解不多,我也看不出通过SQLCLR来实现这一点有什么好处,特别是如果您对SQL Server不太熟悉,并且.NET中的某些东西无法像习惯于控制台/Windows/Web应用程序的人所期望的那样工作。有关我所指内容的更多详细信息,请参阅我撰写的这篇文章: