<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlblog.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>Denis Gobo : logging</title><link>http://sqlblog.com/blogs/denis_gobo/archive/tags/logging/default.aspx</link><description>Tags: logging</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>How to log when a function is called?</title><link>http://sqlblog.com/blogs/denis_gobo/archive/2008/05/08/6703.aspx</link><pubDate>Thu, 08 May 2008 17:25:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:6703</guid><dc:creator>Denis Gobo</dc:creator><slash:comments>3</slash:comments><comments>http://sqlblog.com/blogs/denis_gobo/comments/6703.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/denis_gobo/commentrss.aspx?PostID=6703</wfw:commentRss><wfw:comment>http://sqlblog.com/blogs/denis_gobo/rsscomments.aspx?PostID=6703</wfw:comment><description>&lt;P&gt;This &lt;A class="" href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3311966&amp;amp;SiteID=1"&gt;question&lt;/A&gt; came up today and here is one way of doing it. It requires running xp_cmdshell so this is probably not such a good idea.&lt;BR&gt;The problem with functions is that you cannot just insert into any table. INSERT, UPDATE, and DELETE statements modifying table variables local to the function.&lt;BR&gt;EXECUTE statements calling an extended stored procedures are allowed. &lt;BR&gt;So with this in mind we know that we can call xp_cmdshell, from xp_cmdshell we can use osql&lt;BR&gt;Let's take a look&lt;BR&gt;We will be using tempdb &lt;BR&gt;&lt;BR&gt;&lt;FONT color=#008000 size=2&gt;&amp;nbsp;&lt;BR&gt;--Create the table&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;USE&lt;/FONT&gt;&lt;FONT size=2&gt; tempdb&lt;BR&gt;go&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;CREATE&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;TABLE&lt;/FONT&gt;&lt;FONT size=2&gt; LogMeNow &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT size=2&gt;SomeValue &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;varchar&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT size=2&gt;50&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;),&lt;/FONT&gt;&lt;FONT size=2&gt; SomeDate &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;datetime&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;default&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff00ff size=2&gt;getdate&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;())&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;go&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;--Here is the proc&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;CREATE&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;PROC&lt;/FONT&gt;&lt;FONT size=2&gt; prLog &lt;BR&gt;@SomeValue &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;varchar&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT size=2&gt;50&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;)&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;AS&lt;BR&gt;INSERT&lt;/FONT&gt;&lt;FONT size=2&gt; LogMeNow &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT size=2&gt;SomeValue&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;)&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;VALUES&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT size=2&gt;@SomeValue&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;)&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;go&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;--And here is the function&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;CREATE&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;FUNCTION&lt;/FONT&gt;&lt;FONT size=2&gt; fnBla&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT size=2&gt;@id &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;int&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;)&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;RETURNS&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;int&lt;BR&gt;AS&lt;BR&gt;BEGIN&lt;BR&gt;DECLARE&lt;/FONT&gt;&lt;FONT size=2&gt; @SQL &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;varchar&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT size=2&gt;500&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;)&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;SELECT&lt;/FONT&gt;&lt;FONT size=2&gt; @SQL &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;=&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;'osql -S'&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;+&lt;/FONT&gt;&lt;FONT color=#ff00ff size=2&gt;@@servername&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;+&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;' -E -q "exec tempdb..prLog ''fnBla''"'&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;EXEC&lt;/FONT&gt;&lt;FONT size=2&gt; master&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;..&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;xp_cmdshell&lt;/FONT&gt;&lt;FONT size=2&gt; @SQL&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;RETURN&lt;/FONT&gt;&lt;FONT size=2&gt; @id&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;END&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;Now call the function a couple of times&lt;BR&gt;&lt;FONT color=#0000ff size=2&gt;&lt;BR&gt;SELECT&lt;/FONT&gt;&lt;FONT size=2&gt; dbo&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;.&lt;/FONT&gt;&lt;FONT size=2&gt;fnBla&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT size=2&gt;1&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;)&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;SELECT&lt;/FONT&gt;&lt;FONT size=2&gt; dbo&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;.&lt;/FONT&gt;&lt;FONT size=2&gt;fnBla&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT size=2&gt;2&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;)&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;SELECT&lt;/FONT&gt;&lt;FONT size=2&gt; dbo&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;.&lt;/FONT&gt;&lt;FONT size=2&gt;fnBla&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT size=2&gt;4&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;)&lt;/FONT&gt;&lt;/P&gt;&lt;FONT color=#808080 size=2&gt;
&lt;P&gt;&lt;BR&gt;&lt;/FONT&gt;And look inside the table&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT color=#0000ff size=2&gt;SELECT&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;*&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;FROM&lt;/FONT&gt;&lt;FONT size=2&gt; LogMeNow&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;What if you were to run this?&lt;/P&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;SELECT&lt;/FONT&gt;&lt;FONT size=2&gt; dbo&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;.&lt;/FONT&gt;&lt;FONT size=2&gt;fnBla&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;FONT size=2&gt;4&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;),*&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;FROM &lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;sys.sysobjects&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;See the problem? The function will be called for &lt;STRONG&gt;every&lt;/STRONG&gt; row, if you have a big table this can be &lt;STRONG&gt;problematic&lt;/STRONG&gt;!!!!!!!!&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;BR&gt;&lt;/FONT&gt;I tested this on SQL 2000 and on SQL 2005(including a named instance). So there you have it, this is one way. does it smell kludgy and do I feel somewhat dirty now? yes it does indeed :-(&lt;BR&gt;&lt;/P&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=6703" width="1" height="1"&gt;</description><category domain="http://sqlblog.com/blogs/denis_gobo/archive/tags/Functions/default.aspx">Functions</category><category domain="http://sqlblog.com/blogs/denis_gobo/archive/tags/logging/default.aspx">logging</category><category domain="http://sqlblog.com/blogs/denis_gobo/archive/tags/Tips+and+Tricks/default.aspx">Tips and Tricks</category></item></channel></rss>