如何以编程方式检索与由SQL Server Management Studio gui返回的源相同的SQL Server存储过程源?
任何关于如何以编程方式从SQL Server 2005获取完全相同的存储过程源的指针,就像我在SQL Server Management Studio中右键单击该存储过程并select修改?
我正在尝试使用SMO,但是有一些文本差异。 该过程总是有CREATE,而不是ALTER,并且在头部有一些不同之处,比如在编程的版本中缺lessGO。 我可以解决这些,但也许有更好的办法?
再次,我在SQL Server 2005中使用SMSE。 通过Visual Studio 8 2008使用SMO。
谢谢!
更新 :得到了一些答案,告诉如何检索存储过程的基础知识。 我正在寻找的是检索与GUI生成相同(或几乎相同)的文本。
例如:对于sp_mysp,在Management Studio中右键单击,select修改。 这会产生:
使用[MY_DB] 走 / ******对象:StoredProcedure [dbo]。[sp_mysp]脚本date:01/21/2009 17:43:18 ****** / SET ANSI_NULLS ON 走 SET QUOTED_IDENTIFIER ON 走 - ============================================= - 作者: - 创builddate: - 说明: - ============================================= ALTER PROCEDURE [dbo]。[sp_mysp]
我想以编程方式获得相同的东西(注意标题中的GOs,以及它是一个ALTER PROCEDURE的事实。理想情况下,我想用最less的程序化修复源代码来获得这个。
我很乐意在“脚本date”详细信息中find不同的内容。 。 。
EXEC sp_helptext 'your procedure name';
这避免了INFORMATION_SCHEMA方法的问题,其中如果存储过程太长,则会被截断。
更新:大卫写道,这是不相同的他的存储…也许是因为它返回的行作为'logging'来保存格式? 如果您想以更自然的格式查看结果,则可以先使用Ctrl-T(以文本forms输出),并按照input的内容将其打印出来。 如果你是用代码来做这件事的话,那么用一个习惯把你的结果放在一起的方法是很简单的。
更新2:这将提供一个“CREATE PROCEDURE”,而不是“ALTER PROCEDURE”,但我知道没有办法使它使用“ALTER”来代替。 那种微不足道的事情,不是吗?
更新3:请参阅注释,以获得关于如何在源代码pipe理系统中维护SQL DDL(数据库结构)的更多信息。 这真是这个问题的关键。
您将不得不手动编写代码,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语句和date都是这个前置的。
去用sp_helptext,更简单…
你以编程方式说,对吧? 我希望C#可以。 我知道你说你尝试过SMO,但是它并没有完全按照你的要求去做,所以这可能不适合你的请求,但是它会以编程的方式读出合法的SQL语句,你可以运行它来重新创build存储过程。 如果它没有你想要的GO
语句,你可以假定StringCollection
中的每个string都可以有一个GO
。 你可能不会在date和时间中得到这个评论,但是在我的类似的testing项目(大屁股部署工具必须单独备份所有东西)中,这个做得相当不错。 如果你有一个以前的基础,你想工作,而你仍然有原始的数据库来运行这个,我会考虑折腾最初的努力和重新标准化这个输出。
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;
我同意马克。 我将输出设置为文本模式,然后将sp_HelpText设置为“sproc”。 我把这个绑定到了Crtl-F1上,以方便使用。
使用下面的select语句来获得所有的全部定义:
select ROUTINE_DEFINITION from INFORMATION_SCHEMA.ROUTINES Where ROUTINE_NAME='someprocname'
我的猜测是SSMS和其他工具读出来,并在必要时进行更改,例如将CREATE更改为ALTER。 据我所知SQL存储不是程序的其他表示
数据库发布向导可以从命令行转储架构(和其他对象)。
我只想指出,不是使用查找和replace来改变创build过程来改变过程,你也可以使用一个下拉,你可以把它放在最上面,它确实需要文本search。
IF exists (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_name') and type in ('P','V') --procedure or view ) DROP sp_name GO
如果你确定它在那里,我想你可以放弃它,但我不会build议。 不要忘了,因为创build过程必须是批处理中的第一个也是唯一的语句。
或者懒惰的方法:
IF OBJECT_ID(N'sp_name') is not null DROP sp_name GO
要改变一个存储过程,这里是C#代码:
SqlConnection con = new SqlConnection("your connection string"); con.Open(); cmd.CommandType = System.Data.CommandType.Text; string sql = File.ReadAllText(YUOR_SP_SCRIPT_FILENAME); cmd.CommandText = sql; cmd.Connection = con; cmd.ExecuteNonQuery(); con.Close();
注意事项:
- 确保连接string中的USER有权修改SP
- 从脚本文件中删除所有
GO,SET ANSI_NULLS XX,SET QUOTED_IDENTIFIER
语句。 (如果你不这样做,SqlCommand会抛出一个错误)。