14

有没有办法可以找到存储过程的保存位置,以便我可以将文件复制到我的桌面?

4

4 回答 4

44

存储过程不存储为文件,它们存储为元数据,并sysschobjs在目录视图sys.objects、、sys.procedures等中向我们 peons 公开(感谢 Michael 提醒) sys.sql_modules。对于单个存储过程,您可以使用直接查询定义这些观点(最重要的是sys.sql_modules.definition)或使用尼古拉斯指出OBJECT_DEFINITION()的功能(尽管他的描述并不完全准确)。syscomments

要将所有存储过程提取到单个文件中,一种选择是打开对象资源管理器,展开your server > databases > your database > programmability并突出显示stored procedures节点。然后点击F7(查看 >对象资源管理器详细信息)。在右侧,选择所需的所有程序,然后右键单击script stored procedure as > create to > file。这将生成一个包含您选择的所有程序的文件。如果您希望每个程序都有一个文件,则可以通过一次仅选择一个程序来使用此方法,但这可能很乏味。您还可以使用此方法将所有与会计相关的程序编写到一个文件中,将所有与财务相关的程序编写到另一个文件中,等等。

为每个存储过程生成一个文件的更简单方法是使用生成脚本向导- 再次从对象资源管理器开始 - 右键单击​​您的数据库并选择Tasks > Generate scripts. 选择Select specific database objects并选中顶级Stored Procedures框。点击下一步。对于输出选择Save scripts to a specific location, Save to file, 和Single file per object.

根据您的 SSMS 版本,这些步骤可能会略有不同。

于 2013-08-14T19:15:12.903 回答
5

存储过程不会“存储”为单独的文件,您可以在没有数据库的情况下自由浏览和阅读。它存储在它所属的一组系统表中的数据库中。包含定义的表称为 [sysschobjs],我们任何最终用户都无法(直接)访问它。

为了从数据库中检索这些存储过程的定义,我喜欢使用这个查询:

select definition from sys.sql_modules 
where object_id = object_id('sp_myprocedure')

但我喜欢亚伦的回答。他提供了一些其他不错的选择。

于 2013-08-14T19:16:17.613 回答
1

这取决于您运行的 SQL Server 版本。对于最近的版本,存储过程的源代码可通过系统视图sys.sql_modules获得,但获取存储过程或用户定义函数 (UDF) 源代码的更简单方法是使用系统函数object_definition()(视图定义sys.ssql_modules使用):

select object_definition( object_id('dbo.my_stored_procedure_or_user_defined_function') )

在旧版本中,存储过程和 UDF 可通过现已弃用的 view system view 获得sys.syscomments

在旧版本的 SQL Server 中,它可以通过系统表 `dbo.syscomments' 获得

应该注意的是,根据您的访问权限和数据库的配置方式,您可能无法使用源或者它可能已加密,这使得它不是非常有用。

您还可以使用SMO(Sql Server 管理对象)以编程方式获取源代码。 http://technet.microsoft.com/en-us/library/hh248032.aspx

于 2013-08-14T19:16:26.187 回答
1

我最近遇到了以编程方式将存储过程脚本提取到文件的问题。我开始使用routine_definition 方法,但很快意识到我达到了4000 个字符的限制......无论我尝试什么,我都找不到克服这个困难的方法。(仍然有兴趣知道是否有办法解决这个问题!)

相反,我偶然发现了一个强大的内置助手。sp_helptext

简而言之,为了提取存储过程脚本,特别是 sp_helptext 将每一行提取到输出中的一行。即,2000 行代码 = 返回数据集中的 2000 行。只要您的单行不超过 4000 个字符的限制,就不会剪裁任何内容。

当然,你可以很容易地将整个表内容写入文件,无论是在 SQL 中,还是在我的例子中是 SSIS。

于 2020-02-17T08:49:29.957 回答