当前位置:  开发笔记 > 编程语言 > 正文

以编程方式检索与SQL Server Management Studio gui返回的源相同的SQL Server存储过程源?

如何解决《以编程方式检索与SQLServerManagementStudiogui返回的源相同的SQLServer存储过程源?》经验,为你挑选了5个好方法。

有关如何以编程方式从SQL Server 2005获取完全相同的存储过程源的任何指针,就像我在SQL Server Management Studio中右键单击该存储过程并选择修改一样?

我正在尝试使用SMO,但存在一些文本差异.该过程始终具有CREATE,而不是ALTER,并且标头中存在一些差异,例如在我以编程方式获取的版本中缺少GO.我可以解决这些问题,但也许还有更好的方法吗?

我再次使用SMSE在SQL Server 2005中.通过Visual Studio 8 2008使用SMO.

更新:得到一些答案,告诉我们如何检索存储过程的基础知识.我正在寻找的是检索与GUI生成的文本相同(或几乎相同)的文本.

示例:对于sp_mysp,在Management Studio中单击鼠标右键,选择"修改".这会产生:

    USE [MY_DB]  
    GO  
    /****** Object:  StoredProcedure [dbo].[sp_mysp]    Script Date: 01/21/2009 17:43:18 ******/  
    SET ANSI_NULLS ON  
    GO  
    SET QUOTED_IDENTIFIER ON  
    GO  
    -- =============================================
    -- Author:      
    -- Create date: 
    -- Description: 
    -- =============================================
    ALTER PROCEDURE [dbo].[sp_mysp]

我想以编程方式获得相同的东西(注意标题中的GO,以及它是一个更改程序的事实.理想情况下,我希望通过最小程序修复所检索的源来实现此目的.

我很乐意在Script Date细节中得到不同的东西...



1> Mark Brittin..:
EXEC sp_helptext 'your procedure name';

这避免了INFORMATION_SCHEMA方法的问题,其中如果存储过程太长则存储过程被切断.

更新:David写道,这与他的sproc并不完全相同......也许是因为它将这些行作为"记录"返回以保留格式?如果您想以更"自然"的格式查看结果,可以先使用Ctrl-T(输出为文本),然后将其打印出来,就像输入它一样.如果你在代码中这样做,那么做一个foreach以完全相同的方式组合你的结果是微不足道的.

更新2:这将为源提供"创建过程"而不是"更改过程",但我知道无法使用"ALTER"代替.然而,有点琐碎的事情不是吗?

更新3:有关如何在源代码管理系统中维护SQL DDL(数据库结构)的更多信息,请参阅注释.这确实是这个问题的关键.


实际上,自动生成所有这些的存储过程将非常简单.光标通过sys.objects,其中type ='P'来获取所有的sprocs,将每个提交给sp_HelpText,然后在ALTER换出时将光标移动到结果中.生成带打印的输出,保存到文件.提交给SVN

2> Sam Saffron..:

您必须手动编写代码,SQL Profiler会显示以下内容.

SMSE在生成语句时执行相当长的查询字符串.

以下查询(或其中的某些内容)用于提取文本:

SELECT
NULL AS [Text],
ISNULL(smsp.definition, ssmsp.definition) AS [Definition]
FROM
sys.all_objects AS sp
LEFT OUTER JOIN sys.sql_modules AS smsp ON smsp.object_id = sp.object_id
LEFT OUTER JOIN sys.system_sql_modules AS ssmsp ON ssmsp.object_id = sp.object_id
WHERE
(sp.type = N'P' OR sp.type = N'RF' OR sp.type='PC')and(sp.name=N'#test___________________________________________________________________________________________________________________00003EE1' and SCHEMA_NAME(sp.schema_id)=N'dbo')

它返回纯CREATE,然后在某处的代码中用ALTER替换.

SET ANSI NULL内容以及GO语句和日期都是前缀.

使用sp_helptext,更简单...



3> 小智..:

你以编程方式说,对吗?我希望C#没问题.我知道你说过你尝试过SMO而且它没有做你想要的,所以这可能不适合你的请求,但它会以编程方式读出你可以运行的重要SQL语句来重新创建存储过程.如果它没有GO你想要的语句,你可以假设它中的每个字符串StringCollection都可以GO在它之后.你可能没有得到日期和时间的评论,但在我类似的声音项目(大屁股部署工具,必须单独备份所有内容),这已经做得相当不错.如果你有一个你想要工作的先前基础,并且你仍然有原始数据库来运行它,我会考虑抛弃最初的努力并重新计算这个输出.

using System.Data.SqlClient;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
…
string connectionString = … /* some connection string */;
ServerConnection sc = new ServerConnection(connectionString);
Server s = new Server(connection);
Database db = new Database(s, … /* database name */);
StoredProcedure sp = new StoredProcedure(db, … /* stored procedure name */);
StringCollection statements = sp.Script;



4> keithwarren7..:

使用以下select语句获取所有完整定义:

select ROUTINE_DEFINITION from INFORMATION_SCHEMA.ROUTINES Where ROUTINE_NAME='someprocname'

我的猜测是SSMS和其他工具读出来并在必要时进行更改,例如将CREATE更改为ALTER.据我所知,SQL存储不是该过程的其他表示


这无疑有助于检索主要的存储过程主体(尽管也可以使用sp_helptext)。但是,与我在该过程上单击鼠标右键并选择“修改”时,GUI生成的结果并不相同。谢谢,不过。
如果代码很长,也将被切断。

5> 小智..:

我同意马克的观点.我将输出设置为文本模式,然后将sp_HelpText设置为"sproc".我把它绑在Crtl-F1上让它变得简单.

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有