Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 这是使用存储过程执行CRUD的正确方法吗?_Sql_Stored Procedures - Fatal编程技术网

Sql 这是使用存储过程执行CRUD的正确方法吗?

Sql 这是使用存储过程执行CRUD的正确方法吗?,sql,stored-procedures,Sql,Stored Procedures,我有一个任务来归档一些数据库表。为了简化一切,我基本上必须做以下几点: 根据某些条件从表1中检索一些行 将这些行插入备份数据库中的表中 从表1中删除这些行 我必须在几个表上执行这些操作 这告诉我要根据不同的CRUD操作(每个CRUD一个)创建单独的SP。可以看到,我需要执行的步骤是读取,更新,以及删除。然后根据这篇文章,我的每个表需要3个SP。所以如果我有10个表需要备份,那么我需要写30个SP 有人能告诉我这是不是正确的做法吗 谢谢。代表我的学习曲线发言:当我开始使用数据库时,我并不太在意我现

我有一个任务来归档一些数据库表。为了简化一切,我基本上必须做以下几点:

  • 根据某些条件从表1中检索一些行
  • 将这些行插入备份数据库中的表中
  • 从表1中删除这些行
  • 我必须在几个表上执行这些操作

    这告诉我要根据不同的CRUD操作(每个CRUD一个)创建单独的SP。可以看到,我需要执行的步骤是
    读取
    更新
    ,以及
    删除
    。然后根据这篇文章,我的每个表需要3个SP。所以如果我有10个表需要备份,那么我需要写30个SP

    有人能告诉我这是不是正确的做法吗


    谢谢。

    代表我的学习曲线发言:当我开始使用数据库时,我并不太在意我现在做的事情。最简单、更“合乎逻辑”的方法是在一个SP中执行CRUD,因为根据您的场景,事情很小。 但是当涉及到可伸缩性时,您确实需要将它们分开。这是一个良好的习惯,开始建立在您的编程。 另一点需要指出的是,对数据库应用的顺序越多越好

    关于必须弄脏10张桌子。不需要,您不需要30个SP(也许您需要,但这不太可能)。您可以使用变量、参数等,以便使用参数(表名等)执行对多个表的读取。与其他CRUD的操作相同


    所以,简而言之:也许你最终会有一个大而复杂的SP来读取表格。但事实就是这样,你努力工作一次,然后一次又一次地重复使用。(这是一件好事;如果您不懂OOP,它肯定会在将来帮助/拯救您)

    考虑一个存储过程来概述您想要执行的某种函数。您正在尝试将数据归档到表中,因此我将调用存储的proc dbo.archive\u Table1。“存档”是一个前缀,表示过程的操作,后缀是要对其执行操作的对象

    举个简单的例子,假设您想在几个表中归档数据,这些表都与汽车数据相关。您可以创建一个名为dbo.Archive\u Cars的存储过程,它作用于所有这些表。它的冗长足以告诉任何人看它你想做什么

    在新的存储过程中,您可以随意执行任何您想要的操作。一起做插入和删除!不必处理30个SP,你的生活会轻松一千倍。当然,稍后可能会创建一些其他CRUD SP,但请根据需要进行创建


    你在问题中的提纲是完美的;只要把它转换成代码,就可以了

    您是否计划定期执行此任务?如果没有,并且所需的表不会经常更改,那么您可以在一个存储过程中完成。如果表的更改量相当大,则可以为每个表创建一个存储过程。我遇到过一个类似的问题,我只是为每个对象/表创建了一个“存档”存储过程。@AlexTyman,是的,任务将定期作为Cron作业运行,并且表将经常更改。所以你建议我为每个表的每个CRUD操作创建单独的存储过程?我明白你的意思,谢谢。我也想到了这个想法,但是表之间的列有很大的不同。虽然我可以参数化表名,但如何参数化表列?正如您在我链接的文章中所看到的,作者明确说明了所有列名。选择column_name,*从information_schema.columns,其中table_name='YourTableName'是实现这一点的方法,您可以获得它们,列出它们,存储它们,然后继续您必须完成的任何工作。在
    中选择column_name,*
    你是说
    选择列名。*
    ?另外,我忘了提到我正在使用Sybase。不,它只是列名称,然后*以防您想检查information\u schema.columns中包含的所有信息。但是column_name可以完成这项工作。Daniel,我在从Sybase数据库的表中获取列名列表时遇到了麻烦。我在网上搜索过,我尝试过使用
    syscolumn
    sysobjects
    ,但似乎都不起作用。知道表名后,您知道如何获得列名列表吗?