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

Mr.*_*Boy 2 c# sql-server stored-procedures clrstoredprocedure

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

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

Sol*_*zky 6

是的,来电者不会知道区别.但是,有一些API差异:

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


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

  • 你认为在C#中比在T-SQL中更容易做什么?
  • 究竟是什么被认为是"虚拟"?你只是需要签名吗?如果是这样,那么在普通的T-SQL中这样做会容易得多.T-SQL执行模拟存储过程所需的全部是:

    CREATE PROCEDURE SchemaName.ProcedureName
    (
      @Param1name  Param1Type,
      @Param2name  Param2Type,
      ...
    )
    AS
    SELECT  CONVERT(resultField1type, NULL) AS [resultField1name],
            CONVERT(resultField2type, NULL) AS [resultField2name],
            ...
                ;
    
    Run Code Online (Sandbox Code Playgroud)
  • 术语"虚拟"意味着这些将在以后用其他东西替换.他们会被取代什么?T-SQL存储过程?如果你不了解T-SQL,谁会写那些?

  • 如果您不了解T-SQL,并且您没有任何人帮助您知道T-SQL(因此需要在SQLCLR中制作"虚拟"存储过程),那么您怎么知道您正在构建这个解答正确吗?无论T-SQL与SQLCLR如何,您都可能走向完全错误的方向.