问题 是否有Transact-SQL的替代品


这是我多年来第一次在SQL Server 2008中进行一些T-SQL编程,并忘记了语言的真正含义:

  • 流量控制(所有开始/结束的东西)感觉笨重
  • 异常处理很差。例外不会像其他语言一样冒泡。除非你自己和他自己编码,否则没有重新投掷 RAISERROR 功能甚至拼写不正确(这让我有些头疼!)
  • 字符串处理很差
  • 唯一的序列类型是表。我必须编写一个函数来根据分隔符拆分字符串,并且必须将它存储在一个表中,该表中包含字符串部分以及指示序列中位置的值。
  • 如果你需要在存储过程中进行查找,那么操作结果是很痛苦的。如果结果包含某种排序列,您可能必须使用游标或使用嵌套查找一起修改while循环

我意识到我可以使用C#编写我的存储过程,但是这需要允许服务器允许CLR功能,这在我的工作场所不是一个选项。

有没有人知道在SQL Server中是否有任何替代T-SQL,或者是否有任何计划引入的东西。当然,必须有一个更现代的替代方案......

PS:这不是为了开始一场火焰战,我真的对选项的兴趣感兴趣。


7517
2019-06-02 00:13:37


起源

也许这对序列有点帮助: sommarskog.se/arrays-in-sql-2008.html - Skurmedel
@Skurmedel:谢谢。我碰到过类似的文章,他们一旦你使用T-SQL,你得把一切都成表,以处理“列表”八九不离十亮点可能指向的是 - Sean


答案:


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

也许看一看 LINQ?你可以写 CLR存储过程,但我不推荐这个,除非它是某些功能缺失(或重字符串处理)。


8



@Mitch:仅仅因为它完成了这项工作并不严格意味着它没有任何问题。你是否必须与语言搏斗以完成简单的事情,然后它会告诉我它不是最好的语言。 SQL Server是一个企业级数据库,它应该具有企业级语言,而不是拼凑在一起的东西。 - Sean
@Sean:T-SQL是一种基于集合的SQL编程语言 - 它可以很好地完成这项工作。 T-SQL是 不 一种程序性语言 - 它处理的结构并不是那么好,但这并不是它最初的目的。 - marc_s
我同意Mitch和Marc的观点。 TSQL在基于集合的操作方面非常出色。一旦你知道如何正确使用它可以是一个非常强大的工具。也许如果Sean在程序中有太多的控制流程,那么数据库层中有太多的业务逻辑......摆脱流量控制,你就摆脱了所有问题。 - JoshBerke


所有其他数据库存储过程语言(PL / SQL,SQL / PSM)都存在大致相同的问题。就个人而言,我认为这些语言完全适合用于它们的目的 - 它们最适合用于代码数据驱动的逻辑,尤其是。如果你想为多个应用程序重用它。

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


3



是的,一些处理将在中间件级别完成,但在存储过程中仍有合理的处理量。另外,在中间件级别的Microsoft世界中?没有真正的“应用服务器”概念,如WebLogic或JBoss,而是你有SQL Server,MSMQ和IIS的组合。 - 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 deverloper,但是因为无论如何你似乎都被MS平台所束缚,这个(.NET)是否解决了大部分这些问题? - Roland Bouman


从我的观点来看,SQL Server中只有T-SQL的替代方案是不使用SQL Server

根据你的点处理蜇丝分隔符, 从哪里来的这些弦? 您可以尝试使用Integration服务和“ssis包”将数据从一个转换为另一个。 还有通过Linked Serves访问非SQL数据的好方法,


2