为了编写一些虚拟存储过程,我想知道是否可以用 C# 编写它们,因为我不太了解 T-SQL。
同一过程的 C# 和 T-SQL 版本是否无法区分调用代码,例如使用标准数据库库类的 C++/C#/Java 代码?
最佳答案
是的,调用者不会知道其中的区别。但是,存在一些 API 差异:
- LOB 类型的参数(即
NVARCHAR(MAX)
、VARBINARY(MAX)
和XML
)在 SQLCLR 对象中不能有默认值. (Microsoft Connect 建议投票,也许:Support default parameter values for NVARCHAR(MAX), VARBINARY(MAX), and XML types in SQLCLR objects) - 您不能将 TVP 传递给 SQLCLR 对象。
- 您不能从 SQLCLR 对象返回以下数据类型:
SMALLDATETIME
小钱
- 您不能向 SQLCLR 对象传入或返回以下数据类型:
字符
VARCHAR
文本
NTEXT
图像
除了问题的技术答案之外,还有一些事情需要考虑:
- 您特别认为在 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], ... ;
术语“dummy”意味着这些将在以后被其他东西取代。他们将被什么取代? T-SQL 存储过程?如果您不知道 T-SQL,谁来编写这些内容?
- 如果您不了解 T-SQL,并且没有任何了解 T-SQL 的人帮助您(因此需要在 SQLCLR 中创建“虚拟”存储过程),那么您怎么知道您是否正确构建了这个解决方案?无论 T-SQL 还是 SQLCLR,您都可能会朝着完全错误的方向前进。
关于c# - SQL Server CLR 和 T-SQL 存储过程与调用者是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35923331/