<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://vstoolsforum.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>SQL Server (T-SQL) : text file</title><link>http://vstoolsforum.com/blogs/sqlserver/archive/tags/text+file/default.aspx</link><description>Tags: text file</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP2 (Build: 20611.960)</generator><item><title>Send the Contents of all the Stored Procedures, Triggers, and Functions to a Text File</title><link>http://vstoolsforum.com/blogs/sqlserver/archive/2007/03/24/send-the-contents-of-all-the-stored-procedures-triggers-and-functions-to-a-text-file.aspx</link><pubDate>Sat, 24 Mar 2007 20:39:00 GMT</pubDate><guid isPermaLink="false">05d3ee43-09e1-4c21-9d53-64ecaf1acc4f:181</guid><dc:creator>steve gray</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://vstoolsforum.com/blogs/sqlserver/rsscomments.aspx?PostID=181</wfw:commentRss><comments>http://vstoolsforum.com/blogs/sqlserver/archive/2007/03/24/send-the-contents-of-all-the-stored-procedures-triggers-and-functions-to-a-text-file.aspx#comments</comments><description>&lt;p&gt;This script will send the contents of all the Stored Procedures, Functions, and Triggers in a database to a text file. In fact, it will send any object that can be found in SELECT * FROM SYSOBJECTS&lt;/p&gt;
&lt;p&gt;Why is that useful? For me, it&amp;#39;s indispensible. The Dynamics GP database (Microsoft&amp;#39;s accounting package) that I work in has north of&amp;nbsp;34000 objects. If I change something, or need to know where a reference is, or the boss wants to know what stored procedure is deleting the sales orders every night, I have to play hide-and-go-seek through all the scripts. &lt;/p&gt;
&lt;p&gt;What if someone proposes changing the name of a database field? Having the text of all my object in one file enables me to find all occurances of a field name in any of my scripts. Woo-Ha! Now I know the name of the stored proc or trigger that I have to change. &lt;/p&gt;
&lt;p&gt;In the past I would just right click on the server name in Enterprise Manager, and choose &amp;#39;Generate Scripts&amp;#39;. That gave me exactly what I needed, but in a database this size it took almost an hour. This script runs in about a minute. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;Additionally, it gives me a history. If I run this periodically, I am able to search past versions quickly and see what I changed.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;I&amp;#39;m not going to go into detail about how it works, but I&amp;#39;d be happy to if anyone shows an interest. Just drop me a line. &lt;/p&gt;
&lt;p&gt;If you get ole automation errors, run this script first.&lt;/p&gt;
&lt;p&gt;sp_configure &amp;#39;show advanced options&amp;#39;, 1;&lt;br /&gt;GO&lt;br /&gt;RECONFIGURE;&lt;br /&gt;GO&lt;br /&gt;sp_configure &amp;#39;Ole Automation Procedures&amp;#39;, 1;&lt;br /&gt;GO&lt;br /&gt;RECONFIGURE;&lt;br /&gt;GO&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;As always, comments are welcome.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;IF EXISTS (SELECT name &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM&amp;nbsp;&amp;nbsp; sysobjects &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE&amp;nbsp; name = N&amp;#39;_4P_dbText1&amp;#39; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND &amp;nbsp;&amp;nbsp; type = &amp;#39;P&amp;#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DROP PROCEDURE _4P_dbText1&lt;br /&gt;GO&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;CREATE PROCEDURE _4P_dbText1 &lt;br /&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;font face="courier new,courier"&gt;AS&lt;br /&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;DECLARE &lt;br /&gt;&amp;nbsp;@vchrFile VARCHAR(1000) ,&lt;br /&gt;&amp;nbsp;@vchrFileID INT ,&lt;br /&gt;&amp;nbsp;@FS INT ,&lt;br /&gt;&amp;nbsp;@RC INT ,&lt;br /&gt;&amp;nbsp;@vchrStoredProcName varchar(8000),&lt;br /&gt;&amp;nbsp;@vchrChar varchar(1),&amp;nbsp;&amp;nbsp; -- holds the current character that we are evaluating&lt;br /&gt;&amp;nbsp;@vchrLine varchar(8000),-- holds the line that we are about to print&lt;br /&gt;&amp;nbsp;@intPos int,&lt;br /&gt;&amp;nbsp;@vchrPrevChar varchar(1),&lt;br /&gt;&amp;nbsp;@intAscii int,&lt;br /&gt;&amp;nbsp;@intPrevAscii int,&lt;br /&gt;&amp;nbsp;@vchrSysCommentText varchar(8000)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;--initialize&lt;br /&gt;&lt;br /&gt;SET @vchrFile = &amp;#39;\\ngb-sql-03\c$\export.txt&amp;#39;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;font face="courier new,courier"&gt;--===================================================================================&lt;br /&gt;-- open the output file&lt;br /&gt;--===================================================================================&lt;br /&gt;EXEC @RC = sp_OACreate &amp;#39;Scripting.FileSystemObject&amp;#39;, @FS OUT&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;IF @RC &amp;lt;&amp;gt; 0&lt;br /&gt;&amp;nbsp;PRINT &amp;#39;Error:&amp;nbsp; Creating the file system object&amp;#39;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;-- Opens the file specified by the @vchrFile input parameter&lt;br /&gt;EXEC @RC = sp_OAMethod @FS , &amp;#39;OpenTextFile&amp;#39; , @vchrFileID OUT , @vchrFile , 8 , 1&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;-- Prints error if non 0 return code during sp_OAMethod OpenTextFile execution &lt;br /&gt;IF @RC &amp;lt;&amp;gt; 0 &lt;br /&gt;&amp;nbsp;PRINT &amp;#39;Error:&amp;nbsp; Opening the specified text file&amp;#39;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;--===================================================================================&lt;br /&gt;--gather data on stored procedure into table _dbText&lt;br /&gt;--===================================================================================&lt;br /&gt;DECLARE curStoredProcs CURSOR KEYSET FOR &lt;br /&gt;&amp;nbsp;SELECT Name from sysobjects &lt;br /&gt;&amp;nbsp;&amp;nbsp;where [name] like &amp;#39;_4P%&amp;#39; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;or [name] like &amp;#39;f%&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;or [name] like &amp;#39;sp%&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;or [name] like &amp;#39;t_4p%&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;order by Name&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;OPEN curStoredProcs&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;FETCH NEXT FROM curStoredProcs INTO @vchrStoredProcName&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;WHILE (@@fetch_status = 0) BEGIN&lt;br /&gt;&amp;nbsp;set @vchrLine = &amp;#39;####################################################################&amp;#39; &lt;br /&gt;&amp;nbsp;EXEC @RC = sp_OAMethod @vchrFileID, &amp;#39;WriteLine&amp;#39;, Null , @vchrLine&lt;br /&gt;&amp;nbsp;IF @RC &amp;lt;&amp;gt; 0 PRINT &amp;#39;Error:&amp;nbsp; Writing string data to file&amp;#39;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp;set @vchrLine = &amp;#39;&amp;#39; &lt;br /&gt;&amp;nbsp;EXEC @RC = sp_OAMethod @vchrFileID, &amp;#39;WriteLine&amp;#39;, Null , @vchrLine&lt;br /&gt;&amp;nbsp;IF @RC &amp;lt;&amp;gt; 0 PRINT &amp;#39;Error:&amp;nbsp; Writing string data to file&amp;#39;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp;set @vchrLine = @vchrStoredProcName &lt;br /&gt;&amp;nbsp;EXEC @RC = sp_OAMethod @vchrFileID, &amp;#39;WriteLine&amp;#39;, Null , @vchrLine&lt;br /&gt;&amp;nbsp;IF @RC &amp;lt;&amp;gt; 0 PRINT &amp;#39;Error:&amp;nbsp; Writing string data to file&amp;#39;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp;set @vchrLine = &amp;#39;&amp;#39; &lt;br /&gt;&amp;nbsp;EXEC @RC = sp_OAMethod @vchrFileID, &amp;#39;WriteLine&amp;#39;, Null , @vchrLine&lt;br /&gt;&amp;nbsp;IF @RC &amp;lt;&amp;gt; 0 PRINT &amp;#39;Error:&amp;nbsp; Writing string data to file&amp;#39;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp;set @vchrLine = &amp;#39;####################################################################&amp;#39; &lt;br /&gt;&amp;nbsp;EXEC @RC = sp_OAMethod @vchrFileID, &amp;#39;WriteLine&amp;#39;, Null , @vchrLine&lt;br /&gt;&amp;nbsp;IF @RC &amp;lt;&amp;gt; 0 PRINT &amp;#39;Error:&amp;nbsp; Writing string data to file&amp;#39;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;--initialize&lt;br /&gt;&amp;nbsp;select &lt;br /&gt;&amp;nbsp;&amp;nbsp;@vchrLine = &amp;#39;&amp;#39;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;@vchrPrevChar = &amp;#39;&amp;#39;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp;-- =============================================&lt;br /&gt;&amp;nbsp;-- loop through one stored proc&lt;br /&gt;&amp;nbsp;-- =============================================&lt;br /&gt;&amp;nbsp;DECLARE curComments&amp;nbsp; CURSOR LOCAL FOR &lt;br /&gt;&amp;nbsp;&amp;nbsp;SELECT [text] FROM syscomments WHERE id = OBJECT_ID(@vchrStoredProcName) and encrypted = 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ORDER BY number, colid&lt;br /&gt;&amp;nbsp;&amp;nbsp;FOR READ ONLY&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;OPEN curComments&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;FETCH NEXT FROM curComments into @vchrSysCommentText&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;--loop through the lines in the syscomments table. &lt;br /&gt;&amp;nbsp;--there can be one or many for the stored proc, &lt;br /&gt;&amp;nbsp;--many stored proc lines can be on one syscomments line&lt;br /&gt;&amp;nbsp;WHILE @@fetch_status &amp;gt;= 0&lt;br /&gt;&amp;nbsp;BEGIN&lt;br /&gt;&amp;nbsp;&amp;nbsp;--initialize&lt;br /&gt;&amp;nbsp;&amp;nbsp;select &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;@intPos = 1&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHILE @intPos&amp;nbsp; &amp;lt;&amp;gt; len(@vchrSysCommentText) BEGIN&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;select @vchrChar = substring(@vchrSysCommentText,@intPos,1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;select @intAscii = ascii(@vchrChar)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if not (@intAscii = 13 or @intAscii = 10)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select @vchrLine = @vchrLine + @vchrChar&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;--if we encounter a line feed...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if @intAscii in (10,13) and @intPrevAscii in (10,13) begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--output a line and clear the line buffer&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Appends the string value line to the file specified by the @vchrFile input parameter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EXEC @RC = sp_OAMethod @vchrFileID, &amp;#39;WriteLine&amp;#39;, Null , @vchrLine&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Prints error if non 0 return code during sp_OAMethod WriteLine execution&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IF @RC &amp;lt;&amp;gt; 0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PRINT &amp;#39;Error:&amp;nbsp; Writing string data to file&amp;#39;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select @vchrLine = &amp;#39;&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;select @intPos = @intPos + 1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@vchrPrevChar = @vchrChar,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@intPrevAscii = @intAscii&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;FETCH NEXT FROM curComments into @vchrSysCommentText&lt;br /&gt;&amp;nbsp;END&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp;CLOSE curComments&lt;br /&gt;&amp;nbsp;DEALLOCATE curComments&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp;set @vchrLine = &amp;#39;&amp;#39; &lt;br /&gt;&amp;nbsp;EXEC @RC = sp_OAMethod @vchrFileID, &amp;#39;WriteLine&amp;#39;, Null , @vchrLine&lt;br /&gt;&amp;nbsp;IF @RC &amp;lt;&amp;gt; 0 PRINT &amp;#39;Error:&amp;nbsp; Writing string data to file&amp;#39;&lt;br /&gt;&amp;nbsp;set @vchrLine = &amp;#39;&amp;#39; &lt;br /&gt;&amp;nbsp;EXEC @RC = sp_OAMethod @vchrFileID, &amp;#39;WriteLine&amp;#39;, Null , @vchrLine&lt;br /&gt;&amp;nbsp;IF @RC &amp;lt;&amp;gt; 0 PRINT &amp;#39;Error:&amp;nbsp; Writing string data to file&amp;#39;&lt;br /&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp;FETCH NEXT FROM curStoredProcs INTO @vchrStoredProcName&lt;br /&gt;END&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;CLOSE curStoredProcs&lt;br /&gt;DEALLOCATE curStoredProcs&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;EXECUTE @RC = sp_OADestroy @vchrFileID&lt;br /&gt;EXECUTE @RC = sp_OADestroy @FS&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;go&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="courier new,courier"&gt;grant all on _4P_dbText1 to public&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://vstoolsforum.com/aggbug.aspx?PostID=181" width="1" height="1"&gt;</description><category domain="http://vstoolsforum.com/blogs/sqlserver/archive/tags/sp_5F00_OAMethod/default.aspx">sp_OAMethod</category><category domain="http://vstoolsforum.com/blogs/sqlserver/archive/tags/sp_5F00_OACreate/default.aspx">sp_OACreate</category><category domain="http://vstoolsforum.com/blogs/sqlserver/archive/tags/sysobjects/default.aspx">sysobjects</category><category domain="http://vstoolsforum.com/blogs/sqlserver/archive/tags/text+file/default.aspx">text file</category></item></channel></rss>