是否有Transact-SQL的替代品?

11

多年以后,我又开始在 SQL Server 2008 中编写 T-SQL 程序了,结果发现这门语言真的很糟糕:

  • 流程控制(所有的 begin/end)感觉很笨重
  • 异常处理不好。异常无法像其他语言那样透明地传递。除非自己编码,否则无法重新抛出异常,而且 raiserror 函数的拼写甚至都不正确(这让我头疼了一阵!)
  • 字符串处理能力差
  • 唯一的序列类型是表格。我不得不编写一个函数来分割基于分隔符的字符串,并将其存储在一个表格中,该表格具有字符串部分以及表示它们在序列中的位置的值。
  • 如果您需要在存储过程中进行查找,那么操作结果就会很痛苦。您只能使用游标或通过嵌套查找的 while 循环来解决包含某种排序列的结果。

我意识到可以使用 C# 编写存储过程,但这需要在我的工作场所允许 CLR 函数的权限,这并不是一个选项。

有人知道 SQL Server 中是否有任何 T-SQL 的替代品,或者是否有任何计划引入新的替代品。肯定有更现代的选择...

PS:这不是要引发争论,我真的很想知道有哪些选项。


也许这个链接对序列有所帮助:http://www.sommarskog.se/arrays-in-sql-2008.html - Skurmedel
@Skurmedel:谢谢。我看过类似的文章,它们强调了我的观点,即一旦你使用T-SQL,你必须将所有内容放入表中才能处理“列表”。 - Sean
3个回答

8

T-SQL 没有问题;它完成了它的预期工作(除了可能缺少控制流结构,但我离题了!)。

也许看一下 LINQ?你可以编写 CLR 存储过程,但我不建议这样做,除非是为了解决某些缺失的功能(或者涉及大量字符串处理)。


1
@Mitch:仅仅因为它能完成工作,并不意味着它没有任何问题。如果你必须与语言斗争才能完成简单的事情,那么这表明它不是最好的语言。SQL Server是一个企业级数据库,应该有一个企业级语言,而不是看起来拼凑在一起的东西。 - Sean
3
T-SQL是一种基于集合的SQL编程语言,它非常擅长这方面的工作。T-SQL不是一种过程性语言,它对处理这些结构不是很熟练,但这也不是它最初的用途。 - marc_s
3
我同意 Mitch 和 Marc 的观点。TSQL 在集合操作方面表现出色,一旦你知道如何正确使用它,它可以成为非常强大的工具。也许如果 Sean 在存储过程中有太多的控制流程,那么数据库层面可能存在过多的业务逻辑... 消除流程控制,你就可以解决所有问题。 - JoshBerke

3

其他所有数据库存储过程语言(如PL/SQL、SQL/PSM)的问题几乎相同。就个人而言,我认为这些语言完全适合它们的预期用途 - 它们最适合用于执行数据驱动逻辑代码,特别是如果您希望将其重用于多个应用程序。

所以,我想反问您一个问题,为什么您希望您的程序作为数据库服务器进程的一部分运行?您试图解决的问题不是在应用程序或中间件层面更好地解决吗?在那里,您可以选择任何语言或数据处理工具。


1
是的,一些处理将在中间件层完成,但仍有相当数量的工作需要在存储过程中完成。此外,在微软世界中,在中间件层中?没有像WebLogic或JBoss这样的真正的“应用服务器”概念,而是使用SQL Server、MSMQ和IIS的组合。 - Sean
Sean,我倾向于将任何不直接固定在前端或后端的东西称为中间件。你重申你会在存储过程中完成它,但我认为你仍然需要问自己:“为什么?如果你在外部组件中完成它,你会失去什么?” - Roland Bouman
PL/SQL比T-SQL更优秀,它具有实际可用的错误处理功能和包。 - SQL Cowboy
我正在寻求跨语言支持。通过使用 T-SQL 编写部分功能,我计划从 C#、Java、Python 和 C++ 中拥有轻量级库。通过将更多的功能上移一级,会引入更多的语言交互问题,而调用存储过程则可以轻松地从任何语言中实现。 - Sean
@SQL Cowboy:看,你不必向我解释PL/SQL有哪些功能和没有哪些功能。我非常清楚。实际编程PL/SQL和T-SQL过程之间的相似之处大于差异。@Sean,这是一个有效的观点,我不会争辩。我不是.NET开发人员,但既然你似乎已经绑定到MS平台上了,那么.NET难道不能解决这些问题吗? - Roland Bouman

2

在我看来,SQL Server 中替代 T-SQL 的唯一选择是不使用 SQL Server。

根据您的观点处理带分隔符的字符串, 这些字符串从哪里来? 您可以尝试使用集成服务和“ssis 包”将数据从一个格式转换为另一个格式。 此外,还有一种很好的方法可以通过链接服务器访问非 SQL 数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接