<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>T-SQL Archives | SQL Solutions Group</title>
	<atom:link href="https://sqlsolutionsgroup.com/tag/t-sql/feed/" rel="self" type="application/rss+xml" />
	<link>https://sqlsolutionsgroup.com/tag/t-sql/</link>
	<description></description>
	<lastBuildDate>Fri, 10 Feb 2023 22:34:24 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://sqlsolutionsgroup.com/wp-content/uploads/2021/01/cropped-SSG_FAVICON0002-32x32.png</url>
	<title>T-SQL Archives | SQL Solutions Group</title>
	<link>https://sqlsolutionsgroup.com/tag/t-sql/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>T-SQL Tips and Solutions, Part 1</title>
		<link>https://sqlsolutionsgroup.com/t-sql-tips/</link>
					<comments>https://sqlsolutionsgroup.com/t-sql-tips/#comments</comments>
		
		<dc:creator><![CDATA[Jared Kirkpatrick]]></dc:creator>
		<pubDate>Thu, 13 May 2021 07:23:00 +0000</pubDate>
				<category><![CDATA[SQL Group]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[#microsftcertifedmaster]]></category>
		<category><![CDATA[#microsftpartner]]></category>
		<category><![CDATA[#SQLAB]]></category>
		<category><![CDATA[#SQlatino]]></category>
		<category><![CDATA[#SQlatinoamerica]]></category>
		<category><![CDATA[#sqldatabase]]></category>
		<category><![CDATA[#sqldeveloper]]></category>
		<category><![CDATA[#SQLgroupie]]></category>
		<category><![CDATA[#sqlimer]]></category>
		<category><![CDATA[#sqlimerbymay]]></category>
		<category><![CDATA[#sqlinjection]]></category>
		<category><![CDATA[#sqlinternals]]></category>
		<category><![CDATA[#sqlite]]></category>
		<category><![CDATA[#sqlite3]]></category>
		<category><![CDATA[#SQLLearning]]></category>
		<category><![CDATA[#SQLMagazine]]></category>
		<category><![CDATA[#sqlmanagementstudio]]></category>
		<category><![CDATA[#sqlmanager]]></category>
		<category><![CDATA[#Sqlmap]]></category>
		<category><![CDATA[#sqlrun]]></category>
		<category><![CDATA[#sqlsaturday2017]]></category>
		<category><![CDATA[#sqlsatvienna]]></category>
		<category><![CDATA[#sqlserver]]></category>
		<category><![CDATA[#SQLserver2012]]></category>
		<category><![CDATA[#sqlserver2014]]></category>
		<category><![CDATA[#sqlserver2017]]></category>
		<category><![CDATA[#sqlserver2022]]></category>
		<category><![CDATA[#SQLServeronLinux]]></category>
		<category><![CDATA[#SQLsolutionsgroup]]></category>
		<category><![CDATA[#SQLTraining]]></category>
		<category><![CDATA[#SQLYog]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQLPASS]]></category>
		<category><![CDATA[SQLSaturday]]></category>
		<category><![CDATA[SSG]]></category>
		<category><![CDATA[T-SQL]]></category>
		<category><![CDATA[tips]]></category>
		<guid isPermaLink="false">https://sqlsolutionsgroup.com/?p=6394</guid>

					<description><![CDATA[<p>When writing T-SQL code, I find there are certain routines I do over and over again. Like, inserting data into a table, creating temp tables, or searching tables for columns needed in a Join statement. At times like these, it&#8217;s good to use T-SQL tips to make my job easier. The small, simple ones are pretty [&#8230;]</p>
<p>The post <a href="https://sqlsolutionsgroup.com/t-sql-tips/">T-SQL Tips and Solutions, Part 1</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>When writing T-SQL code, I find there are certain routines I do over and over again. Like, inserting data into a table, creating temp tables, or searching tables for columns needed in a Join statement. At times like these, it&#8217;s good to use T-SQL tips to make my job easier. The small, simple ones are pretty easy, like inserting data into two or three columns of a table structure that allows all columns to be NULL. In these cases I usually just manually write an insert statement like this one:</p>



<pre class="wp-block-code"><code class="language-sql" lang="sql"> -- Create the Table
 CREATE TABLE A1
 (
   Column1   [INT] IDENTITY(1,1) NOT NULL
  ,Column2   [Varchar](100)      NULL
  ,Column3   [Varchar](100)      NULL
  ,Column4   [Varchar](100)      NULL
  ,Column5   [Varchar](100)      NULL
  ,Column6   [Varchar](100)      NULL
  ,Column7   [Varchar](100)      NULL
  ,Column8   [Varchar](100)      NULL
  ,Column9   [Varchar](100)      NULL
  ,Column10  [Varchar](100)      NULL
  ,Column11  [Varchar](100)      NULL
  ,Column12  [Varchar](100)     NULL
  ,Column13  [Varchar](100)     NULL
  ,Column14  [Varchar](100)     NULL
  ,Column15  [Varchar](100)     NULL
 );
  
  
 --Insert the data
 INSERT A1
 ([Column2], [Column3])
 SELECT 'Column2 data row 1', 'Column3 data row 1'
 UNION
 SELECT 'Column2 data row 2', 'Column3 data row 2'
 UNION
 SELECT 'Column2 data row 3', 'Column3 data row 3';
  
  
 --Select the data as a result set
 SELECT * FROM A1
  
  
 --Drop the table A1
 DROP TABLE A1; </code></pre>



<p>&nbsp;</p>



<p>And the result set is shown below:</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="600" class="wp-image-6396" src="https://sqlsolutionsgroup.com/wp-content/uploads/2021/05/Tsql_tips1-1024x600.png" alt="" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2021/05/Tsql_tips1-1024x600.png 1024w, https://sqlsolutionsgroup.com/wp-content/uploads/2021/05/Tsql_tips1-300x176.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2021/05/Tsql_tips1-768x450.png 768w, https://sqlsolutionsgroup.com/wp-content/uploads/2021/05/Tsql_tips1.png 1381w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong><em>No</em></strong>, the union select to get multiple rows in a single statement is <strong>NOT</strong> the tip. This is the easy way of inserting into a table where you only have to define two or three columns. But what if we have a different scenario? What if we imported a table exactly like A1 from Server SQLServer01 and we need to copy all the data from the source where column13 = ‘Important’? </p>



<p>Now we have to create the table again. Set Identity_Insert on for A1, write out the 15 columns in the Insert list, and then copy those columns or write them out again in the select statement. At this point, I like to use a variable that will concatenate the columns for me. I select it out, and then copy and paste the column list instead of typing it out. This comes in handy if you are inserting or creating a number of tables in a stored proc development effort).</p>



<p>First we will create our table again:</p>



<pre class="wp-block-code"><code class="language-sql" lang="sql">USE SSG;
 GO
 -- Create the Table
 CREATE TABLE A1
 (
   Column1   [INT] IDENTITY(1,1) NOT NULL
  ,Column2   <a href="100">Varchar</a>      NULL
  ,Column3   <a href="100">Varchar</a>      NULL
  ,Column4   <a href="100">Varchar</a>      NULL
  ,Column5   <a href="100">Varchar</a>      NULL
  ,Column6   <a href="100">Varchar</a>      NULL
  ,Column7   <a href="100">Varchar</a>      NULL
  ,Column8   <a href="100">Varchar</a>      NULL
  ,Column9   <a href="100">Varchar</a>      NULL
  ,Column10  <a href="100">Varchar</a>      NULL
  ,Column11  <a href="100">Varchar</a>      NULL
  ,Column12  <a href="100">Varchar</a>     NULL
  ,Column13  <a href="100">Varchar</a>     NULL
  ,Column14  <a href="100">Varchar</a>     NULL
  ,Column15  <a href="100">Varchar</a>     NULL
 );</code></pre>



<p>&nbsp;</p>



<p>We can look at the table definition by looking at the INFORMATION_SCHEMA.COLUMNS table like so:</p>



<pre class="wp-block-code"><code class="language-sql" lang="sql">SELECT *
   FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_NAME = 'A1';</code></pre>



<p>&nbsp;</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="442" class="wp-image-6397" src="https://sqlsolutionsgroup.com/wp-content/uploads/2021/05/Tsql_tips2-1024x442.png" alt="T-SQL Tips" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2021/05/Tsql_tips2-1024x442.png 1024w, https://sqlsolutionsgroup.com/wp-content/uploads/2021/05/Tsql_tips2-300x129.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2021/05/Tsql_tips2-768x331.png 768w, https://sqlsolutionsgroup.com/wp-content/uploads/2021/05/Tsql_tips2.png 1379w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Next we will declare a variable, initialize it as blank in the declare statement, and then use the variable to select from the INFORMATION_SCHEMA.COLUMNS table as shown below:</p>



<pre class="wp-block-code"><code class="language-sql" lang="sql">DECLARE @v_ColumnList  <a href="MAX">VARCHAR</a> = '';
 SELECT @v_ColumnList = @v_ColumnList + '[' + COLUMN_NAME + '], '
     FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_NAME = 'A1'
  ORDER BY [ORDINAL_POSITION];
 SELECT @v_ColumnList;</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="180" class="wp-image-6398" src="https://sqlsolutionsgroup.com/wp-content/uploads/2021/05/Tsql_tips3-1024x180.png" alt="" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2021/05/Tsql_tips3-1024x180.png 1024w, https://sqlsolutionsgroup.com/wp-content/uploads/2021/05/Tsql_tips3-300x53.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2021/05/Tsql_tips3-768x135.png 768w, https://sqlsolutionsgroup.com/wp-content/uploads/2021/05/Tsql_tips3.png 1361w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Now I copy the result set and paste it into my insert list and my select criteria after I remove the last comma. In this solution we imported the A1 table into SQLServer02 from SQLServer01 and named the imported table A1_From_SS01. The tip solution looks like:</p>



<pre class="wp-block-code"><code class="language-sql" lang="sql">USE SSG;
 GO
 -- Create the Table
 CREATE TABLE A1
 (
   Column1   [INT] IDENTITY(1,1) NOT NULL
  ,Column2   <a href="100">Varchar</a>      NULL
  ,Column3   <a href="100">Varchar</a>      NULL
  ,Column4   <a href="100">Varchar</a>      NULL
  ,Column5   <a href="100">Varchar</a>      NULL
  ,Column6   <a href="100">Varchar</a>      NULL
  ,Column7   <a href="100">Varchar</a>      NULL
  ,Column8   <a href="100">Varchar</a>      NULL
  ,Column9   <a href="100">Varchar</a>      NULL
  ,Column10  <a href="100">Varchar</a>      NULL
  ,Column11  <a href="100">Varchar</a>      NULL
  ,Column12  <a href="100">Varchar</a>     NULL
  ,Column13  <a href="100">Varchar</a>     NULL
  ,Column14  <a href="100">Varchar</a>     NULL
  ,Column15  <a href="100">Varchar</a>     NULL
 );
 -- Get the column list so you do not have to write it out
 DECLARE @v_ColumnList  <a href="MAX">VARCHAR</a> = '';
 SELECT @v_ColumnList = @v_ColumnList + '[' + COLUMN_NAME + '], '
     FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_NAME = 'A1'
  ORDER BY [ORDINAL_POSITION];
 --Select the data as a result set
 SELECT * FROM A1
 SET IDENTITY_INSERT A1 ON
 --Insert the data
 INSERT A1
 (      [Column1], [Column2], [Column3], [Column4], [Column5], [Column6], [Column7], [Column8], [Column9], [Column10], [Column11], [Column12], [Column13], [Column14], [Column15])
 SELECT [Column1], [Column2], [Column3], [Column4], [Column5], [Column6], [Column7], [Column8], [Column9], [Column10], [Column11], [Column12], [Column13], [Column14], [Column15]
   FROM A1_From_SS01
  WHERE [Column13] = 'Important';</code></pre>



<p>&nbsp;</p>



<h3 class="wp-block-heading">Summary</h3>



<p>In review, the T-SQL tip is the concatenation of the table structure within a select statement that is then just printed or selected from the variable. This in turn is copied and pasted where you need the Column list in your code. This has saved me countless time and illuminated frustration just by eliminating a simple mundane task. We&#8217;ll share more T-SQL tips again soon.</p>
<p>The post <a href="https://sqlsolutionsgroup.com/t-sql-tips/">T-SQL Tips and Solutions, Part 1</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlsolutionsgroup.com/t-sql-tips/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>T-SQL Anti-Patterns: SQL User Defined Functions (UDFs) that turn your set operation into a cursor</title>
		<link>https://sqlsolutionsgroup.com/t-sql-anti-patterns-user-defined-functions/</link>
					<comments>https://sqlsolutionsgroup.com/t-sql-anti-patterns-user-defined-functions/#respond</comments>
		
		<dc:creator><![CDATA[Randy Knight]]></dc:creator>
		<pubDate>Wed, 03 Mar 2021 01:58:09 +0000</pubDate>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[#microsftcertifedmaster]]></category>
		<category><![CDATA[#microsftpartner]]></category>
		<category><![CDATA[#SQLAB]]></category>
		<category><![CDATA[#SQlatino]]></category>
		<category><![CDATA[#SQlatinoamerica]]></category>
		<category><![CDATA[#sqldatabase]]></category>
		<category><![CDATA[#sqldeveloper]]></category>
		<category><![CDATA[#SQLgroupie]]></category>
		<category><![CDATA[#sqlimer]]></category>
		<category><![CDATA[#sqlimerbymay]]></category>
		<category><![CDATA[#sqlinjection]]></category>
		<category><![CDATA[#sqlinternals]]></category>
		<category><![CDATA[#sqlite]]></category>
		<category><![CDATA[#sqlite3]]></category>
		<category><![CDATA[#SQLLearning]]></category>
		<category><![CDATA[#SQLMagazine]]></category>
		<category><![CDATA[#sqlmanagementstudio]]></category>
		<category><![CDATA[#sqlmanager]]></category>
		<category><![CDATA[#Sqlmap]]></category>
		<category><![CDATA[#sqlrun]]></category>
		<category><![CDATA[#sqlsaturday2017]]></category>
		<category><![CDATA[#sqlsatvienna]]></category>
		<category><![CDATA[#sqlserver]]></category>
		<category><![CDATA[#SQLserver2012]]></category>
		<category><![CDATA[#sqlserver2014]]></category>
		<category><![CDATA[#sqlserver2017]]></category>
		<category><![CDATA[#sqlserver2022]]></category>
		<category><![CDATA[#SQLServeronLinux]]></category>
		<category><![CDATA[#SQLsolutionsgroup]]></category>
		<category><![CDATA[#SQLTraining]]></category>
		<category><![CDATA[#SQLYog]]></category>
		<category><![CDATA[set operations]]></category>
		<category><![CDATA[SQLPASS]]></category>
		<category><![CDATA[SQLSaturday]]></category>
		<category><![CDATA[SSG]]></category>
		<category><![CDATA[T-SQL]]></category>
		<guid isPermaLink="false">https://sqlsolutionsgroup.com/?p=6208</guid>

					<description><![CDATA[<p>One of the things we see as consultants are consistent patterns of behavior by T-SQL developers that cause big performance problems. I call these anti-patterns. Today I want to specifically address SQL User Defined Functions (UDFs). SQL Server 2000 introduced UDFs. While they can be useful in certain situations, an all too prevalent anti-pattern has [&#8230;]</p>
<p>The post <a href="https://sqlsolutionsgroup.com/t-sql-anti-patterns-user-defined-functions/">T-SQL Anti-Patterns: SQL User Defined Functions (UDFs) that turn your set operation into a cursor</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>One of the things we see as consultants are consistent patterns of behavior by T-SQL developers that cause big performance problems. I call these anti-patterns. Today I want to specifically address SQL User Defined Functions (UDFs).</p>



<p>SQL Server 2000 introduced UDFs. While they can be useful in certain situations, an all too prevalent anti-pattern has emerged.</p>



<h3 class="wp-block-heading">SQL User Defined Functions: Identifying The Problem</h3>



<p>To illustrate this, let&#8217;s take a simple example from the <strong>AdventureWorks</strong>  sample database. If you don’t have this database, you can <a title="AdventureWorks" href="https://msftdbprodsamples.codeplex.com/" target="_blank" rel="noopener noreferrer">download</a> and install it. This is a good thing to have on your personal development or lab SQL Server instance, as many blogs, books, and articles use it for examples.</p>



<p>In our example, we are going to generate a simple report for the <strong>AdventureWorks</strong> Human Resources department using the following tables.</p>



<figure class="wp-block-image"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2014/10/image.png"><img decoding="async" title="image" src="https://sqlsolutionsgroup.com/wp-content/uploads/2014/10/image_thumb.png" alt="SQL user defined functions" /></a></figure>



<p>Our report will consist of the employee’s name, the department they work in, their job title, and start date. We have a mock-up of the report that the end user would like to see:</p>



<figure class="wp-block-image"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2014/10/image1.png"><img decoding="async" title="image" src="https://sqlsolutionsgroup.com/wp-content/uploads/2014/10/image_thumb1.png" alt="image" /></a></figure>



<p>Taking a look at the schema above, we realize that the <strong>EmployeeDepartmentHistory</strong> table has most of this information. So we start there.</p>



<pre class="wp-block-code"><code class="language-sql line-numbers" lang="sql">SELECT BusinessEntityID AS EmployeeID,
       DepartmentID,
       StartDate
FROM HumanResources.EmployeeDepartmentHistory</code></pre>



<figure class="wp-block-image"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2014/10/image2.png"><img decoding="async" title="image" src="https://sqlsolutionsgroup.com/wp-content/uploads/2014/10/image_thumb2.png" alt="image" /></a></figure>



<p>This gets us the <strong>EmployeeID </strong>and <strong>DepartmentID</strong>, but not the actual names. As developers, we are big into encapsulating code as much as possible to avoid repetitive code and the manageability issues that come with it. We know that UDFs in SQL Server can help with this so we create the following function to get the department name:</p>



<pre class="wp-block-code"><code class="language-sql line-numbers" lang="sql">CREATE FUNCTION dbo.GetDepartment
(
    @DepartmentID INT
)
RETURNS VARCHAR(40)
AS
BEGIN
    DECLARE @ret VARCHAR(40)
    SET @ret =
    (
        SELECT [Name]
        FROM HumanResources.Department
        WHERE DepartmentID = @DepartmentID
    )
    RETURN @ret
END</code></pre>



<p>Now we can execute the same query but call the new function to return the department name.</p>



<pre class="wp-block-code"><code class="language-sql line-numbers" lang="sql">SELECT
     BusinessEntityID AS EmployeeID,
     dbo. GetDepartment(DepartmentID) AS DepartmentName,
     StartDate
 FROM HumanResources. EmployeeDepartmentHistory</code></pre>



<figure class="wp-block-image"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2014/10/image3.png"><img decoding="async" title="image" src="https://sqlsolutionsgroup.com/wp-content/uploads/2014/10/image_thumb3.png" alt="SQL user defined functions" /></a></figure>



<p>That worked great so we do the same thing for <strong>EmployeeName</strong> and <strong>JobTitle</strong>.</p>



<pre class="wp-block-code"><code class="language-sql line-numbers" lang="sql">CREATE FUNCTION dbo. GetEmployeeName(@EmployeeID int)
RETURNS VARCHAR(40)
AS
BEGIN
  DECLARE @ret VARCHAR(40), @ContactID INT 

  --get contactid
  SELECT @ContactID = BusinessEntityID FROM HumanResources. Employee WHERE BusinessEntityID = @EmployeeID

  --get name
  SET @ret = (	SELECT coalesce(FirstName,'') + ' ' + coalesce(MiddleName,'') + ' ' + coalesce(LastName,'')
				FROM Person. Person
				WHERE BusinessEntityID = @ContactID
			  )

  RETURN @ret
END</code></pre>



<pre class="wp-block-code"><code class="language-sql line-numbers" lang="sql">CREATE FUNCTION dbo.GetJobTitle
(
    @EmployeeID INT
)
RETURNS VARCHAR(40)
AS
BEGIN
    DECLARE @ret VARCHAR(40)
    SET @ret =
    (
        SELECT [JobTitle]
        FROM HumanResources.Employee
        WHERE BusinessEntityID = @EmployeeID
    )
    RETURN @ret
END</code></pre>



<p>Executing the query again using the three functions we&#8217;ve created, we get the data we are looking for. We have encapsulated the code into function for re-use in other places, and we avoided those pesky joins. The resulting query is clean and simple. Best of all, this is <strong>a single query</strong> so we’re doing a set operation like our DBA has told us we should do.</p>



<pre class="wp-block-code"><code class="language-sql line-numbers" lang="sql">SELECT
	dbo. GetEmployeeName(BusinessEntityID) as EmployeeName,
	dbo. GetDepartment(DepartmentID) AS DepartmentName,
	dbo. GetJobTitle(BusinessEntityID),
	StartDate
FROM HumanResources. EmployeeDepartmentHistory</code></pre>



<figure class="wp-block-image"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2014/10/image4.png"><img decoding="async" title="image" src="https://sqlsolutionsgroup.com/wp-content/uploads/2014/10/image_thumb4.png" alt="SQL user defined functions" /></a></figure>



<h3 class="wp-block-heading"><strong><em>So what’s the problem?</em></strong></h3>



<p>The problem is that we have unwittingly turned our single query into a loop by introducing these functions. Because the functions are non-deterministic, they have to be called for each row in our result set.</p>



<p>To see this, let’s fire up our old friend SQL Server Profiler, which shows us the actual executing statements and the accompanying resources used. We’ll use the following trace definition to keep things as simple and clean as possible:</p>



<figure class="wp-block-image"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2014/10/image5.png"><img decoding="async" title="image" src="https://sqlsolutionsgroup.com/wp-content/uploads/2014/10/image_thumb5.png" alt="image" /></a></figure>



<p>Let’s execute our query and see what we get.</p>



<pre class="wp-block-code"><code class="language-sql line-numbers" lang="sql">SELECT
	dbo. GetEmployeeName(BusinessEntityID) as EmployeeName,
	dbo. GetDepartment(DepartmentID) AS DepartmentName,
	dbo. GetJobTitle(BusinessEntityID),
	StartDate
FROM HumanResources. EmployeeDepartmentHistory</code></pre>



<figure class="wp-block-image"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2014/10/image6.png"><img decoding="async" title="image" src="https://sqlsolutionsgroup.com/wp-content/uploads/2014/10/image_thumb6.png" alt="image" /></a></figure>



<p>Wait a minute. Our single-statement query just generated 2076 individual SQL Statements, generating a total of 2,672 logical reads. If we look through the profiler results carefully, we can see that each of the three functions was called once for each of the 296 rows our query returned. So what looks like a simple set operation <strong>is, in fact, a loop</strong>.</p>



<p>We go to our DBA for help and she explains that we need to get rid of the functions and use joins instead to make it into a true set operation. So we refactor the query as follows:</p>



<pre class="wp-block-code"><code class="language-sql line-numbers" lang="sql">SELECT
	COALESCE(c. FirstName,'') + ' ' + coalesce(c. MiddleName,'') + ' ' + coalesce(c. LastName,'') AS EmployeeName,
	d. name AS DepartmentName,
	e. JobTitle,
	StartDate
FROM HumanResources. EmployeeDepartmentHistory eh
	INNER JOIN HumanResources. Department d ON eh. DepartmentID = d. DepartmentID
	INNER JOIN HumanResources. Employee e ON e. BusinessEntityID = eh. BusinessEntityID
	INNER JOIN Person. Person c ON c. BusinessEntityID = e. BusinessEntityID</code></pre>



<figure class="wp-block-image"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2014/10/image7.png"><img decoding="async" title="image" src="https://sqlsolutionsgroup.com/wp-content/uploads/2014/10/image_thumb7.png" alt="image" /></a></figure>



<p>Now if we execute the query and look at the profiler trace, we get just a single statement for a total of 1032 logical reads. Our query has become much more complicated and we don’t have the benefit of code encapsulation, but we&#8217;ve got the logical reads to less than half. And that was for only 296 rows.</p>



<figure class="wp-block-image is-resized"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2014/10/image8.png"><img loading="lazy" decoding="async" title="image" src="https://sqlsolutionsgroup.com/wp-content/uploads/2014/10/image_thumb8.png" alt="SQL user defined functions" width="628" height="52" /></a></figure>



<h3 class="wp-block-heading">Conclusion</h3>



<p>This is a simple example, but hopefully you can see the impact in a busy system with lots more data. I have seen this in production environments where something like <strong>GetCustomerName()</strong> is being called tens of millions of times <strong><em>daily</em></strong>.  This is a great example of an anti-pattern, where SQL user defined functions look like a great idea but the performance impact can be devastating.</p>
<p>The post <a href="https://sqlsolutionsgroup.com/t-sql-anti-patterns-user-defined-functions/">T-SQL Anti-Patterns: SQL User Defined Functions (UDFs) that turn your set operation into a cursor</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlsolutionsgroup.com/t-sql-anti-patterns-user-defined-functions/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Working with the registry in SQL Server</title>
		<link>https://sqlsolutionsgroup.com/working-registry-sql-server/</link>
					<comments>https://sqlsolutionsgroup.com/working-registry-sql-server/#comments</comments>
		
		<dc:creator><![CDATA[Wayne Sheffield]]></dc:creator>
		<pubDate>Thu, 02 Apr 2020 15:16:00 +0000</pubDate>
				<category><![CDATA[SQL Group]]></category>
		<category><![CDATA[#microsftcertifedmaster]]></category>
		<category><![CDATA[#microsftpartner]]></category>
		<category><![CDATA[#SQLAB]]></category>
		<category><![CDATA[#SQlatino]]></category>
		<category><![CDATA[#SQlatinoamerica]]></category>
		<category><![CDATA[#sqldatabase]]></category>
		<category><![CDATA[#sqldeveloper]]></category>
		<category><![CDATA[#SQLgroupie]]></category>
		<category><![CDATA[#sqlimer]]></category>
		<category><![CDATA[#sqlimerbymay]]></category>
		<category><![CDATA[#sqlinjection]]></category>
		<category><![CDATA[#sqlinternals]]></category>
		<category><![CDATA[#sqlite]]></category>
		<category><![CDATA[#sqlite3]]></category>
		<category><![CDATA[#SQLLearning]]></category>
		<category><![CDATA[#SQLMagazine]]></category>
		<category><![CDATA[#sqlmanagementstudio]]></category>
		<category><![CDATA[#sqlmanager]]></category>
		<category><![CDATA[#Sqlmap]]></category>
		<category><![CDATA[#sqlrun]]></category>
		<category><![CDATA[#sqlsaturday2017]]></category>
		<category><![CDATA[#sqlsatvienna]]></category>
		<category><![CDATA[#sqlserver]]></category>
		<category><![CDATA[#SQLserver2012]]></category>
		<category><![CDATA[#sqlserver2014]]></category>
		<category><![CDATA[#sqlserver2017]]></category>
		<category><![CDATA[#sqlserver2022]]></category>
		<category><![CDATA[#SQLServeronLinux]]></category>
		<category><![CDATA[#SQLsolutionsgroup]]></category>
		<category><![CDATA[#SQLTraining]]></category>
		<category><![CDATA[#SQLYog]]></category>
		<category><![CDATA[Registry]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQLPASS]]></category>
		<category><![CDATA[SQLSaturday]]></category>
		<category><![CDATA[SSG]]></category>
		<category><![CDATA[T-SQL]]></category>
		<guid isPermaLink="false">http://sqlsolutionsgroup.com/?p=2956</guid>

					<description><![CDATA[<p>There is a lot of information within the Windows registry. Sometimes, it would sure be nice to work with the registry in SQL Server through your T-SQL scripts. As it turns out, there are several undocumented extended stored procedures in SQL Server that do just this. A listing of these procedures are: Regular Instance-Aware sys.xp_regread [&#8230;]</p>
<p>The post <a href="https://sqlsolutionsgroup.com/working-registry-sql-server/">Working with the registry in SQL Server</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>There is a lot of information within the Windows registry. Sometimes, it would sure be nice to work with the registry in SQL Server through your T-SQL scripts. As it turns out, there are several undocumented extended stored procedures in SQL Server that do just this. A listing of these procedures are:</p>
<table style="border: 1px solid; border-collapse: collapse; border-spacing: 10px; width: 40%; margin-left: 0%; margin-right: 60%;">
<tbody>
<tr>
<th style="border: 1px solid; text-align: center; font-weight: bold;">Regular</th>
<th style="border: 1px solid; text-align: center; font-weight: bold;">Instance-Aware</th>
</tr>
<tr>
<td style="border: 1px solid; border-spacing: 10px; text-align: center;">sys.xp_regread</td>
<td style="border: 1px solid; border-spacing: 10px; text-align: center;">sys.xp_instance_regread</td>
</tr>
<tr>
<td style="border: 1px solid; border-spacing: 10px; text-align: center;">sys.xp_regenumvalues</td>
<td style="border: 1px solid; border-spacing: 10px; text-align: center;">sys.xp_instance_regenumvalues</td>
</tr>
<tr>
<td style="border: 1px solid; border-spacing: 10px; text-align: center;">sys.xp_regenumkeys</td>
<td style="border: 1px solid; border-spacing: 10px; text-align: center;">sys.xp_instance_regenumkeys</td>
</tr>
<tr>
<td style="border: 1px solid; border-spacing: 10px; text-align: center;">sys.xp_regwrite</td>
<td style="border: 1px solid; border-spacing: 10px; text-align: center;">sys.xp_instance_regwrite</td>
</tr>
<tr>
<td style="border: 1px solid; border-spacing: 10px; text-align: center;">sys.xp_regdeletevalue</td>
<td style="border: 1px solid; border-spacing: 10px; text-align: center;">sys.xp_instance_regdeletevalue</td>
</tr>
<tr>
<td style="border: 1px solid; border-spacing: 10px; text-align: center;">sys.xp_regdeletekey</td>
<td style="border: 1px solid; border-spacing: 10px; text-align: center;">sys.xp_instance_regdeletekey</td>
</tr>
<tr>
<td style="border: 1px solid; border-spacing: 10px; text-align: center;">sys.xp_regaddmultistring</td>
<td style="border: 1px solid; border-spacing: 10px; text-align: center;">sys.xp_instance_regaddmultistring</td>
</tr>
<tr>
<td style="border: 1px solid; border-spacing: 10px; text-align: center;">sys.xp_regremovemultistring</td>
<td style="border: 1px solid; border-spacing: 10px; text-align: center;">sys.xp_instance_regremovemultistring</td>
</tr>
</tbody>
</table>
<p>As you can see, there are two categories of extended stored procedures you can use, with complimentary procedures between them. The &#8220;Instance-Aware&#8221; category procedures utilize key word substitution in order to navigate to the appropriate registry keys for the SQL Server instance that is running. I&#8217;ll show you an example shortly.</p>
<hr />
<p class="has-text-align-center" style="font-size: 20px;">A lot of companies spin their wheels trying to diagnose a SQL problem.</p>
<p class="has-text-align-center" style="font-size: 20px;">With SQL Server, we’ve seen it all and have done it all. Save time. Call us first.</p>
<p class="has-text-align-center" style="font-size: 20px;"><a href="https://sqlsolutionsgroup.com/services/"><span style="text-decoration: underline;">Learn More</span></a></p>
<hr />
<h3>Registry in SQL Server Basics</h3>
<p>Before we go too much further, let&#8217;s explain a few basic key phrases when dealing with the registry:</p>
<p><strong>Registry</strong>: The <em>registry</em> is a hierarchical database used by Windows. It is organized in a tree view manner.</p>
<p><strong>Registry Hive</strong>: A <em>hive</em> is a logical group of keys, subkeys, and values in the registry that has a set of supporting files containing backups of its data.</p>
<p>Examples of Registry Hives are:</p>
<table style="border: 1px solid; border-collapse: collapse; border-spacing: 10px; width: 20%; margin-left: 00%; margin-right: 80%;">
<tbody>
<tr>
<th style="border: 1px solid; border-spacing: 10px; text-align: center; font-weight: bold;">Registry Hive</th>
</tr>
<tr>
<td style="border: 1px solid; border-spacing: 10px; text-align: left;">HKEY_CURRENT_CONFIG</td>
</tr>
<tr>
<td style="border: 1px solid; border-spacing: 10px; text-align: left;">HKEY_CURRENT_USER</td>
</tr>
<tr>
<td style="border: 1px solid; border-spacing: 10px; text-align: left;">HKEY_LOCAL_MACHINE\SAM</td>
</tr>
<tr>
<td style="border: 1px solid; border-spacing: 10px; text-align: left;">HKEY_LOCAL_MACHINE\Security</td>
</tr>
<tr>
<td style="border: 1px solid; border-spacing: 10px; text-align: left;">HKEY_LOCAL_MACHINE\Software</td>
</tr>
<tr>
<td style="border: 1px solid; border-spacing: 10px; text-align: left;">HKEY_LOCAL_MACHINE\System</td>
</tr>
<tr>
<td style="border: 1px solid; border-spacing: 10px; text-align: left;">HKEY_USERS\.DEFAULT</td>
</tr>
</tbody>
</table>
<p>Of all of these hives, you will probably use HKEY_LOCAL_MACHINE and HKEY_CURRENT_USER the most.</p>
<p><strong>Registry Key</strong>: A node within a registry hive is called a <em>key</em>. A key can contain both sub-keys and values. Sometimes an application will only be looking for the presence of a key; at other times it will need to look at the value.</p>
<p><strong>Registry Value</strong>: A registry <em>value</em> is simply a piece of data, of any data type.</p>
<p>The following image shows the tree view layout of the registry, and identifies the various items within it:</p>
<p><a href="https://blog.waynesheffield.com/wayne/wp-content/uploads/2016/07/Registry.png"><img loading="lazy" decoding="async" class="alignnone wp-image-3209 size-full" src="https://blog.waynesheffield.com/wayne/wp-content/uploads/2016/07/Registry.png" alt="Registry in SQL Server" width="573" height="395" /></a></p>
<h3>Querying the registry from SQL Server</h3>
<h4>Using xp_regread / xp_instance_regread</h4>
<p>Let’s start off by querying some data within SQL Server. I have an instance of SQL Server named “SQL2014” (would you care to take a guess as to what version of SQL Server this is?). One of the items stored in the registry is the location of the SQL Agent working directory. These procedures can query the registry and return the specified values. For example:</p>
<p><div id="wpshdo_1" class="wp-synhighlighter-outer"><div id="wpshdt_1" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_1"></a><a id="wpshat_1" class="wp-synhighlighter-title" href="#codesyntax_1"  onClick="javascript:wpsh_toggleBlock(1)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_1" onClick="javascript:wpsh_code(1)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_1" onClick="javascript:wpsh_print(1)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_1" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">EXECUTE</span> master.<span class="me1">sys</span>.<span class="me1">xp_regread</span> 
    <span class="st0">'HKEY_LOCAL_MACHINE'</span>, 
    <span class="st0">'Software<span class="es0">\M</span>icrosoft<span class="es0">\M</span>icrosoft SQL Server<span class="es0">\M</span>SSQL12.SQL2014<span class="es0">\S</span>QLServerAgent'</span>, 
    <span class="st0">'WorkingDirectory'</span>;</pre></div></div></p>
<p>When I execute this statement, SQL returns the following result:</p>
<p><div id="wpshdo_2" class="wp-synhighlighter-outer"><div id="wpshdt_2" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_2"></a><a id="wpshat_2" class="wp-synhighlighter-title" href="#codesyntax_2"  onClick="javascript:wpsh_toggleBlock(2)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_2" onClick="javascript:wpsh_code(2)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_2" onClick="javascript:wpsh_print(2)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_2" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">VALUE</span>            <span class="kw1">DATA</span>
<span class="co1">---------------- -----------------------------------</span>
WorkingDirectory D:\MSSQL\MSSQL12.<span class="me1">SQL2014</span>\MSSQL\JOBS</pre></div></div></p>
<p>In order for you to run this, you may need to change the key as appropriate for the version and instance on your server. The result includes both the value, and the data for the specified path.</p>
<h3>xp_instance_regread</h3>
<p>In this example, I used xp_regread to read the direct registry path. If you remember from earlier, there are SQL Server instance-aware versions of each registry procedure. A comparable statement using the instance-aware procedure would be:</p>
<p><div id="wpshdo_3" class="wp-synhighlighter-outer"><div id="wpshdt_3" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_3"></a><a id="wpshat_3" class="wp-synhighlighter-title" href="#codesyntax_3"  onClick="javascript:wpsh_toggleBlock(3)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_3" onClick="javascript:wpsh_code(3)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_3" onClick="javascript:wpsh_print(3)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_3" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">EXECUTE</span> master.<span class="me1">sys</span>.<span class="me1">xp_instance_regread</span>
    <span class="st0">'HKEY_LOCAL_MACHINE'</span>,
    <span class="st0">'Software<span class="es0">\M</span>icrosoft<span class="es0">\M</span>SSQLSERVER<span class="es0">\S</span>QLServerAgent'</span>,
    <span class="st0">'WorkingDirectory'</span>;</pre></div></div></p>
<p>This statement returns the exact same information. Let’s look at the difference between these – in the first query, the registry path is the exact registry path needed. It includes “\Microsoft SQL Server\MSSQL12.SQL2014\”. In the latter query, this string is replaced with “\MSSQLSERVER\”. Since the latter function is instance aware, it replaces the “MSSQLSERVER” with the exact registry path necessary for this instance of SQL Server. Pretty neat, isn’t it? This allows you to have a script that will run properly regardless of instance. The rest of the examples in this post utilize the instance-aware procedures to make it easier for you to follow along and run these yourself.</p>
<h3>Syntax</h3>
<p>The syntax for these procedures is:</p>
<p><div id="wpshdo_4" class="wp-synhighlighter-outer"><div id="wpshdt_4" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_4"></a><a id="wpshat_4" class="wp-synhighlighter-title" href="#codesyntax_4"  onClick="javascript:wpsh_toggleBlock(4)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_4" onClick="javascript:wpsh_code(4)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_4" onClick="javascript:wpsh_print(4)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_4" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">EXECUTE</span> xp_regread 
    <span class="br0">[</span>@rootkey<span class="sy0">=</span><span class="br0">]</span>’rootkey’,
    <span class="br0">[</span>@<span class="kw1">KEY</span><span class="sy0">=</span><span class="br0">]</span>’<span class="kw1">KEY</span>’
    <span class="br0">[</span>, <span class="br0">[</span>@value_name<span class="sy0">=</span><span class="br0">]</span>’value_name’<span class="br0">]</span>
    <span class="br0">[</span>, <span class="br0">[</span>@<span class="kw1">VALUE</span><span class="sy0">=</span><span class="br0">]</span>@<span class="kw1">VALUE</span> <span class="kw1">OUTPUT</span><span class="br0">]</span></pre></div></div></p>
<p>The first parameter is the registry hive that you want to query, the second parameter is the key path, and the third is the value name. The third parameter is optional – if provided, then the procedure will return the data from the specified value item; if not provided, then the procedure only returns whether the specified key exists. There is also an optional fourth parameter, which is an output parameter, and the data output goes into that. The parameters are positional, and while you can specify a name for the parameter, any name will work. Since the parameters are positional, my recommendation is to not use the parameter names. The following example utilizes the optional fourth parameter, and it will return just the specified path into the variable:</p>
<p><div id="wpshdo_5" class="wp-synhighlighter-outer"><div id="wpshdt_5" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_5"></a><a id="wpshat_5" class="wp-synhighlighter-title" href="#codesyntax_5"  onClick="javascript:wpsh_toggleBlock(5)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_5" onClick="javascript:wpsh_code(5)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_5" onClick="javascript:wpsh_print(5)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_5" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">DECLARE</span> @SQLAgentDirectory <span class="kw1">VARCHAR</span><span class="br0">&#40;</span>255<span class="br0">&#41;</span>;
<span class="kw1">EXECUTE</span> master.<span class="me1">sys</span>.<span class="me1">xp_instance_regread</span>
    <span class="st0">'HKEY_LOCAL_MACHINE'</span>,
    <span class="st0">'Software<span class="es0">\M</span>icrosoft<span class="es0">\M</span>SSQLSERVER<span class="es0">\S</span>QLServerAgent'</span>,
    <span class="st0">'WorkingDirectory'</span>,
    @SQLAgentDirectory <span class="kw1">OUTPUT</span>;
<span class="kw1">SELECT</span> @SQLAgentDirectory;</pre></div></div></p>
<p>You would think that if you specify either NULL or an empty string for the third parameter, that you could send whether the key exists to an output variable. However, I have not found a way to accomplish this. Specifying either of these values results in an error when running this statement. If you know how to do this, please leave a remark so that this post can be updated with that information.</p>
<h3>Using xp_regenumvalues / xp_instance_regenumvalues</h3>
<p>These procedures enumerate through all of the values of the specified key, returning a separate result set for each value. For instance, the following statement will return all of the values in the above SQLServerAgent key:</p>
<p><div id="wpshdo_6" class="wp-synhighlighter-outer"><div id="wpshdt_6" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_6"></a><a id="wpshat_6" class="wp-synhighlighter-title" href="#codesyntax_6"  onClick="javascript:wpsh_toggleBlock(6)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_6" onClick="javascript:wpsh_code(6)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_6" onClick="javascript:wpsh_print(6)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_6" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">EXECUTE</span> master.<span class="me1">sys</span>.<span class="me1">xp_instance_regenumvalues</span>
    <span class="st0">'HKEY_LOCAL_MACHINE'</span>,
    <span class="st0">'Software<span class="es0">\M</span>icrosoft<span class="es0">\M</span>SSQLSERVER<span class="es0">\S</span>QLServerAgent'</span>;</pre></div></div></p>
<p>Having all of these result sets makes it difficult to work with this procedure. Thankfully, you can put these all into one result set. Just create a temporary table (or table variable) to hold the output, and then use INSERT / EXECUTE to fill it, like the following example does:</p>
<p><div id="wpshdo_7" class="wp-synhighlighter-outer"><div id="wpshdt_7" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_7"></a><a id="wpshat_7" class="wp-synhighlighter-title" href="#codesyntax_7"  onClick="javascript:wpsh_toggleBlock(7)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_7" onClick="javascript:wpsh_code(7)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_7" onClick="javascript:wpsh_print(7)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_7" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">DECLARE</span> @Registry <span class="kw1">TABLE</span> <span class="br0">&#40;</span><span class="kw1">VALUE</span> <span class="kw1">VARCHAR</span><span class="br0">&#40;</span>255<span class="br0">&#41;</span>, <span class="kw1">DATA</span> <span class="kw1">VARCHAR</span><span class="br0">&#40;</span>255<span class="br0">&#41;</span><span class="br0">&#41;</span>;
<span class="kw1">INSERT</span> <span class="kw1">INTO</span> @Registry
<span class="kw1">EXECUTE</span> master.<span class="me1">sys</span>.<span class="me1">xp_instance_regenumvalues</span>
    <span class="st0">'HKEY_LOCAL_MACHINE'</span>,
    <span class="st0">'Software<span class="es0">\M</span>icrosoft<span class="es0">\M</span>SSQLSERVER<span class="es0">\S</span>QLServerAgent'</span>;
<span class="kw1">SELECT</span> <span class="sy0">*</span> <span class="kw1">FROM</span> @Registry;</pre></div></div></p>
<p>Now that all of the results are in one result set, you can work with it a bit easier.</p>
<h3>Syntax</h3>
<p>The syntax for these procedures is:</p>
<p><div id="wpshdo_8" class="wp-synhighlighter-outer"><div id="wpshdt_8" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_8"></a><a id="wpshat_8" class="wp-synhighlighter-title" href="#codesyntax_8"  onClick="javascript:wpsh_toggleBlock(8)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_8" onClick="javascript:wpsh_code(8)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_8" onClick="javascript:wpsh_print(8)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_8" class="wp-synhighlighter-inner" style="display: block;"><pre class="php" style="font-family:monospace;">EXECUTE xp_regenumvalues 
    <span class="br0">[</span><span class="sy0">@</span>rootkey<span class="sy0">=</span><span class="br0">]</span>’rootkey’<span class="sy0">,</span>
    <span class="br0">[</span><span class="sy0">@</span><a href="http://www.php.net/key"><span class="kw3">key</span></a><span class="sy0">=</span><span class="br0">]</span>’<a href="http://www.php.net/key"><span class="kw3">key</span></a>’</pre></div></div></p>
<h3>Using xp_regenumkeys / xp_instance_regenumkeys</h3>
<p>These procedures enumerate through all of the keys in a specified path, and return all of the keys in that path. Unlike xp_instance_regenumvalues, all of the keys are returned in one result set, though you will probably want to use INSERT / EXECUTE to put this into temporary storage so that you can work with it. An example of using these procedures is:</p>
<p><div id="wpshdo_9" class="wp-synhighlighter-outer"><div id="wpshdt_9" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_9"></a><a id="wpshat_9" class="wp-synhighlighter-title" href="#codesyntax_9"  onClick="javascript:wpsh_toggleBlock(9)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_9" onClick="javascript:wpsh_code(9)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_9" onClick="javascript:wpsh_print(9)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_9" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">EXECUTE</span> master.<span class="me1">sys</span>.<span class="me1">xp_instance_regenumkeys</span>
    <span class="st0">'HKEY_LOCAL_MACHINE'</span>,
    <span class="st0">'Software<span class="es0">\M</span>icrosoft<span class="es0">\M</span>SSQLSERVER'</span>;</pre></div></div></p>
<p>The syntax for these procedures is:</p>
<p><div id="wpshdo_10" class="wp-synhighlighter-outer"><div id="wpshdt_10" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_10"></a><a id="wpshat_10" class="wp-synhighlighter-title" href="#codesyntax_10"  onClick="javascript:wpsh_toggleBlock(10)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_10" onClick="javascript:wpsh_code(10)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_10" onClick="javascript:wpsh_print(10)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_10" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">EXECUTE</span> xp_regenumkeys 
    <span class="br0">[</span>@rootkey<span class="sy0">=</span><span class="br0">]</span>’rootkey’,
    <span class="br0">[</span>@<span class="kw1">KEY</span><span class="sy0">=</span><span class="br0">]</span>’<span class="kw1">KEY</span>’</pre></div></div></p>
<h3>Modifying the registry from within SQL Server</h3>
<p>Up to this point, we have focused on retrieving data from the registry. What if you want to modify the registry? Read on… <span style="color: #ff0000;">be forewarned that the following procedures are modifying the registry, which means that they can also damage the registry, possibly rendering the server unusable. <strong>Use at your own risk!</strong></span></p>
<h3>xp_regwrite / xp_instance_regwrite</h3>
<p>Use these procedures to create keys and write data into the registry. You can create up to 32 sub-keys at a time. In the following example, a new key “MyNewKey” will be added to the SQLServerAgent key, and the value “MyNewValue” will be added to this new key with the data “Now you see me!”. It will then read this value from the registry.</p>
<div id="crayon-5d1fdb612f205983226844" class="crayon-syntax crayon-theme-ssms2012 crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">
<div class="crayon-toolbar" data-settings=" show">
<p><div id="wpshdo_11" class="wp-synhighlighter-outer"><div id="wpshdt_11" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_11"></a><a id="wpshat_11" class="wp-synhighlighter-title" href="#codesyntax_11"  onClick="javascript:wpsh_toggleBlock(11)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_11" onClick="javascript:wpsh_code(11)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_11" onClick="javascript:wpsh_print(11)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_11" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">EXECUTE</span> master.<span class="me1">sys</span>.<span class="me1">xp_instance_regwrite</span>
    <span class="st0">'HKEY_LOCAL_MACHINE'</span>,
    <span class="st0">'Software<span class="es0">\M</span>icrosoft<span class="es0">\M</span>SSQLSERVER<span class="es0">\S</span>QLServerAgent<span class="es0">\M</span>yNewKey'</span>,
    <span class="st0">'MyNewValue'</span>,
    <span class="st0">'REG_SZ'</span>,
    <span class="st0">'Now you see me!'</span>;
<span class="kw1">EXECUTE</span> master.<span class="me1">sys</span>.<span class="me1">xp_instance_regread</span>
    <span class="st0">'HKEY_LOCAL_MACHINE'</span>,
    <span class="st0">'Software<span class="es0">\M</span>icrosoft<span class="es0">\M</span>SSQLSERVER<span class="es0">\S</span>QLServerAgent<span class="es0">\M</span>yNewKey'</span>,
    <span class="st0">'MyNewValue'</span>;</pre></div></div></p>
</div>
</div>
<h3 data-settings=" show"><span style="font-size: 1.2em; font-weight: 600;">Syntax</span></h3>
<div data-settings=" show">
<p>The syntax for these procedures is:</p>
</div>
<p><div id="wpshdo_12" class="wp-synhighlighter-outer"><div id="wpshdt_12" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_12"></a><a id="wpshat_12" class="wp-synhighlighter-title" href="#codesyntax_12"  onClick="javascript:wpsh_toggleBlock(12)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_12" onClick="javascript:wpsh_code(12)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_12" onClick="javascript:wpsh_print(12)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_12" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">EXECUTE</span> xp_regwrite 
    <span class="br0">[</span>@rootkey<span class="sy0">=</span><span class="br0">]</span>’rootkey’,
    <span class="br0">[</span>@<span class="kw1">KEY</span><span class="sy0">=</span><span class="br0">]</span>’<span class="kw1">KEY</span>’,
    <span class="br0">[</span>@value_name<span class="sy0">=</span><span class="br0">]</span>’value_name’,
    <span class="br0">[</span>@type<span class="sy0">=</span><span class="br0">]</span>’type’,
    <span class="br0">[</span>@<span class="kw1">VALUE</span><span class="sy0">=</span><span class="br0">]</span>’<span class="kw1">VALUE</span>’</pre></div></div></p>
<h3>xp_regdeletevalue / xp_instance_regdeletevalue</h3>
<p>These procedures are used to delete a specified value from the registry. In this example, the “MyNewValue” value will be deleted. The example first enumerates through all of the values in this key (just the one), deletes the value, enumerates through them again (since there are no values, there will be no result set), and then finally shows that the key is still present.</p>
<p><div id="wpshdo_13" class="wp-synhighlighter-outer"><div id="wpshdt_13" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_13"></a><a id="wpshat_13" class="wp-synhighlighter-title" href="#codesyntax_13"  onClick="javascript:wpsh_toggleBlock(13)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_13" onClick="javascript:wpsh_code(13)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_13" onClick="javascript:wpsh_print(13)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_13" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">EXECUTE</span> master.<span class="me1">sys</span>.<span class="me1">xp_instance_regenumvalues</span>
    <span class="st0">'HKEY_LOCAL_MACHINE'</span>,
    <span class="st0">'Software<span class="es0">\M</span>icrosoft<span class="es0">\M</span>SSQLSERVER<span class="es0">\S</span>QLServerAgent<span class="es0">\M</span>yNewKey'</span>;
<span class="kw1">EXECUTE</span> master.<span class="me1">sys</span>.<span class="me1">xp_instance_regdeletevalue</span>
    <span class="st0">'HKEY_LOCAL_MACHINE'</span>,
    <span class="st0">'Software<span class="es0">\M</span>icrosoft<span class="es0">\M</span>SSQLSERVER<span class="es0">\S</span>QLServerAgent<span class="es0">\M</span>yNewKey'</span>,
    <span class="st0">'MyNewValue'</span>;
<span class="kw1">EXECUTE</span> master.<span class="me1">sys</span>.<span class="me1">xp_instance_regenumvalues</span>
    <span class="st0">'HKEY_LOCAL_MACHINE'</span>,
    <span class="st0">'Software<span class="es0">\M</span>icrosoft<span class="es0">\M</span>SSQLSERVER<span class="es0">\S</span>QLServerAgent<span class="es0">\M</span>yNewKey'</span>;
<span class="kw1">EXECUTE</span> master.<span class="me1">sys</span>.<span class="me1">xp_instance_regread</span>
    <span class="st0">'HKEY_LOCAL_MACHINE'</span>,
    <span class="st0">'Software<span class="es0">\M</span>icrosoft<span class="es0">\M</span>SSQLSERVER<span class="es0">\S</span>QLServerAgent<span class="es0">\M</span>yNewKey'</span>;</pre></div></div></p>
<h3>Syntax</h3>
<p>The syntax for these procedures is:</p>
<p><div id="wpshdo_14" class="wp-synhighlighter-outer"><div id="wpshdt_14" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_14"></a><a id="wpshat_14" class="wp-synhighlighter-title" href="#codesyntax_14"  onClick="javascript:wpsh_toggleBlock(14)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_14" onClick="javascript:wpsh_code(14)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_14" onClick="javascript:wpsh_print(14)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_14" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">EXECUTE</span> xp_regdeletevalue 
    <span class="br0">[</span>@rootkey<span class="sy0">=</span><span class="br0">]</span>’rootkey’,
    <span class="br0">[</span>@<span class="kw1">KEY</span><span class="sy0">=</span><span class="br0">]</span>’<span class="kw1">KEY</span>’,
    <span class="br0">[</span>@value_name<span class="sy0">=</span><span class="br0">]</span>’value_name’</pre></div></div></p>
<h3>xp_regdeletekey / xp_instance_regdeletekey</h3>
<p>Use these procedures to delete an entire key from the registry. In this example, the script first adds another new key under “MyNewKey”, and a value in that new key. The script then deletes both the “AnotherNewKey” (which deletes the value just added also) and “MyNewKey” keys and finally shows that both keys have been deleted. Note that in order to delete a key, it cannot have any sub-keys, which is why the script deletes “AnotherNewKey” first (try running the script first by commenting out the first xp_instance_regdeletekey to see that it must be empty).</p>
<p><div id="wpshdo_15" class="wp-synhighlighter-outer"><div id="wpshdt_15" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_15"></a><a id="wpshat_15" class="wp-synhighlighter-title" href="#codesyntax_15"  onClick="javascript:wpsh_toggleBlock(15)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_15" onClick="javascript:wpsh_code(15)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_15" onClick="javascript:wpsh_print(15)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_15" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">EXECUTE</span> master.<span class="me1">sys</span>.<span class="me1">xp_instance_regwrite</span>
    <span class="st0">'HKEY_LOCAL_MACHINE'</span>,
    <span class="st0">'Software<span class="es0">\M</span>icrosoft<span class="es0">\M</span>SSQLSERVER<span class="es0">\S</span>QLServerAgent<span class="es0">\M</span>yNewKey<span class="es0">\A</span>notherNewKey'</span>,
    <span class="st0">'MyNewValue'</span>,
    <span class="st0">'REG_SZ'</span>,
    <span class="st0">'Another new value!'</span>;
<span class="kw1">EXECUTE</span> master.<span class="me1">sys</span>.<span class="me1">xp_instance_regread</span>
    <span class="st0">'HKEY_LOCAL_MACHINE'</span>,
    <span class="st0">'Software<span class="es0">\M</span>icrosoft<span class="es0">\M</span>SSQLSERVER<span class="es0">\S</span>QLServerAgent<span class="es0">\M</span>yNewKey<span class="es0">\A</span>notherNewKey'</span>;
<span class="kw1">EXECUTE</span> master.<span class="me1">sys</span>.<span class="me1">xp_instance_regdeletekey</span>
    <span class="st0">'HKEY_LOCAL_MACHINE'</span>,
    <span class="st0">'Software<span class="es0">\M</span>icrosoft<span class="es0">\M</span>SSQLSERVER<span class="es0">\S</span>QLServerAgent<span class="es0">\M</span>yNewKey<span class="es0">\A</span>notherNewKey'</span>;
<span class="kw1">EXECUTE</span> master.<span class="me1">sys</span>.<span class="me1">xp_instance_regdeletekey</span>
    <span class="st0">'HKEY_LOCAL_MACHINE'</span>,
    <span class="st0">'Software<span class="es0">\M</span>icrosoft<span class="es0">\M</span>SSQLSERVER<span class="es0">\S</span>QLServerAgent<span class="es0">\M</span>yNewKey'</span>;
<span class="kw1">EXECUTE</span> master.<span class="me1">sys</span>.<span class="me1">xp_instance_regread</span>
    <span class="st0">'HKEY_LOCAL_MACHINE'</span>,
    <span class="st0">'Software<span class="es0">\M</span>icrosoft<span class="es0">\M</span>SSQLSERVER<span class="es0">\S</span>QLServerAgent<span class="es0">\M</span>yNewKey<span class="es0">\A</span>notherNewKey'</span>;
<span class="kw1">EXECUTE</span> master.<span class="me1">sys</span>.<span class="me1">xp_instance_regread</span>
    <span class="st0">'HKEY_LOCAL_MACHINE'</span>,
    <span class="st0">'Software<span class="es0">\M</span>icrosoft<span class="es0">\M</span>SSQLSERVER<span class="es0">\S</span>QLServerAgent<span class="es0">\M</span>yNewKey'</span>;</pre></div></div></p>
<h3>Syntax</h3>
<p>The syntax for these procedures is:</p>
<p><div id="wpshdo_16" class="wp-synhighlighter-outer"><div id="wpshdt_16" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_16"></a><a id="wpshat_16" class="wp-synhighlighter-title" href="#codesyntax_16"  onClick="javascript:wpsh_toggleBlock(16)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_16" onClick="javascript:wpsh_code(16)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_16" onClick="javascript:wpsh_print(16)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_16" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">EXECUTE</span> xp_regdeletekey 
    <span class="br0">[</span>@rootkey<span class="sy0">=</span><span class="br0">]</span>’rootkey’,
    <span class="br0">[</span>@<span class="kw1">KEY</span><span class="sy0">=</span><span class="br0">]</span>’<span class="kw1">KEY</span>’</pre></div></div></p>
<h3>xp_regaddmultistring / xp_instance_regaddmultistring</h3>
<p>Use these procedures to add a string to a multi-string entry in the registry, or to create a multi-string registry entry. In this example, I’ll call the procedure twice. The first time will create the entry with one string in it, and the second time will add a second string to it. Then the example will show the results of this value.</p>
<p><div id="wpshdo_17" class="wp-synhighlighter-outer"><div id="wpshdt_17" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_17"></a><a id="wpshat_17" class="wp-synhighlighter-title" href="#codesyntax_17"  onClick="javascript:wpsh_toggleBlock(17)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_17" onClick="javascript:wpsh_code(17)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_17" onClick="javascript:wpsh_print(17)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_17" class="wp-synhighlighter-inner" style="display: block;"><pre class="text" style="font-family:monospace;">EXECUTE master.sys.xp_instance_regaddmultistring
    'HKEY_LOCAL_MACHINE',
    'Software\Microsoft\MSSQLSERVER\SQLServerAgent\MyNewKey',
    'MyNewValue',
    'A multi-string value!';
EXECUTE master.sys.xp_instance_regaddmultistring
    'HKEY_LOCAL_MACHINE',
    'Software\Microsoft\MSSQLSERVER\SQLServerAgent\MyNewKey',
    'MyNewValue',
    'Yet Another new string added to this multi-string value!';
EXECUTE master.sys.xp_instance_regread
    'HKEY_LOCAL_MACHINE',
    'Software\Microsoft\MSSQLSERVER\SQLServerAgent\MyNewKey',
    'MyNewValue'</pre></div></div></p>
<p>Did you notice that the regread procedure got a little confused here? It has two value columns (which is the name of the value), but the second one has the data for the first one. Then the data column is null. If a third string is added, it still returns just these three columns. To see that we actually added these strings, we’ll have to use regedit.exe:</p>
<p><div id="wpshdo_18" class="wp-synhighlighter-outer"><div id="wpshdt_18" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_18"></a><a id="wpshat_18" class="wp-synhighlighter-title" href="#codesyntax_18"  onClick="javascript:wpsh_toggleBlock(18)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_18" onClick="javascript:wpsh_code(18)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_18" onClick="javascript:wpsh_print(18)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_18" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="co1">-- add a third string</span>
<span class="kw1">EXECUTE</span> master.<span class="me1">sys</span>.<span class="me1">xp_instance_regaddmultistring</span>
    <span class="st0">'HKEY_LOCAL_MACHINE'</span>,
    <span class="st0">'Software<span class="es0">\M</span>icrosoft<span class="es0">\M</span>SSQLSERVER<span class="es0">\S</span>QLServerAgent<span class="es0">\M</span>yNewKey'</span>,
    <span class="st0">'MyNewValue'</span>,
    <span class="st0">'How about a third string?'</span>;
<span class="co1">-- only shows the first string</span>
<span class="kw1">EXECUTE</span> master.<span class="me1">sys</span>.<span class="me1">xp_instance_regread</span>
    <span class="st0">'HKEY_LOCAL_MACHINE'</span>,
    <span class="st0">'Software<span class="es0">\M</span>icrosoft<span class="es0">\M</span>SSQLSERVER<span class="es0">\S</span>QLServerAgent<span class="es0">\M</span>yNewKey'</span>,
    <span class="st0">'MyNewValue'</span></pre></div></div></p>
<p><a href="https://blog.waynesheffield.com/wayne/wp-content/uploads/2016/08/Registry2.png"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-3230" src="https://blog.waynesheffield.com/wayne/wp-content/uploads/2016/08/Registry2.png" sizes="(max-width: 612px) 100vw, 612px" srcset="//blog.waynesheffield.com/wayne/wp-content/uploads/2016/08/Registry2.png 612w, //blog.waynesheffield.com/wayne/wp-content/uploads/2016/08/Registry2-300x226.png 300w" alt="Registry2" width="612" height="461" /></a></p>
<h3>Syntax</h3>
<p>The syntax for these procedures is:</p>
<p><div id="wpshdo_19" class="wp-synhighlighter-outer"><div id="wpshdt_19" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_19"></a><a id="wpshat_19" class="wp-synhighlighter-title" href="#codesyntax_19"  onClick="javascript:wpsh_toggleBlock(19)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_19" onClick="javascript:wpsh_code(19)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_19" onClick="javascript:wpsh_print(19)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_19" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">EXECUTE</span> xp_regaddmultistring 
    <span class="br0">[</span>@rootkey<span class="sy0">=</span><span class="br0">]</span>’rootkey’,
    <span class="br0">[</span>@<span class="kw1">KEY</span><span class="sy0">=</span><span class="br0">]</span>’<span class="kw1">KEY</span>’,
    <span class="br0">[</span>@value_name<span class="sy0">=</span><span class="br0">]</span>’value_name’,
    <span class="br0">[</span>@<span class="kw1">VALUE</span><span class="sy0">=</span><span class="br0">]</span>’<span class="kw1">VALUE</span>’</pre></div></div></p>
<h3>xp_regremovemultistring / xp_instance_regremovemultistring</h3>
<p>These procedures are used to remove a string from a multi-string entry. This example will remove the middle string.</p>
<p><div id="wpshdo_20" class="wp-synhighlighter-outer"><div id="wpshdt_20" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_20"></a><a id="wpshat_20" class="wp-synhighlighter-title" href="#codesyntax_20"  onClick="javascript:wpsh_toggleBlock(20)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_20" onClick="javascript:wpsh_code(20)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_20" onClick="javascript:wpsh_print(20)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_20" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">EXECUTE</span> master.<span class="me1">sys</span>.<span class="me1">xp_instance_regremovemultistring</span>
    <span class="st0">'HKEY_LOCAL_MACHINE'</span>,
    <span class="st0">'Software<span class="es0">\M</span>icrosoft<span class="es0">\M</span>SSQLSERVER<span class="es0">\S</span>QLServerAgent<span class="es0">\M</span>yNewKey'</span>,
    <span class="st0">'MyNewValue'</span>,
    <span class="st0">'Yet Another new string added to this multi-string value!'</span>;</pre></div></div></p>
<p>Examining the string now in regedit.exe, we can see it removed all of the strings starting with the specified string… in other words, it removed the second and third strings. If we add the strings back in, and then remove the third string, we can see that it also removes the second and third string. In testing with a fourth string, it appears that if you are deleting a string that is not the first string, then all of the remainder of the strings after the first string are removed. Deleting the first string deletes all of the strings. Well, these are undocumented procedures, so it’s not likely that this bug will ever be fixed.</p>
<h3>Syntax</h3>
<p>The syntax for these procedures is:</p>
<p><div id="wpshdo_21" class="wp-synhighlighter-outer"><div id="wpshdt_21" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_21"></a><a id="wpshat_21" class="wp-synhighlighter-title" href="#codesyntax_21"  onClick="javascript:wpsh_toggleBlock(21)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_21" onClick="javascript:wpsh_code(21)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_21" onClick="javascript:wpsh_print(21)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_21" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">EXECUTE</span> xp_regremovemultistring 
    <span class="br0">[</span>@rootkey<span class="sy0">=</span><span class="br0">]</span>’rootkey’,
    <span class="br0">[</span>@<span class="kw1">KEY</span><span class="sy0">=</span><span class="br0">]</span>’<span class="kw1">KEY</span>’,
    <span class="br0">[</span>@value_name<span class="sy0">=</span><span class="br0">]</span>’value_name’,
    <span class="br0">[</span>@<span class="kw1">VALUE</span><span class="sy0">=</span><span class="br0">]</span>’<span class="kw1">VALUE</span>’</pre></div></div></p>
<p>And finally, let’s ensure that things are cleaned up:</p>
<p><div id="wpshdo_22" class="wp-synhighlighter-outer"><div id="wpshdt_22" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_22"></a><a id="wpshat_22" class="wp-synhighlighter-title" href="#codesyntax_22"  onClick="javascript:wpsh_toggleBlock(22)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_22" onClick="javascript:wpsh_code(22)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_22" onClick="javascript:wpsh_print(22)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_22" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">EXECUTE</span> master.<span class="me1">sys</span>.<span class="me1">xp_instance_regdeletekey</span>
    <span class="st0">'HKEY_LOCAL_MACHINE'</span>,
    <span class="st0">'Software<span class="es0">\M</span>icrosoft<span class="es0">\M</span>SSQLSERVER<span class="es0">\S</span>QLServerAgent<span class="es0">\M</span>yNewKey'</span>;</pre></div></div></p>
<h3>Conclusion</h3>
<p>With the exception of removing and reading the multi-string values, these extended stored procedures all work pretty well. We’ve been able to read registry values, and to enumerate through a list of keys and values. We can create and delete keys and values.</p>
<p>If you try to use the procedures in sections outside of SQL Server keys, you may run into registry security problems where the SQL Server service account doesn’t have permissions to accomplish the task. On the internet, you will find articles telling you to add the service account to the local administrators group (and to restart the service). This is a <span style="color: #ff0000;"><strong>VERY BAD IDEA</strong></span> – by doing this, you can completely compromise the server. You could do anything that you desire on the server. Instead, use regedt32.exe, which will allow you to modify the permissions on the key that where you are having access issues.</p>
<p>I close by repeating my warning from above – be very careful when modifying the registry. It is possible to corrupt the registry to the point where the server will no longer function. To recover, an operating system reinstall will be necessary.</p>
<p>As a footnote on working with the instance-aware installation. I recall seeing on the internet other keywords that could be substituted instead of MSSQLSERVER. One of them is SQLServerAgent. However, I can’t find any others right now. If you happen to know of other keywords that work, please reply to this post so that it can be added to this post.</p>
<p>The post <a href="https://sqlsolutionsgroup.com/working-registry-sql-server/">Working with the registry in SQL Server</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlsolutionsgroup.com/working-registry-sql-server/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>The Finished Product: Framework, pt. 5</title>
		<link>https://sqlsolutionsgroup.com/t-sql-framework-2/</link>
					<comments>https://sqlsolutionsgroup.com/t-sql-framework-2/#respond</comments>
		
		<dc:creator><![CDATA[Jared Kirkpatrick]]></dc:creator>
		<pubDate>Tue, 03 Sep 2019 15:15:11 +0000</pubDate>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL Group]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[#microsftcertifedmaster]]></category>
		<category><![CDATA[#microsftpartner]]></category>
		<category><![CDATA[#SQLAB]]></category>
		<category><![CDATA[#SQlatino]]></category>
		<category><![CDATA[#SQlatinoamerica]]></category>
		<category><![CDATA[#sqldatabase]]></category>
		<category><![CDATA[#sqldeveloper]]></category>
		<category><![CDATA[#SQLgroupie]]></category>
		<category><![CDATA[#sqlimer]]></category>
		<category><![CDATA[#sqlimerbymay]]></category>
		<category><![CDATA[#sqlinjection]]></category>
		<category><![CDATA[#sqlinternals]]></category>
		<category><![CDATA[#sqlite]]></category>
		<category><![CDATA[#sqlite3]]></category>
		<category><![CDATA[#SQLLearning]]></category>
		<category><![CDATA[#SQLMagazine]]></category>
		<category><![CDATA[#sqlmanagementstudio]]></category>
		<category><![CDATA[#sqlmanager]]></category>
		<category><![CDATA[#Sqlmap]]></category>
		<category><![CDATA[#sqlrun]]></category>
		<category><![CDATA[#sqlsaturday2017]]></category>
		<category><![CDATA[#sqlsatvienna]]></category>
		<category><![CDATA[#sqlserver]]></category>
		<category><![CDATA[#SQLserver2012]]></category>
		<category><![CDATA[#sqlserver2014]]></category>
		<category><![CDATA[#sqlserver2017]]></category>
		<category><![CDATA[#sqlserver2022]]></category>
		<category><![CDATA[#SQLServeronLinux]]></category>
		<category><![CDATA[#SQLsolutionsgroup]]></category>
		<category><![CDATA[#SQLTraining]]></category>
		<category><![CDATA[#SQLYog]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[SQLPASS]]></category>
		<category><![CDATA[SQLSaturday]]></category>
		<category><![CDATA[SSG]]></category>
		<category><![CDATA[T-SQL]]></category>
		<guid isPermaLink="false">http://sqlsolutionsgroup.com/?p=4257</guid>

					<description><![CDATA[<p>We now have a finished T-SQL framework, and this is the last post of the series. We start with the complete Template (with the error engine, activity log and batching). In this post, we&#8217;ll examine each new segment and focus on the batching feature, explain what is going on and the necessity. The finished Template: [&#8230;]</p>
<p>The post <a href="https://sqlsolutionsgroup.com/t-sql-framework-2/">The Finished Product: Framework, pt. 5</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>We now have a finished T-SQL framework, and this is the last post of the series. We start with the complete Template (with the <a href="https://sqlsolutionsgroup.com/sql-error-engine/">error engine</a>, <a href="https://sqlsolutionsgroup.com/the-tsql-activity-log/">activity log</a> and <a href="https://sqlsolutionsgroup.com/t-sql-batching/">batching</a>). In this post, we&#8217;ll examine each new segment and focus on the batching feature, explain what is going on and the necessity.</p>



<p>The finished Template:</p>


<div id="wpshdo_23" class="wp-synhighlighter-outer"><div id="wpshdt_23" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_23"></a><a id="wpshat_23" class="wp-synhighlighter-title" href="#codesyntax_23"  onClick="javascript:wpsh_toggleBlock(23)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_23" onClick="javascript:wpsh_code(23)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_23" onClick="javascript:wpsh_print(23)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_23" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> DBCATCH
GO
<span class="kw1">IF</span> <span class="sy0">EXISTS</span><span class="br0">&#40;</span><span class="kw1">SELECT</span> 1
            <span class="kw1">FROM</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>sysobjects<span class="br0">]</span> <span class="br0">&#40;</span>NOLOCK<span class="br0">&#41;</span>
           <span class="kw1">WHERE</span> <span class="br0">[</span>id<span class="br0">]</span>                                            <span class="sy0">=</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span>N<span class="st0">'[dbo].[&lt;Name, SYSNAME, PU_DB_ADD&gt;]'</span><span class="br0">&#41;</span>
             <span class="sy0">AND</span> <span class="kw2">OBJECTPROPERTY</span><span class="br0">&#40;</span><span class="br0">[</span>id<span class="br0">]</span>, N<span class="st0">'IsProcedure'</span><span class="br0">&#41;</span>            <span class="sy0">=</span> 1<span class="br0">&#41;</span> 
<span class="kw1">BEGIN</span> 
  <span class="kw1">DROP</span> <span class="kw1">PROCEDURE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span><span class="sy0">&lt;</span>Name, SYSNAME, PU_DB_ADD<span class="sy0">&gt;</span><span class="br0">]</span>;
&nbsp;
  <span class="kw1">PRINT</span> <span class="st0">'&gt;&gt;&gt; DROPPED PROCEDURE [dbo].[&lt;Name, SYSNAME, PU_DB_ADD&gt;] &lt;&lt;&lt;'</span>;
<span class="kw1">END</span> 
GO
<span class="kw1">CREATE</span> <span class="kw1">PROC</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span><span class="sy0">&lt;</span>Name, SYSNAME, PU_DB_ADD<span class="sy0">&gt;</span><span class="br0">]</span>
  @p_Batch_ID                        <span class="br0">[</span><span class="kw1">UNIQUEIDENTIFIER</span><span class="br0">]</span>          <span class="sy0">=</span> <span class="sy0">NULL</span>
<span class="kw1">WITH</span> ENCRYPTION
<span class="kw1">AS</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* Name        : &lt;Name, SYSNAME, PU_DB_ADD&gt;                                                      */</span>
<span class="coMULTI">/* Version     : 1.0                                                                             */</span>
<span class="coMULTI">/* Author      : Jared Kirkpatrick                                                               */</span>
<span class="coMULTI">/* Date        : 2019-05-24                                                                      */</span>
<span class="coMULTI">/* Description :                                                                                 */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* Date        : Version: Who: Description                                                       */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* 2019-05-24  : 1.0    : REB: Initial Release.                                                */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="kw1">SET</span> <span class="kw1">NOCOUNT</span> <span class="kw1">ON</span>;
<span class="coMULTI">/* Declare Variables */</span>
<span class="kw1">DECLARE</span> @v_Error                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_MSG                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>500<span class="br0">&#41;</span>
       ,@v_DB                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Obj                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_App                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_User                      <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Spid                      <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_ActivityLog_ID            <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_ADesc                     <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>512<span class="br0">&#41;</span>
       ,@v_BatchStatus               <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>
       ,@v_Now                       <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>
       ,@v_LastErrorDate             <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>
       ,@v_SystemName                <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_RowCount                  <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Count                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Min<span class="sy0">IN</span>T                    <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Max<span class="sy0">IN</span>T                    <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Version                   <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>       
       ,@v_KeyWord                   <span class="br0">[</span>SYSNAME<span class="br0">]</span>   
       ,@v_MSSQL_ID                  <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Domain                    <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>  
       ,@v_Batch_Type_ID             <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span> 
	   ,@v_System                    <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_SQL                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>4000<span class="br0">&#41;</span>  
       ,@v_UserName                  <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_PW                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Debug                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>;
&nbsp;
<span class="kw1">SELECT</span> @v_Now                        <span class="sy0">=</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_DB                         <span class="sy0">=</span> <span class="kw2">DB_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_Obj                        <span class="sy0">=</span> <span class="st0">'[DBCATCH].[dbo].[&lt;Name, SYSNAME, PU_DB_ADD&gt;]'</span>
      ,@v_App                        <span class="sy0">=</span> <span class="kw2">APP_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_User                       <span class="sy0">=</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span><span class="sy0">OR</span>IG<span class="sy0">IN</span>AL_LOG<span class="sy0">IN</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">USER_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
      ,@v_Spid                       <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>25<span class="br0">&#41;</span>, <span class="kw2">@@SPID</span><span class="br0">&#41;</span>
	  ,@v_Batch_Type_ID              <span class="sy0">=</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>FSU_Code_GET<span class="br0">]</span><span class="br0">&#40;</span><span class="st0">'Batch'</span>, <span class="st0">'PROCEDURE'</span><span class="br0">&#41;</span>
	  ,@v_System                     <span class="sy0">=</span> <span class="kw2">HOST_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_Debug                      <span class="sy0">=</span> <span class="nu0">0</span>;  
&nbsp;
&nbsp;
<span class="coMULTI">/* Create Temp Tables */</span>
&nbsp;
<span class="kw1">IF</span> @v_Debug                          <span class="sy0">=</span> 1
<span class="kw1">BEGIN</span> <span class="co1">-- debug = 1 Ref: 1</span>
  <span class="kw1">SELECT</span> <span class="st0">'REF:1 - Define Static Variables'</span>;
  <span class="kw1">SELECT</span> @v_Now                      <span class="kw1">AS</span> <span class="br0">[</span><span class="kw2">GETDATE</span><span class="br0">]</span>
        ,@v_DB                       <span class="kw1">AS</span> <span class="br0">[</span>DB<span class="br0">]</span>
        ,@v_Obj                      <span class="kw1">AS</span> <span class="br0">[</span>OBJ<span class="br0">]</span>
        ,@v_App                      <span class="kw1">AS</span> <span class="br0">[</span>APP<span class="br0">]</span>
        ,@v_User                     <span class="kw1">AS</span> <span class="br0">[</span><span class="kw1">USER</span><span class="br0">]</span>
        ,@v_Spid                     <span class="kw1">AS</span> <span class="br0">[</span>SPID<span class="br0">]</span>
        ,@p_Batch_ID                 <span class="kw1">AS</span> <span class="br0">[</span>Batch_ID<span class="br0">]</span>;
&nbsp;
<span class="kw1">END</span>; <span class="co1">-- debug = 1    </span>
&nbsp;
<span class="coMULTI">/* Start the activity_log */</span>
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ActivityLog_ADD<span class="br0">]</span>
  @p_Error_ID                        <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_System                          <span class="sy0">=</span> @v_System,
  @p_DB                              <span class="sy0">=</span> @v_DB,
  @p_Obj                             <span class="sy0">=</span> @v_Obj,
  @p_App                             <span class="sy0">=</span> @v_App,
  @p_User                            <span class="sy0">=</span> @v_User,
  @p_Spid                            <span class="sy0">=</span> @v_Spid,
  @p_Description                     <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_StartTime                       <span class="sy0">=</span> @v_Now,
  @p_EndTime                         <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_ActivityLog_ID                  <span class="sy0">=</span> @v_ActivityLog_ID <span class="kw1">OUTPUT</span>;     
&nbsp;
<span class="co1">-- Start the batch</span>
<span class="kw1">IF</span> @p_Batch_ID <span class="kw1">IS</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>  <span class="co1">-- Create the batch</span>
  <span class="kw1">SELECT</span> @v_BatchStatus              <span class="sy0">=</span> <span class="nu0">1</span>;
  <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_Batch_ADD<span class="br0">]</span>
    @p_Batch_ID                      <span class="sy0">=</span> @p_Batch_ID <span class="kw1">OUTPUT</span>
   ,@p_Type_ID                       <span class="sy0">=</span> @v_Batch_Type_ID
   ,@p_Name                          <span class="sy0">=</span> @v_Obj
   ,@p_Parent_ID                     <span class="sy0">=</span> @v_ActivityLog_ID;
&nbsp;
<span class="kw1">END</span>;   <span class="co1">-- Create the batch   </span>
<span class="co1">-- Add the next record to the batch</span>
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_BatchDetail_ADD<span class="br0">]</span>
  @p_Batch_ID                        <span class="sy0">=</span> @p_Batch_ID,
  @p_Object_ID                       <span class="sy0">=</span> @v_ActivityLog_ID,
  @p_Object                          <span class="sy0">=</span> @v_Obj;           
  <span class="kw1">BEGIN</span> TRY
&nbsp;
<span class="co1">--==&gt;&gt; Start Code Here!</span>
  <span class="kw1">END</span> TRY
&nbsp;
  <span class="kw1">BEGIN</span> CATCH
&nbsp;
    <span class="kw1">SELECT</span> @v_Error                  <span class="sy0">=</span> 100000
          ,@v_MSG                    <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">NVARCHAR</span><span class="br0">&#40;</span><span class="nu0">2500</span><span class="br0">&#41;</span>, 
                                       <span class="st0">'Error: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_NUMBER<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span> 
                                       <span class="st0">' Severity: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_SEVERITY<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' State: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_STATE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' Line: '</span> <span class="sy0">+</span>  <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_L<span class="sy0">IN</span>E<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' Procedure: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_PROCEDURE<span class="br0">&#40;</span><span class="br0">&#41;</span>, @v_Obj<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' MSG: Error from [&lt;Name, SYSNAME, PU_DB_ADD&gt;]  with error:'</span> <span class="sy0">+</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_MESSAGE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;  
    <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ErrorLog_ADD<span class="br0">]</span>
      @p_Error_ID                    <span class="sy0">=</span> @v_Error,
      @p_System                      <span class="sy0">=</span> @v_System,
      @p_DB                          <span class="sy0">=</span> @v_DB,
      @p_Obj                         <span class="sy0">=</span> @v_Obj,
      @p_App                         <span class="sy0">=</span> @v_App,
      @p_User                        <span class="sy0">=</span> @v_User,
      @p_ErrorMsg                    <span class="sy0">=</span> @v_MSG;
&nbsp;
    <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ActivityLog_UPD<span class="br0">]</span>
      @p_ActivityLog_ID              <span class="sy0">=</span> @v_ActivityLog_ID,
      @p_EndTime                     <span class="sy0">=</span> @v_Now,
      @p_Error_ID                    <span class="sy0">=</span> @v_Error,
      @p_Active                      <span class="sy0">=</span> 0,
      @p_Description                 <span class="sy0">=</span> @v_MSG,
      @p_DateModified                <span class="sy0">=</span> @v_Now;    
    <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_BatchDetail_UPD<span class="br0">]</span>
      @p_ActivityLog_ID              <span class="sy0">=</span> @v_ActivityLog_ID
     ,@p_Batch_ID                    <span class="sy0">=</span> @p_Batch_ID
     ,@p_Now                         <span class="sy0">=</span> @v_Now;         
    <span class="kw1">RETURN</span> @v_Error;
&nbsp;
  <span class="kw1">END</span> CATCH;
EOF: 
<span class="coMULTI">/* Cleanup */</span>
<span class="coMULTI">/* Update the activity Log */</span>
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ActivityLog_UPD<span class="br0">]</span>
  @p_ActivityLog_ID                  <span class="sy0">=</span> @v_ActivityLog_ID,
  @p_EndTime                         <span class="sy0">=</span> @v_Now,
  @p_Active                          <span class="sy0">=</span> 0,
  @p_DateModified                    <span class="sy0">=</span> @v_Now;
&nbsp;
<span class="coMULTI">/* Update the batch detail */</span>
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_BatchDetail_UPD<span class="br0">]</span>
  @p_ActivityLog_ID                  <span class="sy0">=</span> @v_ActivityLog_ID
 ,@p_Batch_ID                        <span class="sy0">=</span> @p_Batch_ID
 ,@p_Now                             <span class="sy0">=</span> @v_Now;  
&nbsp;
<span class="kw1">IF</span> @v_BatchStatus                    <span class="sy0">=</span> 1
<span class="kw1">BEGIN</span>
  <span class="kw1">UPDATE</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_Batch<span class="br0">]</span>     <span class="kw1">WITH</span> <span class="br0">&#40;</span>ROWLOCK<span class="br0">&#41;</span>
     <span class="kw1">SET</span> <span class="br0">[</span>Active<span class="br0">]</span>                    <span class="sy0">=</span> 0
	    ,<span class="br0">[</span>DateModified<span class="br0">]</span>              <span class="sy0">=</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
   <span class="kw1">WHERE</span> <span class="br0">[</span>Batch_ID<span class="br0">]</span>                  <span class="sy0">=</span> @p_Batch_ID;
<span class="kw1">END</span>;  
GO   
<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span><span class="st0">'[dbo].[&lt;Name, SYSNAME, PU_DB_ADD&gt;]'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NOT</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&gt;&gt;&gt; CREATED PROCEDURE [dbo].[&lt;Name, SYSNAME, PU_DB_ADD&gt;] &lt;&lt;&lt;'</span>;
<span class="kw1">END</span>;
<span class="kw1">ELSE</span> 
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&gt;&gt;&gt; FAILED TO CREATE PROCEDURE [dbo].[&lt;Name, SYSNAME, PU_DB_ADD&gt;] &lt;&lt;&lt;'</span>;
<span class="kw1">END</span>;
GO</pre></div></div>



<h3 class="wp-block-heading"><strong>The Input Parameter</strong></h3>



<p>You’ll notice first that our Template has an input parameter called @p_Batch_ID and it is set to NULL.</p>



<div class="wp-block-image">
<figure class="aligncenter"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-1.png"><img loading="lazy" decoding="async" width="639" height="53" class="wp-image-4261" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-1.png" alt="a finished t-sql framework" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-1.png 639w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-1-300x25.png 300w" sizes="(max-width: 639px) 100vw, 639px" /></a></figure>
</div>



<p>You will see soon that if the @p_Batch_ID is NULL. This means it will be the first stored procedure in the batch. It may be the only stored proc that will execute, so that batch will only have a single execution. Otherwise, the parameter will be set and passed down to the nested procedures appropriately. You will see this in action when we get to our demos.</p>



<p>Next, we go directly under our activity log Insert and add the logic to check the @p_Batch_ID param:</p>



<div class="wp-block-image">
<figure class="aligncenter"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-2.png"><img loading="lazy" decoding="async" width="525" height="467" class="wp-image-4262" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-2.png" alt="" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-2.png 525w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-2-300x267.png 300w" sizes="(max-width: 525px) 100vw, 525px" /></a></figure>
</div>



<p>If the @p_Batch_ID was passed in and not null, this would not be the first procedure in the batch. It would skip this part of the logic if branch. But when it is the first procedure that will call other procs (we call this a wrapper procedure), we first set a variable called @v_BatchStatus to 1. This only remains in the scope of the current procedure and will not apply down the nested execution path.</p>



<p>When all the procedures nested have executed, the wrapper will come back to scope and we will check this variable. We’ll cover this more later when we get there. Now we will have a @p_Batch_ID and a value for @v_BatchStatus. We’ll add a record to the Batch Detail even if this is the only procedure that will execute.</p>



<div class="wp-block-image">
<figure class="aligncenter"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-3.png"><img loading="lazy" decoding="async" width="496" height="169" class="wp-image-4263" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-3.png" alt="" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-3.png 496w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-3-300x102.png 300w" sizes="(max-width: 496px) 100vw, 496px" /></a></figure>
</div>



<p>Looking at the PU_BatchDetail_ADD proc, we see that we are passing in the @p_Batch_ID parameter that we defined in the PU_Batch_ADD call. The @v_ActivityLog_ID is stuffed into the object_id (so we need more detail about the execution of this procedure we can go directly to the activity log), and the @v_Obj variable that we defined with our other scope variables is stuffed into the Object column. This allows us to group procedures in a wrapper/process while leveraging our other features. Benefit: quick access to more detailed information in the activity logs.</p>



<p>This completes the initial insertion of our batching process for grouping stored procedures. Now we will continue down the template where we update the detail records as we get close to the end of the procedure execution.</p>



<div class="wp-block-image">
<figure class="aligncenter"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-4.png"><img loading="lazy" decoding="async" width="554" height="152" class="wp-image-4264" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-4.png" alt="our glorious t-sql framework" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-4.png 554w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-4-300x82.png 300w" sizes="(max-width: 554px) 100vw, 554px" /></a></figure>
</div>



<p>Towards the end of the TRY CATCH logic, if there was an error, a call is made to the PU_BatchDetail_UPD procedure with the activitylog_ID and the Batch_ID Param. This enables the update to use those values in a distinct where clause, where it will close the detail record with an end time, and the error will be recorded in the error log and activity log accordingly.</p>



<div class="wp-block-image">
<figure class="aligncenter"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-5.png"><img loading="lazy" decoding="async" width="543" height="280" class="wp-image-4265" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-5.png" alt="" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-5.png 543w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-5-300x155.png 300w" sizes="(max-width: 543px) 100vw, 543px" /></a></figure>
</div>



<p>When the procedure executes successfully without an error, the same call is executed to the PU_BatchDetail_UPD procedure with the same parameters. We can expect corelating records in the error log and activity log will be absent an error as we would hope all executions would exit successfully.</p>



<p>Finally, we come to some logic that we touched on before where we evaluate the @v_BatchStatus variable:</p>



<div class="wp-block-image">
<figure class="aligncenter"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-6.png"><img loading="lazy" decoding="async" width="473" height="182" class="wp-image-4266" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-6.png" alt="" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-6.png 473w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-6-300x115.png 300w" sizes="(max-width: 473px) 100vw, 473px" /></a></figure>
</div>



<p>When we have executed all the nested procedures, control will bubble back up to the original procedure, the wrapper. The wrapper sets the batchstatus, so when the if logic checks equates to 1, we know we are at the wrapper and we can close off the Batch. We do this by setting the active flag to 0 and updating the datemodified column to GETDATE().</p>



<h3 class="wp-block-heading"><strong>The Demo Stage</strong></h3>



<p>That summarizes the Template of our T-SQL framework, which means we are code complete and ready to demo. Well … not quite ready to demo. We need to clean up our Error Log and Activity Log tables so they are new and ready for clean inserts.</p>



<p>The first table we clear is the TU_ActivityLog table by executing:</p>


<div id="wpshdo_24" class="wp-synhighlighter-outer"><div id="wpshdt_24" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_24"></a><a id="wpshat_24" class="wp-synhighlighter-title" href="#codesyntax_24"  onClick="javascript:wpsh_toggleBlock(24)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_24" onClick="javascript:wpsh_code(24)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_24" onClick="javascript:wpsh_print(24)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_24" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">TRUNCATE</span> <span class="kw1">TABLE</span> TU_ActivityLog;</pre></div></div>



<p>Next we do the same thing with the TU_Errorlog table:</p>


<div id="wpshdo_25" class="wp-synhighlighter-outer"><div id="wpshdt_25" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_25"></a><a id="wpshat_25" class="wp-synhighlighter-title" href="#codesyntax_25"  onClick="javascript:wpsh_toggleBlock(25)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_25" onClick="javascript:wpsh_code(25)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_25" onClick="javascript:wpsh_print(25)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_25" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">TRUNCATE</span> <span class="kw1">TABLE</span> TU_ErrorLog;</pre></div></div>



<p>Last we check the two tables to make sure they are clear:</p>



<div class="wp-block-image">
<figure class="aligncenter"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-7.png"><img loading="lazy" decoding="async" width="791" height="271" class="wp-image-4267" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-7.png" alt="" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-7.png 791w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-7-300x103.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-7-768x263.png 768w" sizes="(max-width: 791px) 100vw, 791px" /></a></figure>
</div>



<p>Now we can create some demo procedures to test and validate our T-SQL framework. For this demo, we will create a wrapper procedure called PU_Demo1. Yes, this was the same procedure in the last two features. We will drop and then recreate the PU_Demo1 Routine so it will be more clean without having too many demo procedures lagging behind. Plus, add two nested child procedures called PU_Demo2 and PU_Demo3.</p>



<ol class="wp-block-list">
<li>PU_Demo1 – the Wrapper will print PU_Demo1 and then call procedures PU_Demo2 and PU_Demo3</li>
<li>PU_Demo2 – the first nested procedure will print PU_Demo2 and exit back to the wrapper</li>
<li>PU_Demo3 – the final nested procedure will print PU_Demo3, then raise an error, and then exit back to the initiating wrapper procedure.</li>
</ol>



<p>In this case it will be easier to work backwards and develop PU_Demo3, then PU_Demo2, and last we will create PU_Demo1. Start with the code below, defining PU_Demo3. We copy our template code to a new query window and then press CTRL+SHIFT+M and type PU_Demo3 in the object line. We replace the start code here with:</p>


<div id="wpshdo_26" class="wp-synhighlighter-outer"><div id="wpshdt_26" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_26"></a><a id="wpshat_26" class="wp-synhighlighter-title" href="#codesyntax_26"  onClick="javascript:wpsh_toggleBlock(26)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_26" onClick="javascript:wpsh_code(26)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_26" onClick="javascript:wpsh_print(26)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_26" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">SELECT</span> <span class="st0">'This is PU_Demo3'</span>
    <span class="kw1">RAISERROR</span> <span class="br0">&#40;</span><span class="st0">'Message'</span>, 19, 1<span class="br0">&#41;</span> <span class="kw1">WITH</span> <span class="kw2">LOG</span></pre></div></div>



<p>The PU_Demo3 procedure is available in its whole below for completeness.</p>


<div id="wpshdo_27" class="wp-synhighlighter-outer"><div id="wpshdt_27" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_27"></a><a id="wpshat_27" class="wp-synhighlighter-title" href="#codesyntax_27"  onClick="javascript:wpsh_toggleBlock(27)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_27" onClick="javascript:wpsh_code(27)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_27" onClick="javascript:wpsh_print(27)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_27" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> DBCATCH
GO
<span class="kw1">IF</span> <span class="sy0">EXISTS</span><span class="br0">&#40;</span><span class="kw1">SELECT</span> 1
            <span class="kw1">FROM</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>sysobjects<span class="br0">]</span> <span class="br0">&#40;</span>NOLOCK<span class="br0">&#41;</span>
           <span class="kw1">WHERE</span> <span class="br0">[</span>id<span class="br0">]</span>                                            <span class="sy0">=</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span>N<span class="st0">'[dbo].[PU_Demo3]'</span><span class="br0">&#41;</span>
             <span class="sy0">AND</span> <span class="kw2">OBJECTPROPERTY</span><span class="br0">&#40;</span><span class="br0">[</span>id<span class="br0">]</span>, N<span class="st0">'IsProcedure'</span><span class="br0">&#41;</span>            <span class="sy0">=</span> 1<span class="br0">&#41;</span> 
<span class="kw1">BEGIN</span> 
  <span class="kw1">DROP</span> <span class="kw1">PROCEDURE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_Demo3<span class="br0">]</span>;
&nbsp;
  <span class="kw1">PRINT</span> <span class="st0">'&gt;&gt;&gt; DROPPED PROCEDURE [dbo].[PU_Demo3] &lt;&lt;&lt;'</span>;
<span class="kw1">END</span> 
GO
<span class="kw1">CREATE</span> <span class="kw1">PROC</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_Demo3<span class="br0">]</span>
  @p_Batch_ID                        <span class="br0">[</span><span class="kw1">UNIQUEIDENTIFIER</span><span class="br0">]</span>          <span class="sy0">=</span> <span class="sy0">NULL</span>
<span class="kw1">WITH</span> ENCRYPTION
<span class="kw1">AS</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* Name        : PU_Demo3                                                      */</span>
<span class="coMULTI">/* Version     : 1.0                                                                             */</span>
<span class="coMULTI">/* Author      : Jared Kirkpatrick                                                               */</span>
<span class="coMULTI">/* Date        : 2019-08-24                                                                      */</span>
<span class="coMULTI">/* Description :                                                                                 */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* Date        : Version: Who: Description                                                       */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* 2019-08-24  : 1.0    : JSK: Initial Release.                                                */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="kw1">SET</span> <span class="kw1">NOCOUNT</span> <span class="kw1">ON</span>;
<span class="coMULTI">/* Declare Variables */</span>
<span class="kw1">DECLARE</span> @v_Error                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_MSG                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>500<span class="br0">&#41;</span>
       ,@v_DB                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Obj                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_App                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_User                      <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Spid                      <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_ActivityLog_ID            <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_ADesc                     <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>512<span class="br0">&#41;</span>
       ,@v_BatchStatus               <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>
       ,@v_Now                       <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>
       ,@v_LastErrorDate             <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>
       ,@v_SystemName                <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_RowCount                  <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Count                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Min<span class="sy0">IN</span>T                    <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Max<span class="sy0">IN</span>T                    <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Version                   <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>       
       ,@v_KeyWord                   <span class="br0">[</span>SYSNAME<span class="br0">]</span>   
       ,@v_MSSQL_ID                  <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Domain                    <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>  
       ,@v_Batch_Type_ID             <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span> 
	   ,@v_System                    <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_SQL                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>4000<span class="br0">&#41;</span>  
       ,@v_UserName                  <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_PW                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Debug                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>;
&nbsp;
<span class="kw1">SELECT</span> @v_Now                        <span class="sy0">=</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_DB                         <span class="sy0">=</span> <span class="kw2">DB_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_Obj                        <span class="sy0">=</span> <span class="st0">'[DBCATCH].[dbo].[PU_Demo3]'</span>
      ,@v_App                        <span class="sy0">=</span> <span class="kw2">APP_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_User                       <span class="sy0">=</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span><span class="sy0">OR</span>IG<span class="sy0">IN</span>AL_LOG<span class="sy0">IN</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">USER_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
      ,@v_Spid                       <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>25<span class="br0">&#41;</span>, <span class="kw2">@@SPID</span><span class="br0">&#41;</span>
	  ,@v_Batch_Type_ID              <span class="sy0">=</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>FSU_Code_GET<span class="br0">]</span><span class="br0">&#40;</span><span class="st0">'Batch'</span>, <span class="st0">'PROCEDURE'</span><span class="br0">&#41;</span>
	  ,@v_System                     <span class="sy0">=</span> <span class="kw2">HOST_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_Debug                      <span class="sy0">=</span> <span class="nu0">0</span>;  
&nbsp;
&nbsp;
<span class="coMULTI">/* Create Temp Tables */</span>
&nbsp;
<span class="kw1">IF</span> @v_Debug                          <span class="sy0">=</span> 1
<span class="kw1">BEGIN</span> <span class="co1">-- debug = 1 Ref: 1</span>
  <span class="kw1">SELECT</span> <span class="st0">'REF:1 - Define Static Variables'</span>;
  <span class="kw1">SELECT</span> @v_Now                      <span class="kw1">AS</span> <span class="br0">[</span><span class="kw2">GETDATE</span><span class="br0">]</span>
        ,@v_DB                       <span class="kw1">AS</span> <span class="br0">[</span>DB<span class="br0">]</span>
        ,@v_Obj                      <span class="kw1">AS</span> <span class="br0">[</span>OBJ<span class="br0">]</span>
        ,@v_App                      <span class="kw1">AS</span> <span class="br0">[</span>APP<span class="br0">]</span>
        ,@v_User                     <span class="kw1">AS</span> <span class="br0">[</span><span class="kw1">USER</span><span class="br0">]</span>
        ,@v_Spid                     <span class="kw1">AS</span> <span class="br0">[</span>SPID<span class="br0">]</span>
        ,@p_Batch_ID                 <span class="kw1">AS</span> <span class="br0">[</span>Batch_ID<span class="br0">]</span>;
&nbsp;
<span class="kw1">END</span>; <span class="co1">-- debug = 1    </span>
&nbsp;
<span class="coMULTI">/* Start the activity_log */</span>
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ActivityLog_ADD<span class="br0">]</span>
  @p_Error_ID                        <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_System                          <span class="sy0">=</span> @v_System,
  @p_DB                              <span class="sy0">=</span> @v_DB,
  @p_Obj                             <span class="sy0">=</span> @v_Obj,
  @p_App                             <span class="sy0">=</span> @v_App,
  @p_User                            <span class="sy0">=</span> @v_User,
  @p_Spid                            <span class="sy0">=</span> @v_Spid,
  @p_Description                     <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_StartTime                       <span class="sy0">=</span> @v_Now,
  @p_EndTime                         <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_ActivityLog_ID                  <span class="sy0">=</span> @v_ActivityLog_ID <span class="kw1">OUTPUT</span>;     
&nbsp;
<span class="co1">-- Start the batch</span>
<span class="kw1">IF</span> @p_Batch_ID <span class="kw1">IS</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>  <span class="co1">-- Create the batch</span>
  <span class="kw1">SELECT</span> @v_BatchStatus              <span class="sy0">=</span> <span class="nu0">1</span>;
  <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_Batch_ADD<span class="br0">]</span>
    @p_Batch_ID                      <span class="sy0">=</span> @p_Batch_ID <span class="kw1">OUTPUT</span>
   ,@p_Type_ID                       <span class="sy0">=</span> @v_Batch_Type_ID
   ,@p_Name                          <span class="sy0">=</span> @v_Obj
   ,@p_Parent_ID                     <span class="sy0">=</span> @v_ActivityLog_ID;
&nbsp;
<span class="kw1">END</span>;   <span class="co1">-- Create the batch   </span>
<span class="co1">-- Add the next record to the batch</span>
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_BatchDetail_ADD<span class="br0">]</span>
  @p_Batch_ID                        <span class="sy0">=</span> @p_Batch_ID,
  @p_Object_ID                       <span class="sy0">=</span> @v_ActivityLog_ID,
  @p_Object                          <span class="sy0">=</span> @v_Obj;           
  <span class="kw1">BEGIN</span> TRY
&nbsp;
<span class="kw1">SELECT</span> <span class="st0">'This is PU_Demo3'</span>
    <span class="kw1">RAISERROR</span> <span class="br0">&#40;</span><span class="st0">'Message'</span>, 19, 1<span class="br0">&#41;</span> <span class="kw1">WITH</span> <span class="kw2">LOG</span>
  <span class="kw1">END</span> TRY
&nbsp;
  <span class="kw1">BEGIN</span> CATCH
&nbsp;
    <span class="kw1">SELECT</span> @v_Error                  <span class="sy0">=</span> 100000
          ,@v_MSG                    <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">NVARCHAR</span><span class="br0">&#40;</span><span class="nu0">2500</span><span class="br0">&#41;</span>, 
                                       <span class="st0">'Error: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_NUMBER<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span> 
                                       <span class="st0">' Severity: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_SEVERITY<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' State: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_STATE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' Line: '</span> <span class="sy0">+</span>  <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_L<span class="sy0">IN</span>E<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' Procedure: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_PROCEDURE<span class="br0">&#40;</span><span class="br0">&#41;</span>, @v_Obj<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' MSG: Error from PU_Demo3 with error:'</span> <span class="sy0">+</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_MESSAGE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;  
    <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ErrorLog_ADD<span class="br0">]</span>
      @p_Error_ID                    <span class="sy0">=</span> @v_Error,
      @p_System                      <span class="sy0">=</span> @v_System,
      @p_DB                          <span class="sy0">=</span> @v_DB,
      @p_Obj                         <span class="sy0">=</span> @v_Obj,
      @p_App                         <span class="sy0">=</span> @v_App,
      @p_User                        <span class="sy0">=</span> @v_User,
      @p_ErrorMsg                    <span class="sy0">=</span> @v_MSG;
&nbsp;
    <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ActivityLog_UPD<span class="br0">]</span>
      @p_ActivityLog_ID              <span class="sy0">=</span> @v_ActivityLog_ID,
      @p_EndTime                     <span class="sy0">=</span> @v_Now,
      @p_Error_ID                    <span class="sy0">=</span> @v_Error,
      @p_Active                      <span class="sy0">=</span> 0,
      @p_Description                 <span class="sy0">=</span> @v_MSG,
      @p_DateModified                <span class="sy0">=</span> @v_Now;    
    <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_BatchDetail_UPD<span class="br0">]</span>
      @p_ActivityLog_ID              <span class="sy0">=</span> @v_ActivityLog_ID
     ,@p_Batch_ID                    <span class="sy0">=</span> @p_Batch_ID
     ,@p_Now                         <span class="sy0">=</span> @v_Now;         
    <span class="kw1">RETURN</span> @v_Error;
&nbsp;
  <span class="kw1">END</span> CATCH;
EOF: 
<span class="coMULTI">/* Cleanup */</span>
<span class="coMULTI">/* Update the activity Log */</span>
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ActivityLog_UPD<span class="br0">]</span>
  @p_ActivityLog_ID                  <span class="sy0">=</span> @v_ActivityLog_ID,
  @p_EndTime                         <span class="sy0">=</span> @v_Now,
  @p_Active                          <span class="sy0">=</span> 0,
  @p_DateModified                    <span class="sy0">=</span> @v_Now;
&nbsp;
<span class="coMULTI">/* Update the batch detail */</span>
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_BatchDetail_UPD<span class="br0">]</span>
  @p_ActivityLog_ID                  <span class="sy0">=</span> @v_ActivityLog_ID
 ,@p_Batch_ID                        <span class="sy0">=</span> @p_Batch_ID
 ,@p_Now                             <span class="sy0">=</span> @v_Now;  
&nbsp;
<span class="kw1">IF</span> @v_BatchStatus                    <span class="sy0">=</span> 1
<span class="kw1">BEGIN</span>
  <span class="kw1">UPDATE</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_Batch<span class="br0">]</span>     <span class="kw1">WITH</span> <span class="br0">&#40;</span>ROWLOCK<span class="br0">&#41;</span>
     <span class="kw1">SET</span> <span class="br0">[</span>Active<span class="br0">]</span>                    <span class="sy0">=</span> 0
	    ,<span class="br0">[</span>DateModified<span class="br0">]</span>              <span class="sy0">=</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
   <span class="kw1">WHERE</span> <span class="br0">[</span>Batch_ID<span class="br0">]</span>                  <span class="sy0">=</span> @p_Batch_ID;
<span class="kw1">END</span>;  
GO   
<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span><span class="st0">'[dbo].[PU_Demo3]'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NOT</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&gt;&gt;&gt; CREATED PROCEDURE [dbo].[PU_Demo3] &lt;&lt;&lt;'</span>;
<span class="kw1">END</span>;
<span class="kw1">ELSE</span> 
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&gt;&gt;&gt; FAILED TO CREATE PROCEDURE [dbo].[PU_Demo3] &lt;&lt;&lt;'</span>;
<span class="kw1">END</span>;
GO</pre></div></div>



<p>The next procedure PU_Demo2 we will copy the template code to a new query window, press CTRL+SHIFT+M, and type the name PU_Demo2. Go down to the middle of the procedure where it says:</p>



<p><span style="color: #00ff00;">==&gt;&gt; Start Code Here!</span></p>



<p>And replace that with:</p>


<div id="wpshdo_28" class="wp-synhighlighter-outer"><div id="wpshdt_28" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_28"></a><a id="wpshat_28" class="wp-synhighlighter-title" href="#codesyntax_28"  onClick="javascript:wpsh_toggleBlock(28)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_28" onClick="javascript:wpsh_code(28)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_28" onClick="javascript:wpsh_print(28)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_28" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">SELECT</span> <span class="st0">'This is PU_Demo2'</span></pre></div></div>



<p>The complete code for PU_Demo2 is below:</p>


<div id="wpshdo_29" class="wp-synhighlighter-outer"><div id="wpshdt_29" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_29"></a><a id="wpshat_29" class="wp-synhighlighter-title" href="#codesyntax_29"  onClick="javascript:wpsh_toggleBlock(29)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_29" onClick="javascript:wpsh_code(29)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_29" onClick="javascript:wpsh_print(29)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_29" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> DBCATCH
GO
<span class="kw1">IF</span> <span class="sy0">EXISTS</span><span class="br0">&#40;</span><span class="kw1">SELECT</span> 1
            <span class="kw1">FROM</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>sysobjects<span class="br0">]</span> <span class="br0">&#40;</span>NOLOCK<span class="br0">&#41;</span>
           <span class="kw1">WHERE</span> <span class="br0">[</span>id<span class="br0">]</span>                                            <span class="sy0">=</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span>N<span class="st0">'[dbo].[PU_Demo2]'</span><span class="br0">&#41;</span>
             <span class="sy0">AND</span> <span class="kw2">OBJECTPROPERTY</span><span class="br0">&#40;</span><span class="br0">[</span>id<span class="br0">]</span>, N<span class="st0">'IsProcedure'</span><span class="br0">&#41;</span>            <span class="sy0">=</span> 1<span class="br0">&#41;</span> 
<span class="kw1">BEGIN</span> 
  <span class="kw1">DROP</span> <span class="kw1">PROCEDURE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_Demo2<span class="br0">]</span>;
&nbsp;
  <span class="kw1">PRINT</span> <span class="st0">'&gt;&gt;&gt; DROPPED PROCEDURE [dbo].[PU_Demo2] &lt;&lt;&lt;'</span>;
<span class="kw1">END</span> 
GO
<span class="kw1">CREATE</span> <span class="kw1">PROC</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_Demo2<span class="br0">]</span>
  @p_Batch_ID                        <span class="br0">[</span><span class="kw1">UNIQUEIDENTIFIER</span><span class="br0">]</span>          <span class="sy0">=</span> <span class="sy0">NULL</span>
<span class="kw1">WITH</span> ENCRYPTION
<span class="kw1">AS</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* Name        : PU_Demo2                                                      */</span>
<span class="coMULTI">/* Version     : 1.0                                                                             */</span>
<span class="coMULTI">/* Author      : Jared Kirkpatrick                                                               */</span>
<span class="coMULTI">/* Date        : 2019-05-24                                                                      */</span>
<span class="coMULTI">/* Description :                                                                                 */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* Date        : Version: Who: Description                                                       */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* 2019-05-24  : 1.0    : JSK: Initial Release.                                                */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="kw1">SET</span> <span class="kw1">NOCOUNT</span> <span class="kw1">ON</span>;
<span class="coMULTI">/* Declare Variables */</span>
<span class="kw1">DECLARE</span> @v_Error                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_MSG                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>500<span class="br0">&#41;</span>
       ,@v_DB                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Obj                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_App                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_User                      <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Spid                      <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_ActivityLog_ID            <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_ADesc                     <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>512<span class="br0">&#41;</span>
       ,@v_BatchStatus               <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>
       ,@v_Now                       <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>
       ,@v_LastErrorDate             <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>
       ,@v_SystemName                <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_RowCount                  <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Count                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Min<span class="sy0">IN</span>T                    <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Max<span class="sy0">IN</span>T                    <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Version                   <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>       
       ,@v_KeyWord                   <span class="br0">[</span>SYSNAME<span class="br0">]</span>   
       ,@v_MSSQL_ID                  <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Domain                    <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>  
       ,@v_Batch_Type_ID             <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span> 
	   ,@v_System                    <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_SQL                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>4000<span class="br0">&#41;</span>  
       ,@v_UserName                  <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_PW                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Debug                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>;
&nbsp;
<span class="kw1">SELECT</span> @v_Now                        <span class="sy0">=</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_DB                         <span class="sy0">=</span> <span class="kw2">DB_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_Obj                        <span class="sy0">=</span> <span class="st0">'[DBCATCH].[dbo].[PU_Demo2]'</span>
      ,@v_App                        <span class="sy0">=</span> <span class="kw2">APP_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_User                       <span class="sy0">=</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span><span class="sy0">OR</span>IG<span class="sy0">IN</span>AL_LOG<span class="sy0">IN</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">USER_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
      ,@v_Spid                       <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>25<span class="br0">&#41;</span>, <span class="kw2">@@SPID</span><span class="br0">&#41;</span>
	  ,@v_Batch_Type_ID              <span class="sy0">=</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>FSU_Code_GET<span class="br0">]</span><span class="br0">&#40;</span><span class="st0">'Batch'</span>, <span class="st0">'PROCEDURE'</span><span class="br0">&#41;</span>
	  ,@v_System                     <span class="sy0">=</span> <span class="kw2">HOST_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_Debug                      <span class="sy0">=</span> <span class="nu0">0</span>;  
&nbsp;
&nbsp;
<span class="coMULTI">/* Create Temp Tables */</span>
&nbsp;
<span class="kw1">IF</span> @v_Debug                          <span class="sy0">=</span> 1
<span class="kw1">BEGIN</span> <span class="co1">-- debug = 1 Ref: 1</span>
  <span class="kw1">SELECT</span> <span class="st0">'REF:1 - Define Static Variables'</span>;
  <span class="kw1">SELECT</span> @v_Now                      <span class="kw1">AS</span> <span class="br0">[</span><span class="kw2">GETDATE</span><span class="br0">]</span>
        ,@v_DB                       <span class="kw1">AS</span> <span class="br0">[</span>DB<span class="br0">]</span>
        ,@v_Obj                      <span class="kw1">AS</span> <span class="br0">[</span>OBJ<span class="br0">]</span>
        ,@v_App                      <span class="kw1">AS</span> <span class="br0">[</span>APP<span class="br0">]</span>
        ,@v_User                     <span class="kw1">AS</span> <span class="br0">[</span><span class="kw1">USER</span><span class="br0">]</span>
        ,@v_Spid                     <span class="kw1">AS</span> <span class="br0">[</span>SPID<span class="br0">]</span>
        ,@p_Batch_ID                 <span class="kw1">AS</span> <span class="br0">[</span>Batch_ID<span class="br0">]</span>;
&nbsp;
<span class="kw1">END</span>; <span class="co1">-- debug = 1    </span>
&nbsp;
<span class="coMULTI">/* Start the activity_log */</span>
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ActivityLog_ADD<span class="br0">]</span>
  @p_Error_ID                        <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_System                          <span class="sy0">=</span> @v_System,
  @p_DB                              <span class="sy0">=</span> @v_DB,
  @p_Obj                             <span class="sy0">=</span> @v_Obj,
  @p_App                             <span class="sy0">=</span> @v_App,
  @p_User                            <span class="sy0">=</span> @v_User,
  @p_Spid                            <span class="sy0">=</span> @v_Spid,
  @p_Description                     <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_StartTime                       <span class="sy0">=</span> @v_Now,
  @p_EndTime                         <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_ActivityLog_ID                  <span class="sy0">=</span> @v_ActivityLog_ID <span class="kw1">OUTPUT</span>;     
&nbsp;
<span class="co1">-- Start the batch</span>
<span class="kw1">IF</span> @p_Batch_ID <span class="kw1">IS</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>  <span class="co1">-- Create the batch</span>
  <span class="kw1">SELECT</span> @v_BatchStatus              <span class="sy0">=</span> <span class="nu0">1</span>;
  <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_Batch_ADD<span class="br0">]</span>
    @p_Batch_ID                      <span class="sy0">=</span> @p_Batch_ID <span class="kw1">OUTPUT</span>
   ,@p_Type_ID                       <span class="sy0">=</span> @v_Batch_Type_ID
   ,@p_Name                          <span class="sy0">=</span> @v_Obj
   ,@p_Parent_ID                     <span class="sy0">=</span> @v_ActivityLog_ID;
&nbsp;
<span class="kw1">END</span>;   <span class="co1">-- Create the batch   </span>
<span class="co1">-- Add the next record to the batch</span>
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_BatchDetail_ADD<span class="br0">]</span>
  @p_Batch_ID                        <span class="sy0">=</span> @p_Batch_ID,
  @p_Object_ID                       <span class="sy0">=</span> @v_ActivityLog_ID,
  @p_Object                          <span class="sy0">=</span> @v_Obj;           
  <span class="kw1">BEGIN</span> TRY
&nbsp;
    <span class="kw1">SELECT</span> <span class="st0">'This is PU_Demo2'</span>
  <span class="kw1">END</span> TRY
&nbsp;
  <span class="kw1">BEGIN</span> CATCH
&nbsp;
    <span class="kw1">SELECT</span> @v_Error                  <span class="sy0">=</span> 100000
          ,@v_MSG                    <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">NVARCHAR</span><span class="br0">&#40;</span><span class="nu0">2500</span><span class="br0">&#41;</span>, 
                                       <span class="st0">'Error: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_NUMBER<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span> 
                                       <span class="st0">' Severity: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_SEVERITY<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' State: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_STATE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' Line: '</span> <span class="sy0">+</span>  <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_L<span class="sy0">IN</span>E<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' Procedure: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_PROCEDURE<span class="br0">&#40;</span><span class="br0">&#41;</span>, @v_Obj<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' MSG: Error from [PU_Demo2]  with error:'</span> <span class="sy0">+</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_MESSAGE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;  
    <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ErrorLog_ADD<span class="br0">]</span>
      @p_Error_ID                    <span class="sy0">=</span> @v_Error,
      @p_System                      <span class="sy0">=</span> @v_System,
      @p_DB                          <span class="sy0">=</span> @v_DB,
      @p_Obj                         <span class="sy0">=</span> @v_Obj,
      @p_App                         <span class="sy0">=</span> @v_App,
      @p_User                        <span class="sy0">=</span> @v_User,
      @p_ErrorMsg                    <span class="sy0">=</span> @v_MSG;
&nbsp;
    <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ActivityLog_UPD<span class="br0">]</span>
      @p_ActivityLog_ID              <span class="sy0">=</span> @v_ActivityLog_ID,
      @p_EndTime                     <span class="sy0">=</span> @v_Now,
      @p_Error_ID                    <span class="sy0">=</span> @v_Error,
      @p_Active                      <span class="sy0">=</span> 0,
      @p_Description                 <span class="sy0">=</span> @v_MSG,
      @p_DateModified                <span class="sy0">=</span> @v_Now;    
    <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_BatchDetail_UPD<span class="br0">]</span>
      @p_ActivityLog_ID              <span class="sy0">=</span> @v_ActivityLog_ID
     ,@p_Batch_ID                    <span class="sy0">=</span> @p_Batch_ID
     ,@p_Now                         <span class="sy0">=</span> @v_Now;         
    <span class="kw1">RETURN</span> @v_Error;
&nbsp;
  <span class="kw1">END</span> CATCH;
EOF: 
<span class="coMULTI">/* Cleanup */</span>
<span class="coMULTI">/* Update the activity Log */</span>
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ActivityLog_UPD<span class="br0">]</span>
  @p_ActivityLog_ID                  <span class="sy0">=</span> @v_ActivityLog_ID,
  @p_EndTime                         <span class="sy0">=</span> @v_Now,
  @p_Active                          <span class="sy0">=</span> 0,
  @p_DateModified                    <span class="sy0">=</span> @v_Now;
&nbsp;
<span class="coMULTI">/* Update the batch detail */</span>
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_BatchDetail_UPD<span class="br0">]</span>
  @p_ActivityLog_ID                  <span class="sy0">=</span> @v_ActivityLog_ID
 ,@p_Batch_ID                        <span class="sy0">=</span> @p_Batch_ID
 ,@p_Now                             <span class="sy0">=</span> @v_Now;  
&nbsp;
<span class="kw1">IF</span> @v_BatchStatus                    <span class="sy0">=</span> 1
<span class="kw1">BEGIN</span>
  <span class="kw1">UPDATE</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_Batch<span class="br0">]</span>     <span class="kw1">WITH</span> <span class="br0">&#40;</span>ROWLOCK<span class="br0">&#41;</span>
     <span class="kw1">SET</span> <span class="br0">[</span>Active<span class="br0">]</span>                    <span class="sy0">=</span> 0
	    ,<span class="br0">[</span>DateModified<span class="br0">]</span>              <span class="sy0">=</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
   <span class="kw1">WHERE</span> <span class="br0">[</span>Batch_ID<span class="br0">]</span>                  <span class="sy0">=</span> @p_Batch_ID;
<span class="kw1">END</span>;  
GO   
<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span><span class="st0">'[dbo].[PU_Demo2]'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NOT</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&gt;&gt;&gt; CREATED PROCEDURE [dbo].[PU_Demo2] &lt;&lt;&lt;'</span>;
<span class="kw1">END</span>;
<span class="kw1">ELSE</span> 
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&gt;&gt;&gt; FAILED TO CREATE PROCEDURE [dbo].[PU_Demo2] &lt;&lt;&lt;'</span>;
<span class="kw1">END</span>;
GO</pre></div></div>



<h3 class="wp-block-heading"><strong>Executing PU_Demo1</strong></h3>



<p>The last procedure (which is really the first procedure/wrapper) will call the other two procedures. To create PU_Demo1, copy the template to a new query window, press CTRL_SHIFT+M, and then replace <span style="color: #00ff00;">==&gt;&gt; Start Code Here!</span> with the following commands:</p>


<div id="wpshdo_30" class="wp-synhighlighter-outer"><div id="wpshdt_30" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_30"></a><a id="wpshat_30" class="wp-synhighlighter-title" href="#codesyntax_30"  onClick="javascript:wpsh_toggleBlock(30)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_30" onClick="javascript:wpsh_code(30)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_30" onClick="javascript:wpsh_print(30)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_30" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">SELECT</span> <span class="st0">'This is PU_Demo1'</span>;
		<span class="kw1">EXEC</span> PU_Demo2
		  @p_Batch_ID <span class="sy0">=</span> @p_Batch_ID;
		<span class="kw1">EXEC</span> PU_Demo3
		  @p_Batch_ID <span class="sy0">=</span> @p_Batch_ID;</pre></div></div>



<p>I will show the complete code in a moment below, but first look at the code snippet above. We will execute PU_Demo1 which will have a NULL @p_Batch_ID.</p>



<ol class="wp-block-list">
<li>It will then call PU_Batch_ADD which will insert a record for the Batch table</li>
<li>Assigns a value to @p_Batch_ID which we will receive back in the PU_Demo1 scope as an output param</li>
<li>Sets the @v_Batchstatus to 1</li>
<li>Will call PU_BatchDetail_ADD that will insert a record in the batch detail table</li>
<li>Call PU_Demo2
<ol>
<li>Will call PU_BatchDetail_ADD that will insert a record in the batch detail table</li>
<li>Call PU_BatchDetailUPD that will update the batchdetail record with the end date</li>
</ol>
</li>
<li>Call PU_Demo2
<ol>
<li>Will call PU_BatchDetail_ADD that will insert a record in the batch detail table</li>
<li>Call PU_BatchDetailUPD that will update the batchdetail record with the end date</li>
</ol>
</li>
<li>Call PU_BatchDetailUPD that will update the batchdetail record with the end date</li>
<li>Update TU_Batch and close the batch with an end date.</li>
</ol>



<p>Here is the code for PU_Demo1 shown below:</p>


<div id="wpshdo_31" class="wp-synhighlighter-outer"><div id="wpshdt_31" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_31"></a><a id="wpshat_31" class="wp-synhighlighter-title" href="#codesyntax_31"  onClick="javascript:wpsh_toggleBlock(31)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_31" onClick="javascript:wpsh_code(31)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_31" onClick="javascript:wpsh_print(31)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_31" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> DBCATCH
GO
<span class="kw1">IF</span> <span class="sy0">EXISTS</span><span class="br0">&#40;</span><span class="kw1">SELECT</span> 1
            <span class="kw1">FROM</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>sysobjects<span class="br0">]</span> <span class="br0">&#40;</span>NOLOCK<span class="br0">&#41;</span>
           <span class="kw1">WHERE</span> <span class="br0">[</span>id<span class="br0">]</span>                                            <span class="sy0">=</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span>N<span class="st0">'[dbo].[PU_Demo1]'</span><span class="br0">&#41;</span>
             <span class="sy0">AND</span> <span class="kw2">OBJECTPROPERTY</span><span class="br0">&#40;</span><span class="br0">[</span>id<span class="br0">]</span>, N<span class="st0">'IsProcedure'</span><span class="br0">&#41;</span>            <span class="sy0">=</span> 1<span class="br0">&#41;</span> 
<span class="kw1">BEGIN</span> 
  <span class="kw1">DROP</span> <span class="kw1">PROCEDURE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_Demo1<span class="br0">]</span>;
&nbsp;
  <span class="kw1">PRINT</span> <span class="st0">'&gt;&gt;&gt; DROPPED PROCEDURE [dbo].[PU_Demo1] &lt;&lt;&lt;'</span>;
<span class="kw1">END</span> 
GO
<span class="kw1">CREATE</span> <span class="kw1">PROC</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_Demo1<span class="br0">]</span>
  @p_Batch_ID                        <span class="br0">[</span><span class="kw1">UNIQUEIDENTIFIER</span><span class="br0">]</span>          <span class="sy0">=</span> <span class="sy0">NULL</span>
<span class="kw1">WITH</span> ENCRYPTION
<span class="kw1">AS</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* Name        : PU_Demo1                                                      */</span>
<span class="coMULTI">/* Version     : 1.0                                                                             */</span>
<span class="coMULTI">/* Author      : Jared Kirkpatrick                                                               */</span>
<span class="coMULTI">/* Date        : 2019-05-24                                                                      */</span>
<span class="coMULTI">/* Description :                                                                                 */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* Date        : Version: Who: Description                                                       */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* 2019-05-24  : 1.0    : JSK: Initial Release.                                                */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="kw1">SET</span> <span class="kw1">NOCOUNT</span> <span class="kw1">ON</span>;
<span class="coMULTI">/* Declare Variables */</span>
<span class="kw1">DECLARE</span> @v_Error                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_MSG                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>500<span class="br0">&#41;</span>
       ,@v_DB                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Obj                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_App                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_User                      <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Spid                      <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_ActivityLog_ID            <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_ADesc                     <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>512<span class="br0">&#41;</span>
       ,@v_BatchStatus               <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>
       ,@v_Now                       <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>
       ,@v_LastErrorDate             <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>
       ,@v_SystemName                <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_RowCount                  <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Count                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Min<span class="sy0">IN</span>T                    <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Max<span class="sy0">IN</span>T                    <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Version                   <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>       
       ,@v_KeyWord                   <span class="br0">[</span>SYSNAME<span class="br0">]</span>   
       ,@v_MSSQL_ID                  <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Domain                    <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>  
       ,@v_Batch_Type_ID             <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span> 
	   ,@v_System                    <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_SQL                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>4000<span class="br0">&#41;</span>  
       ,@v_UserName                  <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_PW                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Debug                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>;
&nbsp;
<span class="kw1">SELECT</span> @v_Now                        <span class="sy0">=</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_DB                         <span class="sy0">=</span> <span class="kw2">DB_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_Obj                        <span class="sy0">=</span> <span class="st0">'[DBCATCH].[dbo].[PU_Demo1]'</span>
      ,@v_App                        <span class="sy0">=</span> <span class="kw2">APP_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_User                       <span class="sy0">=</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span><span class="sy0">OR</span>IG<span class="sy0">IN</span>AL_LOG<span class="sy0">IN</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">USER_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
      ,@v_Spid                       <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>25<span class="br0">&#41;</span>, <span class="kw2">@@SPID</span><span class="br0">&#41;</span>
	  ,@v_Batch_Type_ID              <span class="sy0">=</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>FSU_Code_GET<span class="br0">]</span><span class="br0">&#40;</span><span class="st0">'Batch'</span>, <span class="st0">'PROCEDURE'</span><span class="br0">&#41;</span>
	  ,@v_System                     <span class="sy0">=</span> <span class="kw2">HOST_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_Debug                      <span class="sy0">=</span> <span class="nu0">0</span>;  
&nbsp;
&nbsp;
<span class="coMULTI">/* Create Temp Tables */</span>
&nbsp;
<span class="kw1">IF</span> @v_Debug                          <span class="sy0">=</span> 1
<span class="kw1">BEGIN</span> <span class="co1">-- debug = 1 Ref: 1</span>
  <span class="kw1">SELECT</span> <span class="st0">'REF:1 - Define Static Variables'</span>;
  <span class="kw1">SELECT</span> @v_Now                      <span class="kw1">AS</span> <span class="br0">[</span><span class="kw2">GETDATE</span><span class="br0">]</span>
        ,@v_DB                       <span class="kw1">AS</span> <span class="br0">[</span>DB<span class="br0">]</span>
        ,@v_Obj                      <span class="kw1">AS</span> <span class="br0">[</span>OBJ<span class="br0">]</span>
        ,@v_App                      <span class="kw1">AS</span> <span class="br0">[</span>APP<span class="br0">]</span>
        ,@v_User                     <span class="kw1">AS</span> <span class="br0">[</span><span class="kw1">USER</span><span class="br0">]</span>
        ,@v_Spid                     <span class="kw1">AS</span> <span class="br0">[</span>SPID<span class="br0">]</span>
        ,@p_Batch_ID                 <span class="kw1">AS</span> <span class="br0">[</span>Batch_ID<span class="br0">]</span>;
&nbsp;
<span class="kw1">END</span>; <span class="co1">-- debug = 1    </span>
&nbsp;
<span class="coMULTI">/* Start the activity_log */</span>
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ActivityLog_ADD<span class="br0">]</span>
  @p_Error_ID                        <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_System                          <span class="sy0">=</span> @v_System,
  @p_DB                              <span class="sy0">=</span> @v_DB,
  @p_Obj                             <span class="sy0">=</span> @v_Obj,
  @p_App                             <span class="sy0">=</span> @v_App,
  @p_User                            <span class="sy0">=</span> @v_User,
  @p_Spid                            <span class="sy0">=</span> @v_Spid,
  @p_Description                     <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_StartTime                       <span class="sy0">=</span> @v_Now,
  @p_EndTime                         <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_ActivityLog_ID                  <span class="sy0">=</span> @v_ActivityLog_ID <span class="kw1">OUTPUT</span>;     
&nbsp;
<span class="co1">-- Start the batch</span>
<span class="kw1">IF</span> @p_Batch_ID <span class="kw1">IS</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>  <span class="co1">-- Create the batch</span>
  <span class="kw1">SELECT</span> @v_BatchStatus              <span class="sy0">=</span> <span class="nu0">1</span>;
  <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_Batch_ADD<span class="br0">]</span>
    @p_Batch_ID                      <span class="sy0">=</span> @p_Batch_ID <span class="kw1">OUTPUT</span>
   ,@p_Type_ID                       <span class="sy0">=</span> @v_Batch_Type_ID
   ,@p_Name                          <span class="sy0">=</span> @v_Obj
   ,@p_Parent_ID                     <span class="sy0">=</span> @v_ActivityLog_ID;
&nbsp;
<span class="kw1">END</span>;   <span class="co1">-- Create the batch   </span>
<span class="co1">-- Add the next record to the batch</span>
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_BatchDetail_ADD<span class="br0">]</span>
  @p_Batch_ID                        <span class="sy0">=</span> @p_Batch_ID,
  @p_Object_ID                       <span class="sy0">=</span> @v_ActivityLog_ID,
  @p_Object                          <span class="sy0">=</span> @v_Obj;           
  <span class="kw1">BEGIN</span> TRY
&nbsp;
        <span class="kw1">SELECT</span> <span class="st0">'This is PU_Demo1'</span>;
		<span class="kw1">EXEC</span> PU_Demo2
		  @p_Batch_ID <span class="sy0">=</span> @p_Batch_ID;
		<span class="kw1">EXEC</span> PU_Demo3
		  @p_Batch_ID <span class="sy0">=</span> @p_Batch_ID;
  <span class="kw1">END</span> TRY
&nbsp;
  <span class="kw1">BEGIN</span> CATCH
&nbsp;
    <span class="kw1">SELECT</span> @v_Error                  <span class="sy0">=</span> 100000
          ,@v_MSG                    <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">NVARCHAR</span><span class="br0">&#40;</span><span class="nu0">2500</span><span class="br0">&#41;</span>, 
                                       <span class="st0">'Error: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_NUMBER<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span> 
                                       <span class="st0">' Severity: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_SEVERITY<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' State: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_STATE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' Line: '</span> <span class="sy0">+</span>  <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_L<span class="sy0">IN</span>E<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' Procedure: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_PROCEDURE<span class="br0">&#40;</span><span class="br0">&#41;</span>, @v_Obj<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' MSG: Error from [PU_Demo1]  with error:'</span> <span class="sy0">+</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_MESSAGE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;  
    <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ErrorLog_ADD<span class="br0">]</span>
      @p_Error_ID                    <span class="sy0">=</span> @v_Error,
      @p_System                      <span class="sy0">=</span> @v_System,
      @p_DB                          <span class="sy0">=</span> @v_DB,
      @p_Obj                         <span class="sy0">=</span> @v_Obj,
      @p_App                         <span class="sy0">=</span> @v_App,
      @p_User                        <span class="sy0">=</span> @v_User,
      @p_ErrorMsg                    <span class="sy0">=</span> @v_MSG;
&nbsp;
    <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ActivityLog_UPD<span class="br0">]</span>
      @p_ActivityLog_ID              <span class="sy0">=</span> @v_ActivityLog_ID,
      @p_EndTime                     <span class="sy0">=</span> @v_Now,
      @p_Error_ID                    <span class="sy0">=</span> @v_Error,
      @p_Active                      <span class="sy0">=</span> 0,
      @p_Description                 <span class="sy0">=</span> @v_MSG,
      @p_DateModified                <span class="sy0">=</span> @v_Now;    
    <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_BatchDetail_UPD<span class="br0">]</span>
      @p_ActivityLog_ID              <span class="sy0">=</span> @v_ActivityLog_ID
     ,@p_Batch_ID                    <span class="sy0">=</span> @p_Batch_ID
     ,@p_Now                         <span class="sy0">=</span> @v_Now;         
    <span class="kw1">RETURN</span> @v_Error;
&nbsp;
  <span class="kw1">END</span> CATCH;
EOF: 
<span class="coMULTI">/* Cleanup */</span>
<span class="coMULTI">/* Update the activity Log */</span>
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ActivityLog_UPD<span class="br0">]</span>
  @p_ActivityLog_ID                  <span class="sy0">=</span> @v_ActivityLog_ID,
  @p_EndTime                         <span class="sy0">=</span> @v_Now,
  @p_Active                          <span class="sy0">=</span> 0,
  @p_DateModified                    <span class="sy0">=</span> @v_Now;
&nbsp;
<span class="coMULTI">/* Update the batch detail */</span>
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_BatchDetail_UPD<span class="br0">]</span>
  @p_ActivityLog_ID                  <span class="sy0">=</span> @v_ActivityLog_ID
 ,@p_Batch_ID                        <span class="sy0">=</span> @p_Batch_ID
 ,@p_Now                             <span class="sy0">=</span> @v_Now;  
&nbsp;
<span class="kw1">IF</span> @v_BatchStatus                    <span class="sy0">=</span> 1
<span class="kw1">BEGIN</span>
  <span class="kw1">UPDATE</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_Batch<span class="br0">]</span>     <span class="kw1">WITH</span> <span class="br0">&#40;</span>ROWLOCK<span class="br0">&#41;</span>
     <span class="kw1">SET</span> <span class="br0">[</span>Active<span class="br0">]</span>                    <span class="sy0">=</span> 0
	    ,<span class="br0">[</span>DateModified<span class="br0">]</span>              <span class="sy0">=</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
   <span class="kw1">WHERE</span> <span class="br0">[</span>Batch_ID<span class="br0">]</span>                  <span class="sy0">=</span> @p_Batch_ID;
<span class="kw1">END</span>;  
GO   
<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span><span class="st0">'[dbo].[PU_Demo1]'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NOT</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&gt;&gt;&gt; CREATED PROCEDURE [dbo].[PU_Demo1] &lt;&lt;&lt;'</span>;
<span class="kw1">END</span>;
<span class="kw1">ELSE</span> 
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&gt;&gt;&gt; FAILED TO CREATE PROCEDURE [dbo].[PU_Demo1] &lt;&lt;&lt;'</span>;
<span class="kw1">END</span>;
GO</pre></div></div>



<p>Now we execute PU_Demo1. Open a new window and type:</p>


<div id="wpshdo_32" class="wp-synhighlighter-outer"><div id="wpshdt_32" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_32"></a><a id="wpshat_32" class="wp-synhighlighter-title" href="#codesyntax_32"  onClick="javascript:wpsh_toggleBlock(32)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_32" onClick="javascript:wpsh_code(32)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_32" onClick="javascript:wpsh_print(32)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_32" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">EXEC</span> PU_Demo1</pre></div></div>



<p>Then hit ALT+X or click the execute button. Your results should look like the following:</p>



<div class="wp-block-image">
<figure class="aligncenter"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-8.png"><img loading="lazy" decoding="async" width="189" height="277" class="wp-image-4268" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-8.png" alt="you love our t-sql framework" /></a></figure>
</div>



<p>So far, so good. The output is exactly what we expected. Now, look at the framework tables and validate the framework works as we expect it to.</p>



<p>First, check the TU_Errorlog and TU_ActivityLog tables:</p>



<div class="wp-block-image">
<figure class="aligncenter"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-9.png"><img loading="lazy" decoding="async" width="1024" height="192" class="wp-image-4269" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-9-1024x192.png" alt="" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-9-1024x192.png 1024w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-9-300x56.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-9-768x144.png 768w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-9.png 1316w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
</div>



<p>I would normally get very excited here. We have one error that we coded for PU_Demo3 that showed up in the TU_Errorlog and in the activity log for object PU_Demo3. We already tested this functionality in the last article, so we will reserve the <a href="https://www.youtube.com/watch?v=top6rTkXYJw">happy dance</a> until we see the batching work.</p>



<p>Last, check the TU_Batch and TU_BatchDetail tables to validate our the last of our feature list:</p>



<div class="wp-block-image">
<figure class="aligncenter"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-10.png"><img loading="lazy" decoding="async" width="1024" height="222" class="wp-image-4270" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-10-1024x222.png" alt="" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-10-1024x222.png 1024w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-10-300x65.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-10-768x166.png 768w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/5-10.png 1306w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
</div>



<h3 class="wp-block-heading"><strong>Very Happy Outcomes</strong></h3>



<p>Now we are very happy. We have a record in the batch table and 1 in each of the corresponding batchdetail records grouped together with the batch_id. It shows us a nice ranking (which we could get just by ordering on the batchdetail_id groubed by the Batch_ID. It’s a nice elevator pitch that may get you some eye candy from management. The Object_ID will be the same activity_ID’s in the TU_activitylog table. We can see just how long each segment ran and we can see how long the batch took to run.</p>



<p>We have successfully created a functional framework with three key features. It would help any developer start rapid code development within this T-SQL framework. The first two features are a must-have for any piece of code that you want to take to an enterprise level. The batching of procedures is nice but is was picked as a feature for a few reasons:</p>



<ol class="wp-block-list">
<li>You can expand the feature set. Continue this development and create the next step, which would be to extend batching to also accommodate record set batching. Create a roadmap and write down your vision of how it should work and start developing. Go to it and have fun doing it!</li>
<li>To show you that if you can dream it, you can build it. Don’t let my small introduction limit your T-SQL framework. You are limited only by your imagination.</li>
<li>Because I thought it was a pretty cool feature, so I implemented it. You have a cool idea…go implement it and then write about it and share it.</li>
</ol>



<p>I hope this series provided some insight into how you can make the day-to-day easier with some development. It also takes the load off the mundane, tedious tasks so that you can get to the good stuff — developing hard core logic?</p>
<p>The post <a href="https://sqlsolutionsgroup.com/t-sql-framework-2/">The Finished Product: Framework, pt. 5</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlsolutionsgroup.com/t-sql-framework-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>T-SQL Batching: Framework, pt. 4</title>
		<link>https://sqlsolutionsgroup.com/t-sql-batching/</link>
					<comments>https://sqlsolutionsgroup.com/t-sql-batching/#respond</comments>
		
		<dc:creator><![CDATA[Jared Kirkpatrick]]></dc:creator>
		<pubDate>Tue, 27 Aug 2019 07:38:11 +0000</pubDate>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL Group]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[#microsftcertifedmaster]]></category>
		<category><![CDATA[#microsftpartner]]></category>
		<category><![CDATA[#SQLAB]]></category>
		<category><![CDATA[#SQlatino]]></category>
		<category><![CDATA[#SQlatinoamerica]]></category>
		<category><![CDATA[#sqldatabase]]></category>
		<category><![CDATA[#sqldeveloper]]></category>
		<category><![CDATA[#SQLgroupie]]></category>
		<category><![CDATA[#sqlimer]]></category>
		<category><![CDATA[#sqlimerbymay]]></category>
		<category><![CDATA[#sqlinjection]]></category>
		<category><![CDATA[#sqlinternals]]></category>
		<category><![CDATA[#sqlite]]></category>
		<category><![CDATA[#sqlite3]]></category>
		<category><![CDATA[#SQLLearning]]></category>
		<category><![CDATA[#SQLMagazine]]></category>
		<category><![CDATA[#sqlmanagementstudio]]></category>
		<category><![CDATA[#sqlmanager]]></category>
		<category><![CDATA[#Sqlmap]]></category>
		<category><![CDATA[#sqlrun]]></category>
		<category><![CDATA[#sqlsaturday2017]]></category>
		<category><![CDATA[#sqlsatvienna]]></category>
		<category><![CDATA[#sqlserver]]></category>
		<category><![CDATA[#SQLserver2012]]></category>
		<category><![CDATA[#sqlserver2014]]></category>
		<category><![CDATA[#sqlserver2017]]></category>
		<category><![CDATA[#sqlserver2022]]></category>
		<category><![CDATA[#SQLServeronLinux]]></category>
		<category><![CDATA[#SQLsolutionsgroup]]></category>
		<category><![CDATA[#SQLTraining]]></category>
		<category><![CDATA[#SQLYog]]></category>
		<category><![CDATA[batching]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[guids]]></category>
		<category><![CDATA[SQLPASS]]></category>
		<category><![CDATA[SQLSaturday]]></category>
		<category><![CDATA[SSG]]></category>
		<category><![CDATA[T-SQL]]></category>
		<guid isPermaLink="false">http://sqlsolutionsgroup.com/?p=4239</guid>

					<description><![CDATA[<p>In this fourth installment of the framework series, we will add a T-SQL batching feature to our existing framework we have developed in earlier installments of this series. This feature set is dependent on the work we have previously, done. If you have not been following along, please go back so that everything will work [&#8230;]</p>
<p>The post <a href="https://sqlsolutionsgroup.com/t-sql-batching/">T-SQL Batching: Framework, pt. 4</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>In this fourth installment of the framework series, we will add a T-SQL batching feature to our existing framework we have developed in earlier installments of this series. This feature set is dependent on the work we have previously, done. If you have not been following along, please go back so that everything will work as anticipated (<span style="text-decoration: underline;"><a href="https://sqlsolutionsgroup.com/sql-framework-part-1/">part 1</a></span>, <span style="text-decoration: underline;"><a href="https://sqlsolutionsgroup.com/sql-error-engine/">part 2</a></span>, <span style="text-decoration: underline;"><a href="https://sqlsolutionsgroup.com/the-tsql-activity-log/">part 3</a></span>).</p>



<p>There are no boundaries to what you can add to this or your own framework. I have chosen these three features (error log, activity log, batching) so I could illustrate examples. The possibilities are limitless, hindered only by your imagination. This next feature is multi-faceted, but we will focus on just the idea of T-SQL batching procedure calls to further extend logging.</p>



<p>We could develop this feature more to include batching of rows, batching parent and child structures so that segregation of domain aspects of the data model are defined, batching of similar lines of business… In short, we could develop batching out to almost any type of grouping one would need programmatically to have data-driven processes leveraged within the framework.</p>



<h3 class="wp-block-heading"><strong>Creating T-SQL Batching: First Steps</strong></h3>



<p>As stated above, we will focus on developing the batching feature to extend the logging and information needed when we execute stored procedures as part of the framework. Even though we are focused on just this aspect of the feature, we will develop it in a way that it will scale if one would want to extend the feature’s functionality, which I will point out as we develop. There are a couple of moving parts for this feature (especially since we want it to easily expand in the future), so this will be a longer post. We will keep it easy to consume just as we have done with earlier posts.</p>



<p>Since we have some moving parts, let’s create a basic outline of precedence so that we follow the checklist as we develop. I highly recommend you take the time on any new project to get your thoughts down and have a road map with a clear vision of what you want to end up with as a solution.</p>



<ol class="wp-block-list">
<li>Create the Batch table (this is kind of like a header table)</li>
<li>Create the batch detail table</li>
<li>Add a “Batching” type code to our code group and code tables</li>
<li>Create a scalar function to create new IDs for the Batch table</li>
<li>Create the Insert/Update (DLL) procedures for the batching feature</li>
<li>Update the Template (there will be some logic also involved past just proc calls)</li>
<li>Remove all data from the Error log/Activity Log/Batching Tables</li>
<li>Create a demo to test and validate our features</li>
<li>Review the results</li>
<li>Do a happy dance as customary when any development project is complete</li>
</ol>



<h3 class="wp-block-heading">Scale: Planning for the Future</h3>



<p>There is a lot to do in developing this feature. The hard part is already done — we have defined above exactly what we need to do. Now we just need to create simple processes to complete each stage independently, and add the completed tasks to the collection like a puzzle until we are done … it really is that simple.</p>



<p>Since we may extend this feature in the future, we should allow for scalability, especially as we create the structures that will hold the data for this feature. Let’s explore what we envision this feature to do for us in the framework. We have an error handler, and we have a system for logging the details about every stored procedure we create and execute. Now we are developing a system that will group stored procedures that are nested, and define the details of this group like:</p>



<ol class="wp-block-list">
<li>What stored procedure started the chain of procedures being executed?</li>
<li>How long did each segment of the batch (or each procedure) take?</li>
<li>How long did the entire batch take?</li>
<li>Did all procedures in the batch execute successfully?</li>
<li>Which procedure (if any) did not complete successfully?</li>
</ol>



<p>Some of the information gathered could be construed from other aspects of the framework. For example, what procedure did not execute successfully … we could find this easily from the activity log or even the error log. However, when you are looking at a specific process (especially a complicated process), looking for individual records that may or may not be affecting the process would not be as efficient as if you were looking at the stored procedures that specifically were called by the known process as a group.</p>



<h3 class="wp-block-heading"><strong>Creating the Batch Table</strong></h3>



<p>The features we are creating also complement each other. In the last blog we observed that the work we developed in the error handling feature set was used in the activity log to enhance the logging capability of the activity log. Here, you’ll see that we leverage the features developed in the activity log to enhance the logging of the T-SQL batching process.</p>



<p>At this point we should have a pretty clear vision as to what we expect from our feature set; we have a clear road map to follow; and we have a lot of work to do so let’s get started!</p>



<p>The first task is to create the Batch table, which if you will remember constitutes as a header, so to speak, as listed below:</p>


<div id="wpshdo_33" class="wp-synhighlighter-outer"><div id="wpshdt_33" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_33"></a><a id="wpshat_33" class="wp-synhighlighter-title" href="#codesyntax_33"  onClick="javascript:wpsh_toggleBlock(33)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_33" onClick="javascript:wpsh_code(33)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_33" onClick="javascript:wpsh_print(33)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_33" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="coMULTI">/*=======================================================================*/</span>
<span class="coMULTI">/****** Object:  Table [dbo].[TU_Batch]     Script Date: 2019-08-21 ******/</span>
<span class="coMULTI">/*=======================================================================*/</span>
	<span class="kw1">PRINT</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span><span class="nu0">13</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'Creating table [dbo].[TU_Batch].'</span>;	
&nbsp;
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_Batch<span class="br0">]</span>
<span class="br0">&#40;</span>
  <span class="br0">[</span>Batch_ID<span class="br0">]</span>	<span class="br0">[</span><span class="kw1">UNIQUEIDENTIFIER</span><span class="br0">]</span>   <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>PK_Batch_ID<span class="br0">]</span>   
    <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="kw1">CLUSTERED</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Batch_ID<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">UNIQUEIDENTIFIER</span>, <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">BINARY</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span>, NEWID<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span> 
                                      <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">BINARY</span><span class="br0">&#40;</span>6<span class="br0">&#41;</span>, <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
 ,<span class="br0">[</span>Type_ID<span class="br0">]</span>     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>FK_TU_Batch_Type_ID<span class="br0">]</span>
       <span class="kw1">FOREIGN</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span><span class="br0">[</span>Type_ID<span class="br0">]</span><span class="br0">&#41;</span> 
    <span class="kw1">REFERENCES</span> <span class="br0">[</span>TU_Code<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>Code_ID<span class="br0">]</span><span class="br0">&#41;</span> 
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_Batch_Type_ID<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> 0    
 ,<span class="br0">[</span>Name<span class="br0">]</span>        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>     <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_Batch_Name<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="st0">'Batch:'</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">NVARCHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span>, <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, 110<span class="br0">&#41;</span>    
 ,<span class="br0">[</span>Parent_ID<span class="br0">]</span>   <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>               <span class="sy0">NULL</span>
 ,<span class="br0">[</span>Active<span class="br0">]</span>      <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>               <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_Batch_Active<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> 1
 ,<span class="br0">[</span>DateCreated<span class="br0">]</span> <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>          <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_Batch_DateCreated<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>DateModified<span class="br0">]</span> <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>         <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_Batch_DateModified<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span> <span class="kw1">ON</span> <span class="br0">[</span><span class="kw1">PRIMARY</span><span class="br0">]</span>;
<span class="coMULTI">/* FK Index */</span>
<span class="kw1">CREATE</span> <span class="kw1">NONCLUSTERED</span> <span class="kw1">INDEX</span> idxfk_TU_Batch_Type_ID <span class="kw1">ON</span> <span class="br0">[</span>TU_Batch<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>Type_ID<span class="br0">]</span><span class="br0">&#41;</span></pre></div></div>



<h3 class="wp-block-heading">The Benefits of GUIDS</h3>



<p>Before we continue, let’s look at our first column here: the batch_id that we have set as a <span style="text-decoration: underline;"><a href="https://en.wikipedia.org/wiki/Universally_unique_identifier">uniqueidentifier</a></span>. We also need to discuss the default that converts in and out of binary. Why would we go down this road if we are trying to keep things as simple as we can? There is no good reason for the feature set we are developing today, but we are building this feature set to scale. To this end we have some very good reasons as to why we want a uniqueidentifier:</p>



<ol class="wp-block-list">
<li>If and when we extend our batching feature, this feature may need to extend past processing in the database (or server for that matter), or origin. We can do batching through SSIS on a completely different server, so we should set the feature to be federated. Since identity uses integers that do not extend past the source database, the GUID is a practical data type that can be validated across the domain and even beyond.</li>
<li>This is not an application, so we control creation and storage of the GUIDS. The GUIDS reads from right to left, so if we concatenate the random unique identifier with a time stamp on the end, we will have a sequential GUID that will not cause sporadic inserts across our extents.</li>
<li>For future needs, we may want to copy a batch for reuse. Validating a copied GUID may be easier to identify than integers when not done programmatically.</li>
</ol>


<div id="wpshdo_34" class="wp-synhighlighter-outer"><div id="wpshdt_34" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_34"></a><a id="wpshat_34" class="wp-synhighlighter-title" href="#codesyntax_34"  onClick="javascript:wpsh_toggleBlock(34)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_34" onClick="javascript:wpsh_code(34)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_34" onClick="javascript:wpsh_print(34)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_34" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="br0">[</span>Batch_ID<span class="br0">]</span>	<span class="br0">[</span><span class="kw1">UNIQUEIDENTIFIER</span><span class="br0">]</span>   <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>PK_Batch_ID<span class="br0">]</span>   
    <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="kw1">CLUSTERED</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Batch_ID<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">UNIQUEIDENTIFIER</span>, <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">BINARY</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span>, NEWID<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span> 
                                      <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">BINARY</span><span class="br0">&#40;</span>6<span class="br0">&#41;</span>, <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div>



<h3 class="wp-block-heading">Digging Deeper</h3>



<p>This type of method is starting to go beyond level 1 development. Now that we have defined why you will see that, it is convenient to apply this type development to the feature we are building out. We started explaining the DEFAULT argument above in the second article of why we want a GUID, but as this is important, let’s expand on this before we move on:</p>



<ol class="wp-block-list">
<li>A GUID is 16 alpha-numeric characters read from right to left </li>
<li>The NEWID() Function is a server-side function that randomly creates a new 16-character UNIQUIDENTIFIER (nicknamed: GUID)</li>
<li>The GETDATE() Function is a server-side function that returns a date</li>
<li>We use the Binary datatype to concatenate the first 10 characters of the NEWD() with the first six characters of a sorted date — CONVERT(BINARY(10), NEWID()) + CONVERT(BINARY(6), GETDATE())</li>
<li>Then we convert that to a UNIQUIDENTIFIER —
<p>CONVERT(</p>
<p>        UNIQUEIDENTIFIER,</p>
<p>CONVERT(BINARY(10), NEWID()) + CONVERT(BINARY(6), GETDATE())</p>
<p>       )</p>
</li>
</ol>



<h3 class="wp-block-heading">Create Batch Detail Table</h3>



<p>Next, we’ll create the batch detail table, shown below:</p>


<div id="wpshdo_35" class="wp-synhighlighter-outer"><div id="wpshdt_35" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_35"></a><a id="wpshat_35" class="wp-synhighlighter-title" href="#codesyntax_35"  onClick="javascript:wpsh_toggleBlock(35)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_35" onClick="javascript:wpsh_code(35)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_35" onClick="javascript:wpsh_print(35)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_35" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="coMULTI">/*=========================================================================*/</span>
<span class="coMULTI">/****** Object:  Table [dbo].[TU_BatchDetail]  Script Date: 2019-05-24    **/</span>
<span class="coMULTI">/*=========================================================================*/</span>
	<span class="kw1">PRINT</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span><span class="nu0">13</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'Creating table [dbo].[TU_BatchDetail].'</span>;	
&nbsp;
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_BatchDetail<span class="br0">]</span>
<span class="br0">&#40;</span>
  <span class="br0">[</span>BatchDetail_ID<span class="br0">]</span> <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>  <span class="kw1">IDENTITY</span> <span class="br0">&#40;</span>1, 1<span class="br0">&#41;</span>                                        <span class="sy0">NOT</span> <span class="sy0">NULL</span> 
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>PK_BatchDetail_ID<span class="br0">]</span>   
    <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="kw1">CLUSTERED</span>
 ,<span class="br0">[</span>Batch_ID<span class="br0">]</span>       <span class="br0">[</span><span class="kw1">UNIQUEIDENTIFIER</span><span class="br0">]</span>                                            <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>FK_TU_BatchDetail_Batch_ID<span class="br0">]</span>
       <span class="kw1">FOREIGN</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span><span class="br0">[</span>Batch_ID<span class="br0">]</span><span class="br0">&#41;</span> 
    <span class="kw1">REFERENCES</span> <span class="br0">[</span>TU_Batch<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>Batch_ID<span class="br0">]</span><span class="br0">&#41;</span> 
 ,<span class="br0">[</span>BatchSize<span class="br0">]</span>      <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                                                         <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_Batch_BatchSize<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> 0     
 ,<span class="br0">[</span><span class="kw2">OBJECT_ID</span><span class="br0">]</span>      <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                                                         <span class="sy0">NULL</span>   
 ,<span class="br0">[</span>Entity_ID<span class="br0">]</span>      <span class="br0">[</span><span class="kw1">UNIQUEIDENTIFIER</span><span class="br0">]</span>                                            <span class="sy0">NULL</span>   
 ,<span class="br0">[</span><span class="kw1">OBJECT</span><span class="br0">]</span>         <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NULL</span>
 ,<span class="br0">[</span>StartDate<span class="br0">]</span>      <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NULL</span>
 ,<span class="br0">[</span>EndDate<span class="br0">]</span>        <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NULL</span>
 ,<span class="br0">[</span>Rank<span class="br0">]</span>           <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                                                         <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_BatchDetail_Rank<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> 1
 ,<span class="br0">[</span>Active<span class="br0">]</span>          <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>                                                         <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_BatchDetail_Active<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> 1
 ,<span class="br0">[</span>DateCreated<span class="br0">]</span>     <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_BatchDetail_DateCreated<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>DateModified<span class="br0">]</span>    <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_BatchDetail_DateModified<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span> <span class="kw1">ON</span> <span class="br0">[</span><span class="kw1">PRIMARY</span><span class="br0">]</span>;
<span class="coMULTI">/* FK Index */</span>
<span class="kw1">CREATE</span> <span class="kw1">NONCLUSTERED</span> <span class="kw1">INDEX</span> idxfk_TU_BatchDetail_Batch_ID <span class="kw1">ON</span> <span class="br0">[</span>TU_BatchDetail<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>Batch_ID<span class="br0">]</span><span class="br0">&#41;</span></pre></div></div>



<p>&nbsp;</p>



<p>This table is pretty standard, other than we put a couple of columns in that we will not need for this part of the feature, such as the batch size, which we would use to record size batches. That doesn’t mean this table won’t need modification when one decides to extend the batching features. But as you can see, we’re close enough that development could continue if desired.</p>



<h3 class="wp-block-heading"><strong>Code Group and Code Tables</strong></h3>



<p>We’ve completed the first two items in our road map. Now we need to insert the type codes into our code group and code tables accordingly. In <a href="https://sqlsolutionsgroup.com/sql-error-engine/">the <span style="text-decoration: underline;">second part of the framework</span></a>, we created the Code Group and Code tables so that when we needed new codes we would not have to create new tables. Here we need new codes. We developed a great structure already so we can skip table creation because the structures we need are already available.</p>



<p>Let’s do this one at a time starting with the TU_CodeGroup table.</p>



<ul class="wp-block-list">
<li>Look at what’s in the table currently:</li>
</ul>



<div class="wp-block-image">
<figure class="aligncenter"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/4-1.png"><img loading="lazy" decoding="async" width="603" height="131" class="wp-image-4240" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/4-1.png" alt="T-sql batching framework" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/4-1.png 603w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/4-1-300x65.png 300w" sizes="(max-width: 603px) 100vw, 603px" /></a></figure>
</div>



<ul class="wp-block-list">
<li>We see there is only one record for the Error handling feature, so let’s insert a record for batching:</li>
</ul>


<div id="wpshdo_36" class="wp-synhighlighter-outer"><div id="wpshdt_36" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_36"></a><a id="wpshat_36" class="wp-synhighlighter-title" href="#codesyntax_36"  onClick="javascript:wpsh_toggleBlock(36)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_36" onClick="javascript:wpsh_code(36)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_36" onClick="javascript:wpsh_print(36)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_36" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">SET</span> <span class="kw1">IDENTITY_INSERT</span> TU_CodeGroup <span class="kw1">ON</span>;
<span class="kw1">INSERT</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_CodeGroup<span class="br0">]</span>
<span class="br0">&#40;</span>      CodeGroup_ID, Name,                    <span class="br0">[</span><span class="kw1">DESC</span><span class="br0">]</span><span class="br0">&#41;</span>
<span class="kw1">SELECT</span> <span class="nu0">2</span>,            <span class="st0">'BATCH'</span>,                 <span class="st0">'TYPE OF BATCHS'</span>
  <span class="kw1">SET</span> <span class="kw1">IDENTITY_INSERT</span> TU_CodeGroup <span class="kw1">OFF</span>;</pre></div></div>



<ul class="wp-block-list">
<li>Check the table again:</li>
</ul>



<div class="wp-block-image">
<figure class="aligncenter"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/4-2.png"><img loading="lazy" decoding="async" width="606" height="237" class="wp-image-4241" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/4-2.png" alt="batching" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/4-2.png 606w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/4-2-300x117.png 300w" sizes="(max-width: 606px) 100vw, 606px" /></a></figure>
</div>



<p>Exactly what we were anticipating. Follow the same three steps and insert the codes into the code table for the batching types:</p>



<ul class="wp-block-list">
<li>Look at what is in the table currently:</li>
</ul>



<div class="wp-block-image">
<figure class="aligncenter"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/4-3.png"><img loading="lazy" decoding="async" width="894" height="353" class="wp-image-4243" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/4-3.png" alt="" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/4-3.png 894w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/4-3-300x118.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/4-3-768x303.png 768w" sizes="(max-width: 894px) 100vw, 894px" /></a></figure>
</div>



<ul class="wp-block-list">
<li>After looking at the data we insert the data we need for batching:</li>
</ul>


<div id="wpshdo_37" class="wp-synhighlighter-outer"><div id="wpshdt_37" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_37"></a><a id="wpshat_37" class="wp-synhighlighter-title" href="#codesyntax_37"  onClick="javascript:wpsh_toggleBlock(37)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_37" onClick="javascript:wpsh_code(37)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_37" onClick="javascript:wpsh_print(37)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_37" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">SET</span> <span class="kw1">IDENTITY_INSERT</span> TU_Code <span class="kw1">ON</span>;
<span class="kw1">INSERT</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_Code<span class="br0">]</span>
      Code_ID, CodeGroup_ID, Name,                    <span class="br0">[</span><span class="kw1">DESC</span><span class="br0">]</span><span class="br0">&#41;</span>
<span class="kw1">SELECT</span> <span class="nu0">200</span>,     <span class="nu0">2</span>,            <span class="st0">'DEFAULT'</span>,               <span class="st0">'DEFAULT BATCH TYPE'</span>
<span class="kw1">UNION</span>
<span class="kw1">SELECT</span> <span class="nu0">201</span>,     <span class="nu0">2</span>,            <span class="st0">'PROCEDURE'</span>,             <span class="st0">'SP BATCH FOR ORDINAL COLLECTION'</span>
<span class="kw1">UNION</span>
<span class="kw1">SELECT</span> <span class="nu0">202</span>,     <span class="nu0">2</span>,            <span class="st0">'RECORDCOUNT'</span>,           <span class="st0">'SET NUMBER OF RECORDS TO be BATCHED'</span>
  <span class="kw1">SET</span> <span class="kw1">IDENTITY_INSERT</span> TU_Code <span class="kw1">OFF</span>;</pre></div></div>



<ul class="wp-block-list">
<li>Check the code tables again:</li>
</ul>



<div class="wp-block-image">
<figure class="aligncenter"><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/4-4.png"><img loading="lazy" decoding="async" width="934" height="387" class="wp-image-4244" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/4-4.png" alt="" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/4-4.png 934w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/4-4-300x124.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/4-4-768x318.png 768w" sizes="(max-width: 934px) 100vw, 934px" /></a></figure>
</div>



<h3 class="wp-block-heading"><strong>The Scalar Function</strong></h3>



<p>Now that we have successfully entered our type codes, we move forward to creating a scalar function. This function does exactly as planned with the table definition: it will get a new uniqueidentifier for us.</p>



<p>We do this through a scalar function. It&#8217;s easier to create one into a variable and use that through nested operation versus a lookup each time. If we use a scalar function each time, why go to the trouble of creating a default in the table definition? That’s for completeness and for our protection. Instead of erroring out of a process, if a null is ever passed it will get an ID and allow the process to continue. With that, here’s the code for the scalar function as we continue our development:</p>


<div id="wpshdo_38" class="wp-synhighlighter-outer"><div id="wpshdt_38" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_38"></a><a id="wpshat_38" class="wp-synhighlighter-title" href="#codesyntax_38"  onClick="javascript:wpsh_toggleBlock(38)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_38" onClick="javascript:wpsh_code(38)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_38" onClick="javascript:wpsh_print(38)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_38" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>;
GO
<span class="kw1">IF</span> <span class="sy0">EXISTS</span><span class="br0">&#40;</span><span class="kw1">SELECT</span> 1
            <span class="kw1">FROM</span> <span class="br0">[</span><span class="sy0">IN</span>F<span class="sy0">OR</span>MATION_SCHEMA<span class="br0">]</span>.<span class="br0">[</span>ROUT<span class="sy0">IN</span>ES<span class="br0">]</span> <span class="br0">&#40;</span>NOLOCK<span class="br0">&#41;</span>
           <span class="kw1">WHERE</span> <span class="br0">[</span>SPECIFIC_SCHEMA<span class="br0">]</span>   <span class="sy0">=</span> <span class="st0">'dbo'</span>
             <span class="sy0">AND</span> <span class="br0">[</span>SPECIFIC_NAME<span class="br0">]</span>     <span class="sy0">=</span> <span class="st0">'FSU_GetGUID'</span><span class="br0">&#41;</span>
<span class="kw1">BEGIN</span>
  <span class="kw1">DROP</span> <span class="kw1">FUNCTION</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>FSU_GetGUID<span class="br0">]</span>;
  <span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; DROPPED FUNCTION [dbo].[FSU_GetGUID] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span>;
GO
<span class="kw1">CREATE</span> <span class="kw1">FUNCTION</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>FSU_GetGUID<span class="br0">]</span> 
<span class="br0">&#40;</span>
  @p_Guid                            <span class="br0">[</span><span class="kw1">UNIQUEIDENTIFIER</span><span class="br0">]</span>
 ,@p_Date                            <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>	
<span class="br0">&#41;</span>
<span class="kw1">RETURNS</span> <span class="br0">[</span><span class="kw1">UNIQUEIDENTIFIER</span><span class="br0">]</span>
<span class="kw1">WITH</span> ENCRYPTION
<span class="kw1">AS</span>
<span class="kw1">BEGIN</span> <span class="co1">-- Begin function</span>
<span class="coMULTI">/************************************************************************/</span>
<span class="coMULTI">/* Name         : FSU_GetGUID                                           */</span>
<span class="coMULTI">/* Version	  : 1.0                                                   */</span>
<span class="coMULTI">/* Author	  : Jared Kirkpatrick                                     */</span>
<span class="coMULTI">/* Date	  : 2019-08-24                                            */</span>
<span class="coMULTI">/* Description  : Gets a new binary sorted guid                         */</span>
<span class="coMULTI">/************************************************************************/</span>
<span class="coMULTI">/* Date         : Version: Who: Description                             */</span>
<span class="coMULTI">/************************************************************************/</span>
<span class="coMULTI">/* 2019-08-24   : 1.0    : JSK: Initial Release.                      */</span>
<span class="coMULTI">/************************************************************************/</span>
<span class="coMULTI">/* Declare Variables */</span>
  <span class="kw1">DECLARE</span> @v_GUID                    <span class="br0">[</span><span class="kw1">UNIQUEIDENTIFIER</span><span class="br0">]</span>;
&nbsp;
  <span class="kw1">SELECT</span> @v_GUID                     <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">UNIQUEIDENTIFIER</span>, 
                                       <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">BINARY</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span>, @p_Guid<span class="br0">&#41;</span> <span class="sy0">+</span> 
                                       <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">BINARY</span><span class="br0">&#40;</span>6<span class="br0">&#41;</span>, @p_Date<span class="br0">&#41;</span>
                                              <span class="br0">&#41;</span> 
  <span class="kw1">RETURN</span> @v_GUID
&nbsp;
<span class="kw1">END</span>;  <span class="co1">-- Begin function</span>
GO
<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span><span class="st0">'[dbo].[FSU_GetGUID]'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NOT</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; CREATED FUNCTION [dbo].[FSU_GetGUID] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span>;
<span class="kw1">ELSE</span> 
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; FAILED TO CREATE FUNCTION [dbo].[FSU_GetGUID] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span>;
GO</pre></div></div>



<h3 class="wp-block-heading"><strong>Creating the Procedures</strong></h3>



<p>Next on the list is to create the Insert/Update procedures for the Batch and Batch Detail tables. We should not have any reason to modify the header records. The Batch table will only need an Insert procedure, whereas the Detail tables will need both an Insert and an update procedure.</p>


<div id="wpshdo_39" class="wp-synhighlighter-outer"><div id="wpshdt_39" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_39"></a><a id="wpshat_39" class="wp-synhighlighter-title" href="#codesyntax_39"  onClick="javascript:wpsh_toggleBlock(39)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_39" onClick="javascript:wpsh_code(39)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_39" onClick="javascript:wpsh_print(39)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_39" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> DBCATCH
GO
<span class="kw1">IF</span> <span class="sy0">EXISTS</span><span class="br0">&#40;</span><span class="kw1">SELECT</span> 1
            <span class="kw1">FROM</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>sysobjects<span class="br0">]</span> <span class="br0">&#40;</span>NOLOCK<span class="br0">&#41;</span>
           <span class="kw1">WHERE</span> <span class="br0">[</span>id<span class="br0">]</span>                                            <span class="sy0">=</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span>N<span class="st0">'[dbo].[PU_Batch_ADD]'</span><span class="br0">&#41;</span>
             <span class="sy0">AND</span> <span class="kw2">OBJECTPROPERTY</span><span class="br0">&#40;</span><span class="br0">[</span>id<span class="br0">]</span>, N<span class="st0">'IsProcedure'</span><span class="br0">&#41;</span>            <span class="sy0">=</span> 1<span class="br0">&#41;</span> 
<span class="kw1">BEGIN</span> 
  <span class="kw1">DROP</span> <span class="kw1">PROCEDURE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_Batch_ADD<span class="br0">]</span>;
&nbsp;
  <span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; DROPPED PROCEDURE [dbo].[PU_Batch_ADD] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span> 
GO
<span class="kw1">CREATE</span> <span class="kw1">PROC</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_Batch_ADD<span class="br0">]</span>
  @p_Type_ID                         <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                       <span class="sy0">=</span> 700,
  @p_Name                            <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>             <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_Parent_ID                       <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                       <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_Batch_ID                        <span class="br0">[</span><span class="kw1">UNIQUEIDENTIFIER</span><span class="br0">]</span>          <span class="sy0">=</span> <span class="sy0">NULL</span> <span class="kw1">OUTPUT</span>
<span class="kw1">WITH</span> ENCRYPTION
<span class="kw1">AS</span>  
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* Name        : PU_Batch_ADD                                                                    */</span>
<span class="coMULTI">/* Version     : 1.0                                                                             */</span>
<span class="coMULTI">/* Author      : Jared Kirkpatrick                                                               */</span>
<span class="coMULTI">/* Date        : 2019-08-24                                                                      */</span>
<span class="coMULTI">/* Description : Insertes a record in the Batch Header                                           */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* Date        : Version: Who: Description                                                       */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* 2019-08-24  : 1.0    : REB: Initial Release.                                                */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="kw1">SET</span> <span class="kw1">NOCOUNT</span> <span class="kw1">ON</span>;
<span class="coMULTI">/* Declare Variables */</span>
<span class="kw1">DECLARE</span> @v_Now                       <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>
       ,@v_Domain                    <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_IPAddress                 <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_SQL                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>4000<span class="br0">&#41;</span>
       ,@v_UserName                  <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_PW                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Error                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_ActivityLog_ID            <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_DB                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Obj                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_App                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_User                      <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>            
       ,@v_Spid                      <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Debug                     <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>       
       ,@v_MSG                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>1000<span class="br0">&#41;</span>
       ,@v_SystemName                <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Connect_Type_ID           <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_RowCount                  <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Count                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Version                   <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_MSSQL_ID                  <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>;
&nbsp;
<span class="coMULTI">/* Define Variables */</span>
<span class="kw1">SELECT</span> @v_Now                        <span class="sy0">=</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_DB                         <span class="sy0">=</span> <span class="kw2">DB_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_Obj                        <span class="sy0">=</span> <span class="st0">'[DBCATCH].[dbo].[PU_Batch_ADD]'</span>
      ,@v_App                        <span class="sy0">=</span> <span class="kw2">APP_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_User                       <span class="sy0">=</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span><span class="sy0">OR</span>IG<span class="sy0">IN</span>AL_LOG<span class="sy0">IN</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">USER_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
      ,@v_Spid                       <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>25<span class="br0">&#41;</span>, <span class="kw2">@@SPID</span><span class="br0">&#41;</span> 
      ,@v_Debug                      <span class="sy0">=</span> <span class="nu0">0</span>;
&nbsp;
<span class="kw1">IF</span> @p_Name <span class="kw1">IS</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>
  <span class="kw1">SELECT</span> @p_Name                     <span class="sy0">=</span> <span class="st0">'Batch:'</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">NVARCHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span>, @v_Now, 112<span class="br0">&#41;</span>;      
<span class="kw1">END</span>;         
&nbsp;
<span class="kw1">IF</span> @p_Batch_ID <span class="kw1">IS</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>
  <span class="kw1">SELECT</span> @p_Batch_ID                 <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">UNIQUEIDENTIFIER</span>, <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">BINARY</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span>, NEWID<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span> 
                                                 <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">BINARY</span><span class="br0">&#40;</span>6<span class="br0">&#41;</span>, <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;      
<span class="kw1">END</span>;                                                 
&nbsp;
<span class="kw1">IF</span> @v_Debug                          <span class="sy0">=</span> 1
<span class="kw1">BEGIN</span> <span class="co1">-- debug = 1 Ref: 1</span>
  <span class="kw1">SELECT</span> <span class="st0">'REF:1 - Define Static Variables'</span>;
  <span class="kw1">SELECT</span> @v_Now                      <span class="kw1">AS</span> <span class="br0">[</span><span class="kw2">GETDATE</span><span class="br0">]</span>
        ,@v_DB                       <span class="kw1">AS</span> <span class="br0">[</span>DB<span class="br0">]</span>
        ,@v_Obj                      <span class="kw1">AS</span> <span class="br0">[</span>OBJ<span class="br0">]</span>
        ,@v_App                      <span class="kw1">AS</span> <span class="br0">[</span>APP<span class="br0">]</span>
        ,@v_User                     <span class="kw1">AS</span> <span class="br0">[</span><span class="kw1">USER</span><span class="br0">]</span>
        ,@v_Spid                     <span class="kw1">AS</span> <span class="br0">[</span>SPID<span class="br0">]</span>
        ,@p_Batch_ID                 <span class="kw1">AS</span> <span class="br0">[</span>Batch_ID<span class="br0">]</span>;
&nbsp;
<span class="kw1">END</span>; <span class="co1">-- debug = 1         </span>
<span class="kw1">BEGIN</span> <span class="kw1">TRANSACTION</span> 
  <span class="kw1">BEGIN</span> TRY
    <span class="kw1">INSERT</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_Batch<span class="br0">]</span>
    <span class="br0">&#40;</span>
      <span class="br0">[</span>Batch_ID<span class="br0">]</span>,
      <span class="br0">[</span>Type_ID<span class="br0">]</span>,
      <span class="br0">[</span>Name<span class="br0">]</span>,
      <span class="br0">[</span>Parent_ID<span class="br0">]</span>
    <span class="br0">&#41;</span>
    <span class="kw1">VALUES</span>
    <span class="br0">&#40;</span>
      @p_Batch_ID,
      @p_Type_ID,
      @p_Name,
      @p_Parent_ID
    <span class="br0">&#41;</span>
  <span class="kw1">END</span> TRY
&nbsp;
  <span class="kw1">BEGIN</span> CATCH
&nbsp;
    <span class="kw1">SELECT</span> @v_Error                  <span class="sy0">=</span> 100001
          ,@v_MSG                    <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">NVARCHAR</span><span class="br0">&#40;</span><span class="nu0">2500</span><span class="br0">&#41;</span>, 
                                       <span class="st0">'Error: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_NUMBER<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span> 
                                       <span class="st0">' Severity: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_SEVERITY<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' State: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_STATE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' Line: '</span> <span class="sy0">+</span>  <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_L<span class="sy0">IN</span>E<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' Procedure: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_PROCEDURE<span class="br0">&#40;</span><span class="br0">&#41;</span>, @v_Obj<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' MSG: Error Inserting into [DBCATCH].[dbo].[TU_Batch] with error:'</span> <span class="sy0">+</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_MESSAGE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;  
    <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ErrorLog_ADD<span class="br0">]</span>
      @p_Error_ID                    <span class="sy0">=</span> @v_Error,
      @p_System                      <span class="sy0">=</span> <span class="sy0">NULL</span>,
      @p_DB                          <span class="sy0">=</span> @v_DB,
      @p_Obj                         <span class="sy0">=</span> @v_Obj,
      @p_App                         <span class="sy0">=</span> @v_App,
      @p_User                        <span class="sy0">=</span> @v_User,
      @p_ErrorMsg                    <span class="sy0">=</span> @v_MSG;
&nbsp;
    <span class="kw1">ROLLBACK</span> <span class="kw1">TRAN</span>;
    <span class="kw1">RETURN</span> @v_Error;
&nbsp;
  <span class="kw1">END</span> CATCH;
<span class="kw1">COMMIT</span> <span class="kw1">TRANSACTION</span>;
GO
<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span><span class="st0">'[dbo].[PU_Batch_ADD]'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NOT</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; CREATED PROCEDURE [dbo].[PU_Batch_ADD] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span>;
<span class="kw1">ELSE</span> 
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; FAILED TO CREATE PROCEDURE [dbo].[PU_Batch_ADD] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span>;
GO</pre></div></div>



<p>That takes care of the insert procedure for the Batch table. Notice we customized the TRY CATCH error message. The Insert Procedure for the Batch Detail record is below:</p>


<div id="wpshdo_40" class="wp-synhighlighter-outer"><div id="wpshdt_40" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_40"></a><a id="wpshat_40" class="wp-synhighlighter-title" href="#codesyntax_40"  onClick="javascript:wpsh_toggleBlock(40)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_40" onClick="javascript:wpsh_code(40)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_40" onClick="javascript:wpsh_print(40)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_40" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> DBCATCH
GO
<span class="kw1">IF</span> <span class="sy0">EXISTS</span><span class="br0">&#40;</span><span class="kw1">SELECT</span> 1
            <span class="kw1">FROM</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>sysobjects<span class="br0">]</span> <span class="br0">&#40;</span>NOLOCK<span class="br0">&#41;</span>
           <span class="kw1">WHERE</span> <span class="br0">[</span>id<span class="br0">]</span>                                            <span class="sy0">=</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span>N<span class="st0">'[dbo].[PU_BatchDetail_ADD]'</span><span class="br0">&#41;</span>
             <span class="sy0">AND</span> <span class="kw2">OBJECTPROPERTY</span><span class="br0">&#40;</span><span class="br0">[</span>id<span class="br0">]</span>, N<span class="st0">'IsProcedure'</span><span class="br0">&#41;</span>            <span class="sy0">=</span> 1<span class="br0">&#41;</span> 
<span class="kw1">BEGIN</span> 
  <span class="kw1">DROP</span> <span class="kw1">PROCEDURE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_BatchDetail_ADD<span class="br0">]</span>;
&nbsp;
  <span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; DROPPED PROCEDURE [dbo].[PU_BatchDetail_ADD] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span>; 
GO
<span class="kw1">CREATE</span> <span class="kw1">PROC</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_BatchDetail_ADD<span class="br0">]</span>
  @p_Batch_ID                        <span class="br0">[</span><span class="kw1">UNIQUEIDENTIFIER</span><span class="br0">]</span>,
  @p_BatchSize                       <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                       <span class="sy0">=</span> 0,
  @p_Object_ID                       <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                       <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_Entity_ID                       <span class="br0">[</span><span class="kw1">UNIQUEIDENTIFIER</span><span class="br0">]</span>          <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_Object                          <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>             <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_StartDate                       <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                  <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_EndDate                         <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                  <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_Rank                            <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                       <span class="sy0">=</span> <span class="sy0">NULL</span>
<span class="kw1">WITH</span> ENCRYPTION
<span class="kw1">AS</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* Name        : PU_BatchDetail_ADD                                                              */</span>
<span class="coMULTI">/* Version     : 1.0                                                                             */</span>
<span class="coMULTI">/* Author      : Jared Kirkpatrick                                                               */</span>
<span class="coMULTI">/* Date        : 2019-08-24                                                                      */</span>
<span class="coMULTI">/* Description : Inserts a record for the batch detail                                           */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* Date        : Version: Who: Description                                                       */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* 2019-08-24  : 1.0    : REB: Initial Release.                                                */</span>
<span class="coMULTI">/*************************************************************************************************/</span>
<span class="kw1">SET</span> <span class="kw1">NOCOUNT</span> <span class="kw1">ON</span>;
<span class="coMULTI">/* Declare Variables */</span>
<span class="kw1">DECLARE</span> @v_Now                       <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>
       ,@v_Domain                    <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_IPAddress                 <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_SQL                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>4000<span class="br0">&#41;</span>
       ,@v_UserName                  <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_PW                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Error                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_ActivityLog_ID            <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_DB                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Obj                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_App                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_User                      <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>            
       ,@v_Spid                      <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Debug                     <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>       
       ,@v_MSG                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>1000<span class="br0">&#41;</span>
       ,@v_SystemName                <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Connect_Type_ID           <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_RowCount                  <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Count                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Version                   <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_MSSQL_ID                  <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>;
&nbsp;
<span class="coMULTI">/* Define Variables */</span>
<span class="kw1">SELECT</span> @v_Now                        <span class="sy0">=</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_DB                         <span class="sy0">=</span> <span class="kw2">DB_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_Obj                        <span class="sy0">=</span> <span class="st0">'[DBCATCH].[dbo].[PU_BatchDetail_ADD]'</span>
      ,@v_App                        <span class="sy0">=</span> <span class="kw2">APP_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_User                       <span class="sy0">=</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span><span class="sy0">OR</span>IG<span class="sy0">IN</span>AL_LOG<span class="sy0">IN</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">USER_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
      ,@v_Spid                       <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>25<span class="br0">&#41;</span>, <span class="kw2">@@SPID</span><span class="br0">&#41;</span>
      ,@v_Debug                      <span class="sy0">=</span> <span class="nu0">0</span>;
&nbsp;
<span class="kw1">IF</span> @p_Rank                           <span class="kw1">IS</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>
  <span class="kw1">SELECT</span> @p_Rank                     <span class="sy0">=</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span><span class="kw2">MAX</span><span class="br0">&#40;</span><span class="br0">[</span>Rank<span class="br0">]</span><span class="br0">&#41;</span> <span class="sy0">+</span> 1, 1<span class="br0">&#41;</span>
    <span class="kw1">FROM</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_BatchDetail<span class="br0">]</span> <span class="br0">&#40;</span>NOLOCK<span class="br0">&#41;</span>
   <span class="kw1">WHERE</span> <span class="br0">[</span>Batch_ID<span class="br0">]</span>                  <span class="sy0">=</span> @p_Batch_ID; 
<span class="kw1">END</span>;  
<span class="kw1">IF</span> @p_StartDate                      <span class="kw1">IS</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>
  <span class="kw1">SELECT</span> @p_StartDate                <span class="sy0">=</span> @v_Now;
<span class="kw1">END</span>;  
<span class="kw1">IF</span> @v_Debug <span class="sy0">=</span> 1
<span class="kw1">BEGIN</span> <span class="co1">-- debug = 1 Ref: 1</span>
  <span class="kw1">SELECT</span> <span class="st0">'REF:1 - Define Static Variables'</span>;
  <span class="kw1">SELECT</span> @v_Now                      <span class="kw1">AS</span> <span class="br0">[</span><span class="kw2">GETDATE</span><span class="br0">]</span>
        ,@v_DB                       <span class="kw1">AS</span> <span class="br0">[</span>DB<span class="br0">]</span>
        ,@v_Obj                      <span class="kw1">AS</span> <span class="br0">[</span>OBJ<span class="br0">]</span>
        ,@v_App                      <span class="kw1">AS</span> <span class="br0">[</span>APP<span class="br0">]</span>
        ,@v_User                     <span class="kw1">AS</span> <span class="br0">[</span><span class="kw1">USER</span><span class="br0">]</span>
        ,@v_Spid                     <span class="kw1">AS</span> <span class="br0">[</span>SPID<span class="br0">]</span>
        ,@p_Batch_ID                 <span class="kw1">AS</span> <span class="br0">[</span>Batch_ID<span class="br0">]</span>;
&nbsp;
<span class="kw1">END</span>; <span class="co1">-- debug = 1   </span>
<span class="kw1">BEGIN</span> <span class="kw1">TRANSACTION</span> 
  <span class="kw1">BEGIN</span> TRY
    <span class="kw1">INSERT</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_BatchDetail<span class="br0">]</span>
    <span class="br0">&#40;</span>
      <span class="br0">[</span>Batch_ID<span class="br0">]</span>,
      <span class="br0">[</span>BatchSize<span class="br0">]</span>,
      <span class="br0">[</span><span class="kw2">OBJECT_ID</span><span class="br0">]</span>,
      <span class="br0">[</span>Entity_ID<span class="br0">]</span>,
      <span class="br0">[</span><span class="kw1">OBJECT</span><span class="br0">]</span>,
      <span class="br0">[</span>StartDate<span class="br0">]</span>,
      <span class="br0">[</span>EndDate<span class="br0">]</span>,
      <span class="br0">[</span>Rank<span class="br0">]</span>
    <span class="br0">&#41;</span>
    <span class="kw1">VALUES</span>
    <span class="br0">&#40;</span>
      @p_Batch_ID,
      @p_BatchSize,
      @p_Object_ID,
      @p_Entity_ID,
      @p_Object,
      @p_StartDate,
      @p_EndDate,
      @p_Rank
    <span class="br0">&#41;</span>;
  <span class="kw1">END</span> TRY
&nbsp;
  <span class="kw1">BEGIN</span> CATCH
&nbsp;
    <span class="kw1">SELECT</span> @v_Error                  <span class="sy0">=</span> 100001
          ,@v_MSG                    <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">NVARCHAR</span><span class="br0">&#40;</span><span class="nu0">2500</span><span class="br0">&#41;</span>, 
                                        <span class="st0">'Error: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_NUMBER<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span> 
                                        <span class="st0">' Severity: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_SEVERITY<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                        <span class="st0">' State: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_STATE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                        <span class="st0">' Line: '</span> <span class="sy0">+</span>  <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_L<span class="sy0">IN</span>E<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                        <span class="st0">' Procedure: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_PROCEDURE<span class="br0">&#40;</span><span class="br0">&#41;</span>, @v_Obj<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                        <span class="st0">' MSG: Error Inserting into [DBCATCH].[dbo].[TU_Batch] with error:'</span> <span class="sy0">+</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_MESSAGE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;  
    <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ErrorLog_ADD<span class="br0">]</span>
      @p_Error_ID                    <span class="sy0">=</span> @v_Error,
      @p_System                      <span class="sy0">=</span> <span class="sy0">NULL</span>,
      @p_DB                          <span class="sy0">=</span> @v_DB,
      @p_Obj                         <span class="sy0">=</span> @v_Obj,
      @p_App                         <span class="sy0">=</span> @v_App,
      @p_User                        <span class="sy0">=</span> @v_User,
      @p_ErrorMsg                    <span class="sy0">=</span> @v_MSG;
&nbsp;
    <span class="kw1">ROLLBACK</span> <span class="kw1">TRAN</span>;
    <span class="kw1">RETURN</span> @v_Error;
&nbsp;
  <span class="kw1">END</span> CATCH;
<span class="kw1">COMMIT</span> <span class="kw1">TRANSACTION</span>;
GO
<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span><span class="st0">'[dbo].[PU_BatchDetail_ADD]'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NOT</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; CREATED PROCEDURE [dbo].[PU_BatchDetail_ADD] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span>;
<span class="kw1">ELSE</span> 
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; FAILED TO CREATE PROCEDURE [dbo].[PU_BatchDetail_ADD] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span>;
GO</pre></div></div>



<h3 class="wp-block-heading"><strong>Final Step: Update Procedure &amp; Stop Times</strong></h3>



<p>The last task in your T-SQL batching is to create an update procedure for the batch detail records. This adds stop times for each nested iteration and for the batch itself.</p>


<div id="wpshdo_41" class="wp-synhighlighter-outer"><div id="wpshdt_41" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_41"></a><a id="wpshat_41" class="wp-synhighlighter-title" href="#codesyntax_41"  onClick="javascript:wpsh_toggleBlock(41)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_41" onClick="javascript:wpsh_code(41)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_41" onClick="javascript:wpsh_print(41)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_41" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> DBCATCH
GO
<span class="kw1">IF</span> <span class="sy0">EXISTS</span><span class="br0">&#40;</span><span class="kw1">SELECT</span> 1
            <span class="kw1">FROM</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>sysobjects<span class="br0">]</span> <span class="br0">&#40;</span>NOLOCK<span class="br0">&#41;</span>
           <span class="kw1">WHERE</span> <span class="br0">[</span>id<span class="br0">]</span>                                            <span class="sy0">=</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span>N<span class="st0">'[dbo].[PU_BatchDetail_UPD]'</span><span class="br0">&#41;</span>
             <span class="sy0">AND</span> <span class="kw2">OBJECTPROPERTY</span><span class="br0">&#40;</span><span class="br0">[</span>id<span class="br0">]</span>, N<span class="st0">'IsProcedure'</span><span class="br0">&#41;</span>            <span class="sy0">=</span> 1<span class="br0">&#41;</span> 
<span class="kw1">BEGIN</span> 
  <span class="kw1">DROP</span> <span class="kw1">PROCEDURE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_BatchDetail_UPD<span class="br0">]</span>;
&nbsp;
  <span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; DROPPED PROCEDURE [dbo].[PU_BatchDetail_UPD] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span> 
GO
<span class="kw1">CREATE</span> <span class="kw1">PROC</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_BatchDetail_UPD<span class="br0">]</span>
  @p_ActivityLog_ID              <span class="br0">[</span><span class="kw1">BIGINT</span><span class="br0">]</span>
 ,@p_Batch_ID                    <span class="br0">[</span><span class="kw1">UNIQUEIDENTIFIER</span><span class="br0">]</span>              <span class="sy0">=</span> <span class="sy0">NULL</span>
 ,@p_Now                         <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                      <span class="sy0">=</span> <span class="sy0">NULL</span>
<span class="kw1">WITH</span> ENCRYPTION
<span class="kw1">AS</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* Name        : PU_BatchDetail_UPD                                                              */</span>
<span class="coMULTI">/* Version     : 1.0                                                                             */</span>
<span class="coMULTI">/* Author      : Jared Kirkpatrick                                                               */</span>
<span class="coMULTI">/* Date        : 2019-08-24                                                                      */</span>
<span class="coMULTI">/* Description : Updating the Batch detail log                                                   */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* Date        : Version: Who: Description                                                       */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* 2019-08-24  : 1.0    : REB: Initial Release.                                                */</span>
<span class="coMULTI">/*************************************************************************************************/</span>
<span class="kw1">SET</span> <span class="kw1">NOCOUNT</span> <span class="kw1">ON</span>;
<span class="coMULTI">/* Declare Variables */</span>
<span class="coMULTI">/* Declare Variables */</span>
<span class="kw1">DECLARE</span> @v_Now                       <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>
       ,@v_Domain                    <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_IPAddress                 <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_SQL                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>4000<span class="br0">&#41;</span>
       ,@v_UserName                  <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_PW                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Error                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_ActivityLog_ID            <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_DB                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Obj                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_App                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_User                      <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>            
       ,@v_Spid                      <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Debug                     <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>       
       ,@v_MSG                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>1000<span class="br0">&#41;</span>
       ,@v_SystemName                <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Connect_Type_ID           <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_RowCount                  <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Count                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Version                   <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_MSSQL_ID                  <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>;
&nbsp;
<span class="coMULTI">/* Define Variables */</span>
<span class="kw1">SELECT</span> @v_Now                        <span class="sy0">=</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_DB                         <span class="sy0">=</span> <span class="kw2">DB_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_Obj                        <span class="sy0">=</span> <span class="st0">'[DBCATCH].[dbo].[PU_BatchDetail_UPD]'</span>
      ,@v_App                        <span class="sy0">=</span> <span class="kw2">APP_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_User                       <span class="sy0">=</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span><span class="sy0">OR</span>IG<span class="sy0">IN</span>AL_LOG<span class="sy0">IN</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">USER_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
      ,@v_Spid                       <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>25<span class="br0">&#41;</span>, <span class="kw2">@@SPID</span><span class="br0">&#41;</span> 
      ,@v_Debug                      <span class="sy0">=</span> <span class="nu0">0</span>;
&nbsp;
<span class="kw1">IF</span> @v_Debug <span class="sy0">=</span> 1
<span class="kw1">BEGIN</span> <span class="co1">-- debug = 1 Ref: 1</span>
  <span class="kw1">SELECT</span> <span class="st0">'REF:1 - Define Static Variables'</span>;
  <span class="kw1">SELECT</span> @v_Now                      <span class="kw1">AS</span> <span class="br0">[</span><span class="kw2">GETDATE</span><span class="br0">]</span>
        ,@v_DB                       <span class="kw1">AS</span> <span class="br0">[</span>DB<span class="br0">]</span>
        ,@v_Obj                      <span class="kw1">AS</span> <span class="br0">[</span>OBJ<span class="br0">]</span>
        ,@v_App                      <span class="kw1">AS</span> <span class="br0">[</span>APP<span class="br0">]</span>
        ,@v_User                     <span class="kw1">AS</span> <span class="br0">[</span><span class="kw1">USER</span><span class="br0">]</span>
        ,@v_Spid                     <span class="kw1">AS</span> <span class="br0">[</span>SPID<span class="br0">]</span>
        ,@p_Batch_ID                 <span class="kw1">AS</span> <span class="br0">[</span>Batch_ID<span class="br0">]</span>;
&nbsp;
<span class="kw1">END</span>; <span class="co1">-- debug = 1       </span>
<span class="kw1">BEGIN</span> <span class="kw1">TRANSACTION</span> 
  <span class="kw1">BEGIN</span> TRY
    <span class="kw1">UPDATE</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_BatchDetail<span class="br0">]</span>                         <span class="kw1">WITH</span> <span class="br0">&#40;</span>ROWLOCK<span class="br0">&#41;</span>
       <span class="kw1">SET</span> <span class="br0">[</span>EndDate<span class="br0">]</span>                 <span class="sy0">=</span> @p_Now
          ,<span class="br0">[</span>Active<span class="br0">]</span>                  <span class="sy0">=</span> 0
     <span class="kw1">WHERE</span> <span class="br0">[</span><span class="kw2">OBJECT_ID</span><span class="br0">]</span>               <span class="sy0">=</span> @p_ActivityLog_ID
       <span class="sy0">AND</span> <span class="br0">[</span>Batch_ID<span class="br0">]</span>                <span class="sy0">=</span> @p_Batch_ID;
  <span class="kw1">END</span> TRY
&nbsp;
  <span class="kw1">BEGIN</span> CATCH
&nbsp;
    <span class="kw1">SELECT</span> @v_Error                  <span class="sy0">=</span> 100002
          ,@v_MSG                    <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">NVARCHAR</span><span class="br0">&#40;</span><span class="nu0">2500</span><span class="br0">&#41;</span>, 
                                       <span class="st0">'Error: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_NUMBER<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span> 
                                       <span class="st0">' Severity: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_SEVERITY<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' State: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_STATE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' Line: '</span> <span class="sy0">+</span>  <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_L<span class="sy0">IN</span>E<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' Procedure: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_PROCEDURE<span class="br0">&#40;</span><span class="br0">&#41;</span>, @v_Obj<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' MSG: Error Updating [DBCATCH].[dbo].[TU_BatchDetail] with error:'</span> <span class="sy0">+</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_MESSAGE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;  
    <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ErrorLog_ADD<span class="br0">]</span>
      @p_Error_ID                    <span class="sy0">=</span> @v_Error,
      @p_System                      <span class="sy0">=</span> <span class="sy0">NULL</span>,
      @p_DB                          <span class="sy0">=</span> @v_DB,
      @p_Obj                         <span class="sy0">=</span> @v_Obj,
      @p_App                         <span class="sy0">=</span> @v_App,
      @p_User                        <span class="sy0">=</span> @v_User,
      @p_ErrorMsg                    <span class="sy0">=</span> @v_MSG;
&nbsp;
    <span class="kw1">ROLLBACK</span> <span class="kw1">TRAN</span>;
    <span class="kw1">RETURN</span> @v_Error;
&nbsp;
  <span class="kw1">END</span> CATCH;
<span class="kw1">COMMIT</span> <span class="kw1">TRANSACTION</span>;
GO
<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span><span class="st0">'[dbo].[PU_BatchDetail_UPD]'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NOT</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; CREATED PROCEDURE [dbo].[PU_BatchDetail_UPD] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span>;
<span class="kw1">ELSE</span> 
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; FAILED TO CREATE PROCEDURE [dbo].[PU_BatchDetail_UPD] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span>;
GO</pre></div></div>



<p>That completes the objects needed to make our T-SQL batching framework functional, and completes part 4 of the series. In part 5, the final installment, we’ll go over these batching features and wrap it all up.</p>



<p><a href="https://sqlsolutionsgroup.com/t-sql-framework-2/"><span style="text-decoration: underline;">GO TO PART FIVE</span></a></p>
<p>The post <a href="https://sqlsolutionsgroup.com/t-sql-batching/">T-SQL Batching: Framework, pt. 4</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlsolutionsgroup.com/t-sql-batching/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>The T-SQL Activity Log: Framework, pt. 3</title>
		<link>https://sqlsolutionsgroup.com/the-tsql-activity-log/</link>
					<comments>https://sqlsolutionsgroup.com/the-tsql-activity-log/#respond</comments>
		
		<dc:creator><![CDATA[Jared Kirkpatrick]]></dc:creator>
		<pubDate>Wed, 21 Aug 2019 12:34:21 +0000</pubDate>
				<category><![CDATA[SQL Group]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[#microsftcertifedmaster]]></category>
		<category><![CDATA[#microsftpartner]]></category>
		<category><![CDATA[#SQLAB]]></category>
		<category><![CDATA[#SQlatino]]></category>
		<category><![CDATA[#SQlatinoamerica]]></category>
		<category><![CDATA[#sqldatabase]]></category>
		<category><![CDATA[#sqldeveloper]]></category>
		<category><![CDATA[#SQLgroupie]]></category>
		<category><![CDATA[#sqlimer]]></category>
		<category><![CDATA[#sqlimerbymay]]></category>
		<category><![CDATA[#sqlinjection]]></category>
		<category><![CDATA[#sqlinternals]]></category>
		<category><![CDATA[#sqlite]]></category>
		<category><![CDATA[#sqlite3]]></category>
		<category><![CDATA[#SQLLearning]]></category>
		<category><![CDATA[#SQLMagazine]]></category>
		<category><![CDATA[#sqlmanagementstudio]]></category>
		<category><![CDATA[#sqlmanager]]></category>
		<category><![CDATA[#Sqlmap]]></category>
		<category><![CDATA[#sqlrun]]></category>
		<category><![CDATA[#sqlsaturday2017]]></category>
		<category><![CDATA[#sqlsatvienna]]></category>
		<category><![CDATA[#sqlserver]]></category>
		<category><![CDATA[#SQLserver2012]]></category>
		<category><![CDATA[#sqlserver2014]]></category>
		<category><![CDATA[#sqlserver2017]]></category>
		<category><![CDATA[#sqlserver2022]]></category>
		<category><![CDATA[#SQLServeronLinux]]></category>
		<category><![CDATA[#SQLsolutionsgroup]]></category>
		<category><![CDATA[#SQLTraining]]></category>
		<category><![CDATA[#SQLYog]]></category>
		<category><![CDATA[Activity Log]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQLPASS]]></category>
		<category><![CDATA[SQLSaturday]]></category>
		<category><![CDATA[SSG]]></category>
		<category><![CDATA[T-SQL]]></category>
		<guid isPermaLink="false">http://sqlsolutionsgroup.com/?p=4215</guid>

					<description><![CDATA[<p>The post <a href="https://sqlsolutionsgroup.com/the-tsql-activity-log/">The T-SQL Activity Log: Framework, pt. 3</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>This segment of the framework builds onto what we have already created in <span style="text-decoration: underline;"><a href="https://sqlsolutionsgroup.com/sql-error-engine/">Part 2 of the T-SQL Framework</a></span>. That post showed you how to build the Error Engine, or build in tasks to do our error handling for us. In building the T-SQL Activity Log, we will leverage some of the structures and processes we have already built and tested. If you have not gone through and created the initial T-SQL Framework from part two, please go back and do that now.</p>
<p>The Activity Log will log every routine we create. This includes logging:</p>
<ul>
<li>The start of the routine</li>
<li>The name of the routine</li>
<li>Who initiated the process</li>
<li>Where the process was started</li>
<li>When the process started</li>
<li>Error codes if any that the process encountered (this will be from our error engine we developed in part 2)</li>
<li>When the routine completed so we will have a baseline at least in time of how long it takes the process to run</li>
</ul>
<h3>Create the T-SQL Activity Log Table</h3>
<p>Let’s jump right in and create the table we will need in order to build the T-SQL activity log information, shown in code:</p>
<div id="wpshdo_42" class="wp-synhighlighter-outer"><div id="wpshdt_42" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_42"></a><a id="wpshat_42" class="wp-synhighlighter-title" href="#codesyntax_42"  onClick="javascript:wpsh_toggleBlock(42)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_42" onClick="javascript:wpsh_code(42)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_42" onClick="javascript:wpsh_print(42)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_42" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="coMULTI">/*============================================================================*/</span>
<span class="coMULTI">/****** Object:  Table [dbo].[TU_ActivityLog]         Script Date: 2019-10-15                ******/</span>
<span class="coMULTI">/*============================================================================*/</span>
	<span class="kw1">PRINT</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span><span class="nu0">13</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'Creating table [dbo].[TU_ActivityLog].'</span>;	
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_ActivityLog<span class="br0">]</span> 
<span class="br0">&#40;</span>
  <span class="br0">[</span>ActivityLog_ID<span class="br0">]</span> <span class="br0">[</span><span class="kw1">BIGINT</span><span class="br0">]</span>  <span class="kw1">IDENTITY</span> <span class="br0">&#40;</span>1, 1<span class="br0">&#41;</span>                                     <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>PK_ActivityLog_ID<span class="br0">]</span>   
    <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="kw1">CLUSTERED</span>  
 ,<span class="br0">[</span>System<span class="br0">]</span>         <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NULL</span>
 ,<span class="br0">[</span>Error_ID<span class="br0">]</span>       <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                                                         <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>FK_TU_ActivityLog_Error_ID<span class="br0">]</span>
       <span class="kw1">FOREIGN</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span><span class="br0">[</span>Error_ID<span class="br0">]</span><span class="br0">&#41;</span> 
    <span class="kw1">REFERENCES</span> <span class="br0">[</span>TU_Error<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>Error_ID<span class="br0">]</span><span class="br0">&#41;</span>   
 ,<span class="br0">[</span>DB<span class="br0">]</span>             <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NULL</span>
 ,<span class="br0">[</span>Obj<span class="br0">]</span>            <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NULL</span>
 ,<span class="br0">[</span>App<span class="br0">]</span>            <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NULL</span>
 ,<span class="br0">[</span><span class="kw1">USER</span><span class="br0">]</span>           <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NULL</span> 
 ,<span class="br0">[</span>SPID<span class="br0">]</span>           <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NULL</span> 
 ,<span class="br0">[</span>Description<span class="br0">]</span>    <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>512<span class="br0">&#41;</span>	<span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS           <span class="sy0">NULL</span> 
 ,<span class="br0">[</span>StartTime<span class="br0">]</span>      <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NULL</span>
 ,<span class="br0">[</span>EndTime<span class="br0">]</span>        <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NULL</span> 
 ,<span class="br0">[</span>Active<span class="br0">]</span>         <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>                                                         <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_ActivityLog_Active<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="br0">&#40;</span>1<span class="br0">&#41;</span>
 ,<span class="br0">[</span>DateCreated<span class="br0">]</span>    <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>							     <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_ActivityLog_DateCreated<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>DateModified<span class="br0">]</span>    <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>			    			          <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_ActivityLog_DateModified<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>			
<span class="br0">&#41;</span> <span class="kw1">ON</span> <span class="br0">[</span><span class="kw1">PRIMARY</span><span class="br0">]</span>;
&nbsp;
&nbsp;
<span class="coMULTI">/* FK Index */</span>
<span class="kw1">CREATE</span> <span class="kw1">NONCLUSTERED</span> <span class="kw1">INDEX</span> idxfk_TU_ActivityLog_Error_ID <span class="kw1">ON</span> <span class="br0">[</span>TU_ActivityLog<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>Error_ID<span class="br0">]</span><span class="br0">&#41;</span></pre></div></div>
<p>Looking at the table definition, you can see we have several columns that were variables in the original framework when we created the error engine. We used most of those variables to define our customized error if we went into the begin catch part of the procedure orchestrated through the template we developed. The point is that we can use the variables outside of the scope of just the error handling.</p>
<p>We are reusing variables that we defined in the framework to facilitate information between features but doing so in a way that all roads lead back to Rome. When you use this methodology, you will find it makes your code simpler and easier for others to read. Most importantly, if we have developed and tested variables from one feature that we need in another, we don’t have to retest if we did our job correctly the first time. That cuts down on development/troubleshooting time as well. Enough about theory and methodology, let’s get back to some development!</p>
<h3>Create Two Procedures</h3>
<p>The next thing we need are two procedures: one to insert into the activity log, and another to update the activity log when we are done with the process — either at a successful completion or at the end of our Begin Catch if there was an error. The first stored procedure is the Insert, shown below:</p>
<div id="wpshdo_43" class="wp-synhighlighter-outer"><div id="wpshdt_43" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_43"></a><a id="wpshat_43" class="wp-synhighlighter-title" href="#codesyntax_43"  onClick="javascript:wpsh_toggleBlock(43)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_43" onClick="javascript:wpsh_code(43)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_43" onClick="javascript:wpsh_print(43)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_43" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> DBCATCH
GO
&nbsp;
<span class="kw1">IF</span> <span class="sy0">EXISTS</span><span class="br0">&#40;</span><span class="kw1">SELECT</span> 1
            <span class="kw1">FROM</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>sysobjects<span class="br0">]</span> <span class="br0">&#40;</span>NOLOCK<span class="br0">&#41;</span>
           <span class="kw1">WHERE</span> <span class="br0">[</span>id<span class="br0">]</span>                                            <span class="sy0">=</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span>N<span class="st0">'[dbo].[PU_ActivityLog_ADD]'</span><span class="br0">&#41;</span>
             <span class="sy0">AND</span> <span class="kw2">OBJECTPROPERTY</span><span class="br0">&#40;</span><span class="br0">[</span>id<span class="br0">]</span>, N<span class="st0">'IsProcedure'</span><span class="br0">&#41;</span>            <span class="sy0">=</span> 1<span class="br0">&#41;</span> 
&nbsp;
<span class="kw1">BEGIN</span> 
  <span class="kw1">DROP</span> <span class="kw1">PROCEDURE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ActivityLog_ADD<span class="br0">]</span>;
&nbsp;
  <span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; DROPPED PROCEDURE [dbo].[PU_ActivityLog_ADD] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span> 
GO
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">PROC</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ActivityLog_ADD<span class="br0">]</span>
  @p_System                          <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>             <span class="sy0">=</span> <span class="sy0">NULL</span>
 ,@p_Error_ID                        <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                       <span class="sy0">=</span> <span class="sy0">NULL</span>
 ,@p_DB                              <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>             <span class="sy0">=</span> <span class="sy0">NULL</span>
 ,@p_Obj                             <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>             <span class="sy0">=</span> <span class="sy0">NULL</span>
 ,@p_App                             <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>             <span class="sy0">=</span> <span class="sy0">NULL</span>
 ,@p_User                            <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>             <span class="sy0">=</span> <span class="sy0">NULL</span>
 ,@p_SPID                            <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>             <span class="sy0">=</span> <span class="sy0">NULL</span>
 ,@p_Description                     <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>512<span class="br0">&#41;</span>             <span class="sy0">=</span> <span class="sy0">NULL</span>
 ,@p_StartTime                       <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                  <span class="sy0">=</span> <span class="sy0">NULL</span>
 ,@p_EndTime                         <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                  <span class="sy0">=</span> <span class="sy0">NULL</span>
 ,@p_ActivityLog_ID                  <span class="br0">[</span><span class="kw1">BIGINT</span><span class="br0">]</span>                       <span class="kw1">OUTPUT</span>
<span class="kw1">WITH</span> ENCRYPTION
<span class="kw1">AS</span>
&nbsp;
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* Name        : PU_ActivityLog_ADD                                                              */</span>
<span class="coMULTI">/* Version     : 1.0                                                                             */</span>
<span class="coMULTI">/* Author      : Jared Kirkpatrick                                                               */</span>
<span class="coMULTI">/* Date        : 2019-10-15                                                                      */</span>
<span class="coMULTI">/* Description : Adds a record to the Activity Log                                               */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* Date        : Version: Who: Description                                                       */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* 2019-10-15  : 1.0    : REB: Initial Release.                                                 */</span>
<span class="coMULTI">/*************************************************************************************************/</span>
&nbsp;
<span class="kw1">SET</span> <span class="kw1">NOCOUNT</span> <span class="kw1">ON</span>
&nbsp;
<span class="coMULTI">/* Declare Variables */</span>
<span class="kw1">DECLARE</span> @v_Error                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_MSG                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>2500<span class="br0">&#41;</span>;
&nbsp;
<span class="kw1">BEGIN</span> <span class="kw1">TRANSACTION</span> 
&nbsp;
  <span class="kw1">BEGIN</span> TRY
&nbsp;
    <span class="kw1">INSERT</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_ActivityLog<span class="br0">]</span>
    <span class="br0">&#40;</span>
      <span class="br0">[</span>System<span class="br0">]</span>,
      <span class="br0">[</span>Error_ID<span class="br0">]</span>,
      <span class="br0">[</span>DB<span class="br0">]</span>,
      <span class="br0">[</span>Obj<span class="br0">]</span>,
      <span class="br0">[</span>App<span class="br0">]</span>,
      <span class="br0">[</span><span class="kw1">USER</span><span class="br0">]</span>,
      <span class="br0">[</span>SPID<span class="br0">]</span>,
      <span class="br0">[</span>Description<span class="br0">]</span>,
      <span class="br0">[</span>StartTime<span class="br0">]</span>,
      <span class="br0">[</span>EndTime<span class="br0">]</span>
    <span class="br0">&#41;</span>
    <span class="kw1">VALUES</span>
    <span class="br0">&#40;</span>
      @p_System,
      @p_Error_ID,
      @p_DB,
      @p_Obj,
      @p_App,
      @p_User,
      @p_SPID,
      @p_Description,
      @p_StartTime,
      @p_EndTime
    <span class="br0">&#41;</span>
&nbsp;
    <span class="kw1">SELECT</span> @p_ActivityLog_ID         <span class="sy0">=</span> @@<span class="kw1">IDENTITY</span>;  
&nbsp;
  <span class="kw1">END</span> TRY
&nbsp;
  <span class="kw1">BEGIN</span> CATCH
&nbsp;
    <span class="kw1">SELECT</span> @p_Obj                    <span class="sy0">=</span> <span class="st0">'[DBCATCH].[dbo].[TU_ActivityLog]'</span>;
&nbsp;
    <span class="kw1">SELECT</span> @v_Error  <span class="sy0">=</span> 100001
          ,@v_MSG    <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">NVARCHAR</span><span class="br0">&#40;</span><span class="nu0">2500</span><span class="br0">&#41;</span>, 
                     <span class="st0">'Error: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_NUMBER<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span> 
                     <span class="st0">' Severity: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_SEVERITY<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                     <span class="st0">' State: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_STATE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                     <span class="st0">' Line: '</span> <span class="sy0">+</span>  <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_L<span class="sy0">IN</span>E<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                     <span class="st0">' Procedure: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_PROCEDURE<span class="br0">&#40;</span><span class="br0">&#41;</span>, @p_Obj<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                     <span class="st0">' MSG: Error Inserting into [DBCATCH].[dbo].[TU_ActivityLog] with error:'</span> <span class="sy0">+</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_MESSAGE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;  
&nbsp;
    <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ErrorLog_ADD<span class="br0">]</span>
      @p_Error_ID                    <span class="sy0">=</span> @v_Error,
      @p_System                      <span class="sy0">=</span> @p_System,
      @p_DB                          <span class="sy0">=</span> @p_DB,
      @p_Obj                         <span class="sy0">=</span> @p_Obj,
      @p_App                         <span class="sy0">=</span> @p_App,
      @p_User                        <span class="sy0">=</span> @p_User,
      @p_ErrorMsg                    <span class="sy0">=</span> @v_MSG;
&nbsp;
    <span class="kw1">ROLLBACK</span> <span class="kw1">TRAN</span>;
    <span class="kw1">RETURN</span> @v_Error;
&nbsp;
  <span class="kw1">END</span> CATCH;
&nbsp;
<span class="kw1">COMMIT</span> <span class="kw1">TRANSACTION</span>;
GO
&nbsp;
<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span><span class="st0">'[dbo].[PU_ActivityLog_ADD]'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NOT</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; CREATED PROCEDURE [dbo].[PU_ActivityLog_ADD] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span>;
<span class="kw1">ELSE</span> 
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; FAILED TO CREATE PROCEDURE [dbo].[PU_ActivityLog_ADD] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span>;
GO</pre></div></div>
<p>Take a closer look at the error and error message in the &#8220;begin try&#8221; part of the procedure.<a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-1.png"><img loading="lazy" decoding="async" class="alignright wp-image-4216 size-full" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-1.png" alt="Building the T-SQL Activity Log" width="935" height="165" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-1.png 935w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-1-300x53.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-1-768x136.png 768w" sizes="(max-width: 935px) 100vw, 935px" /></a></p>
<p>&nbsp;</p>
<p>As you can see, we have changed the error number to match what we defined as our errors in TU_Error, as this error deals with an Insert. We also customized the error message to show it came while inserting into the activity log. The rest of the error will capture the server’s definition but this way we have set up our visuals where, if we see this in the error log, we will know where to look for answers.</p>
<p>We will do this with the update as well. Every time the code runs, it is running with a customized error handler to the routine at hand. Just a few seconds of time makes this a truly powerful tool, not only in development but through the lifecycle of the software process running on the server.</p>
<h3>The Update Procedure</h3>
<p>Next is the update procedure:</p>
<div id="wpshdo_44" class="wp-synhighlighter-outer"><div id="wpshdt_44" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_44"></a><a id="wpshat_44" class="wp-synhighlighter-title" href="#codesyntax_44"  onClick="javascript:wpsh_toggleBlock(44)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_44" onClick="javascript:wpsh_code(44)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_44" onClick="javascript:wpsh_print(44)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_44" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> DBCATCH
GO
&nbsp;
<span class="kw1">IF</span> <span class="sy0">EXISTS</span><span class="br0">&#40;</span><span class="kw1">SELECT</span> 1
            <span class="kw1">FROM</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>sysobjects<span class="br0">]</span> <span class="br0">&#40;</span>NOLOCK<span class="br0">&#41;</span>
           <span class="kw1">WHERE</span> <span class="br0">[</span>id<span class="br0">]</span>                                            <span class="sy0">=</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span>N<span class="st0">'[dbo].[PU_ActivityLog_UPD]'</span><span class="br0">&#41;</span>
             <span class="sy0">AND</span> <span class="kw2">OBJECTPROPERTY</span><span class="br0">&#40;</span><span class="br0">[</span>id<span class="br0">]</span>, N<span class="st0">'IsProcedure'</span><span class="br0">&#41;</span>            <span class="sy0">=</span> 1<span class="br0">&#41;</span> 
&nbsp;
<span class="kw1">BEGIN</span> 
  <span class="kw1">DROP</span> <span class="kw1">PROCEDURE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ActivityLog_UPD<span class="br0">]</span>;
&nbsp;
  <span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; DROPPED PROCEDURE [dbo].[PU_ActivityLog_UPD] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span> 
GO
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">PROC</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ActivityLog_UPD<span class="br0">]</span>
  @p_ActivityLog_ID                  <span class="br0">[</span><span class="kw1">BIGINT</span><span class="br0">]</span>,
  @p_System                          <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>             <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_Error_ID                        <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                       <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_DB                              <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>             <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_Obj                             <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>             <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_App                             <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>             <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_User                            <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>             <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_Description                     <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>512<span class="br0">&#41;</span>             <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_StartTime                       <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                  <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_EndTime                         <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                  <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_Active                          <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>                       <span class="sy0">=</span> 0,
  @p_DateModified                    <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>
<span class="kw1">WITH</span> ENCRYPTION
<span class="kw1">AS</span>
&nbsp;
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* Name        : PU_ActivityLog_UPD                                                              */</span>
<span class="coMULTI">/* Version     : 1.0                                                                             */</span>
<span class="coMULTI">/* Author      : Jared Kirkpatrick                                                               */</span>
<span class="coMULTI">/* Date        : 2019-05-24                                                                      */</span>
<span class="coMULTI">/* Description : Updating the activity log                                                       */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* Date        : Version: Who: Description                                                       */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* 2019-05-24  : 1.0    : REB: Initial Release.                                                 */</span>
<span class="coMULTI">/*************************************************************************************************/</span>
&nbsp;
<span class="kw1">SET</span> <span class="kw1">NOCOUNT</span> <span class="kw1">ON</span>;
&nbsp;
<span class="coMULTI">/* Declare Variables */</span>
<span class="kw1">DECLARE</span> @v_Error                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_MSG                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>2500<span class="br0">&#41;</span>;
&nbsp;
<span class="kw1">BEGIN</span> <span class="kw1">TRANSACTION</span> 
&nbsp;
  <span class="kw1">BEGIN</span> TRY
&nbsp;
    <span class="kw1">UPDATE</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_ActivityLog<span class="br0">]</span>                         <span class="kw1">WITH</span> <span class="br0">&#40;</span>ROWLOCK<span class="br0">&#41;</span>
       <span class="kw1">SET</span> <span class="br0">[</span>System<span class="br0">]</span>                  <span class="sy0">=</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>@p_System,      <span class="br0">[</span>System<span class="br0">]</span><span class="br0">&#41;</span>,
           <span class="br0">[</span>Error_ID<span class="br0">]</span>                <span class="sy0">=</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>@p_Error_ID,    <span class="br0">[</span>Error_ID<span class="br0">]</span><span class="br0">&#41;</span>,
           <span class="br0">[</span>DB<span class="br0">]</span>                      <span class="sy0">=</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>@p_DB,          <span class="br0">[</span>DB<span class="br0">]</span><span class="br0">&#41;</span>,
           <span class="br0">[</span>Obj<span class="br0">]</span>                     <span class="sy0">=</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>@p_Obj,         <span class="br0">[</span>Obj<span class="br0">]</span><span class="br0">&#41;</span>,
           <span class="br0">[</span>App<span class="br0">]</span>                     <span class="sy0">=</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>@p_App,         <span class="br0">[</span>App<span class="br0">]</span><span class="br0">&#41;</span>,
           <span class="br0">[</span><span class="kw1">USER</span><span class="br0">]</span>                    <span class="sy0">=</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>@p_User,        <span class="br0">[</span><span class="kw1">USER</span><span class="br0">]</span><span class="br0">&#41;</span>,
           <span class="br0">[</span>Description<span class="br0">]</span>             <span class="sy0">=</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>@p_Description, <span class="br0">[</span>Description<span class="br0">]</span><span class="br0">&#41;</span>,
           <span class="br0">[</span>StartTime<span class="br0">]</span>               <span class="sy0">=</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>@p_StartTime,   <span class="br0">[</span>StartTime<span class="br0">]</span><span class="br0">&#41;</span>,
           <span class="br0">[</span>EndTime<span class="br0">]</span>                 <span class="sy0">=</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>@p_EndTime,     <span class="br0">[</span>EndTime<span class="br0">]</span><span class="br0">&#41;</span>,
           <span class="br0">[</span>Active<span class="br0">]</span>                  <span class="sy0">=</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>@p_Active,      <span class="br0">[</span>Active<span class="br0">]</span><span class="br0">&#41;</span>,
           <span class="br0">[</span>DateModified<span class="br0">]</span>            <span class="sy0">=</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>@p_DateModified, <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
     <span class="kw1">WHERE</span> <span class="br0">[</span>ActivityLog_ID<span class="br0">]</span>          <span class="sy0">=</span> @p_ActivityLog_ID;
&nbsp;
  <span class="kw1">END</span> TRY
&nbsp;
  <span class="kw1">BEGIN</span> CATCH
&nbsp;
    <span class="kw1">SELECT</span> @p_Obj                    <span class="sy0">=</span> <span class="st0">'[DBCATCH].[dbo].[TU_ActivityLog]'</span>;
&nbsp;
    <span class="kw1">SELECT</span> @v_Error                  <span class="sy0">=</span> 100002
          ,@v_MSG                    <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">NVARCHAR</span><span class="br0">&#40;</span><span class="nu0">2500</span><span class="br0">&#41;</span>, 
                                       <span class="st0">'Error: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_NUMBER<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span> 
                                       <span class="st0">' Severity: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_SEVERITY<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' State: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_STATE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' Line: '</span> <span class="sy0">+</span>  <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_L<span class="sy0">IN</span>E<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' Procedure: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_PROCEDURE<span class="br0">&#40;</span><span class="br0">&#41;</span>, @p_Obj<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' MSG: Error Updating [DBCATCH].[dbo].[TU_ActivityLog] with error:'</span> <span class="sy0">+</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_MESSAGE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;  
&nbsp;
    <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ErrorLog_ADD<span class="br0">]</span>
      @p_Error_ID                    <span class="sy0">=</span> @v_Error,
      @p_System                      <span class="sy0">=</span> @p_System,
      @p_DB                          <span class="sy0">=</span> @p_DB,
      @p_Obj                         <span class="sy0">=</span> @p_Obj,
      @p_App                         <span class="sy0">=</span> @p_App,
      @p_User                        <span class="sy0">=</span> @p_User,
      @p_ErrorMsg                    <span class="sy0">=</span> @v_MSG;
&nbsp;
    <span class="kw1">ROLLBACK</span> <span class="kw1">TRAN</span>;
    <span class="kw1">RETURN</span> @v_Error;
&nbsp;
  <span class="kw1">END</span> CATCH;
&nbsp;
<span class="kw1">COMMIT</span> <span class="kw1">TRANSACTION</span>;
GO
&nbsp;
<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span><span class="st0">'[dbo].[PU_ActivityLog_UPD]'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NOT</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; CREATED PROCEDURE [dbo].[PU_ActivityLog_UPD] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span>;
<span class="kw1">ELSE</span> 
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; FAILED TO CREATE PROCEDURE [dbo].[PU_ActivityLog_UPD] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span>;
GO</pre></div></div><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-2.png"><img loading="lazy" decoding="async" class="alignright size-full wp-image-4217" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-2.png" alt="" width="999" height="158" /></a></p>
<p>Once again, we changed the error number and the custom message for this routine. Plan on always updating these two areas on the template as you create each new procedure. Speaking of the template, it&#8217;s time to add some code to the template so that we can add this feature, writing to the activity log.</p>
<div id="wpshdo_45" class="wp-synhighlighter-outer"><div id="wpshdt_45" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_45"></a><a id="wpshat_45" class="wp-synhighlighter-title" href="#codesyntax_45"  onClick="javascript:wpsh_toggleBlock(45)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_45" onClick="javascript:wpsh_code(45)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_45" onClick="javascript:wpsh_print(45)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_45" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> DBCATCH
GO
&nbsp;
<span class="kw1">IF</span> <span class="sy0">EXISTS</span><span class="br0">&#40;</span><span class="kw1">SELECT</span> 1
            <span class="kw1">FROM</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>sysobjects<span class="br0">]</span> <span class="br0">&#40;</span>NOLOCK<span class="br0">&#41;</span>
           <span class="kw1">WHERE</span> <span class="br0">[</span>id<span class="br0">]</span>          <span class="sy0">=</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span>N<span class="st0">'[dbo].[&lt;Name, SYSNAME, PU_DB_ADD&gt;]'</span><span class="br0">&#41;</span>
             <span class="sy0">AND</span> <span class="kw2">OBJECTPROPERTY</span><span class="br0">&#40;</span><span class="br0">[</span>id<span class="br0">]</span>, N<span class="st0">'IsProcedure'</span><span class="br0">&#41;</span>            <span class="sy0">=</span> 1<span class="br0">&#41;</span> 
&nbsp;
<span class="kw1">BEGIN</span> 
  <span class="kw1">DROP</span> <span class="kw1">PROCEDURE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span><span class="sy0">&lt;</span>Name, SYSNAME, PU_DB_ADD<span class="sy0">&gt;</span><span class="br0">]</span>;
&nbsp;
  <span class="kw1">PRINT</span> <span class="st0">'&gt;&gt;&gt; DROPPED PROCEDURE [dbo].[&lt;Name, SYSNAME, PU_DB_ADD&gt;] &lt;&lt;&lt;'</span>;
<span class="kw1">END</span> 
GO
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">PROC</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span><span class="sy0">&lt;</span>Name, SYSNAME, PU_DB_ADD<span class="sy0">&gt;</span><span class="br0">]</span>
<span class="kw1">WITH</span> ENCRYPTION
<span class="kw1">AS</span>
&nbsp;
<span class="coMULTI">/******************************************************/</span> 
<span class="coMULTI">/* Name        : &lt;Name, SYSNAME, PU_DB_ADD&gt;           */</span>
<span class="coMULTI">/* Version     : 1.0                                  */</span>
<span class="coMULTI">/* Author      :                                      */</span>
<span class="coMULTI">/* Date        : 2019-07-24                           */</span>
<span class="coMULTI">/* Description :                                      */</span>
<span class="coMULTI">/******************************************************/</span> 
<span class="coMULTI">/* Date        : Version: Who: Description            */</span>
<span class="coMULTI">/******************************************************/</span> 
<span class="coMULTI">/* 2019-07-24  : 1.0    :    : Initial Release.      */</span>
<span class="coMULTI">/******************************************************/</span> 
&nbsp;
<span class="kw1">SET</span> <span class="kw1">NOCOUNT</span> <span class="kw1">ON</span>;
&nbsp;
<span class="coMULTI">/* Declare Variables */</span>
<span class="kw1">DECLARE</span> @v_Error                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_MSG                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>500<span class="br0">&#41;</span>
       ,@v_DB                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Obj                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_App                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_User                      <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Spid                      <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_ActivityLog_ID            <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_ADesc                     <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>512<span class="br0">&#41;</span>
       ,@v_Now                       <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>
       ,@v_LastErrorDate             <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>
       ,@v_SystemName                <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_RowCount                  <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Count                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Min<span class="sy0">IN</span>T                    <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Max<span class="sy0">IN</span>T                    <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Version                   <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>       
       ,@v_KeyWord                   <span class="br0">[</span>SYSNAME<span class="br0">]</span>   
       ,@v_MSSQL_ID                  <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Domain                    <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>  
       ,@v_Batch_Type_ID             <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span> 
	   ,@v_System                    <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_SQL                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>4000<span class="br0">&#41;</span>  
       ,@v_UserName                  <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_PW                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Debug                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>;
&nbsp;
<span class="kw1">SELECT</span> @v_Now                        <span class="sy0">=</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_DB                         <span class="sy0">=</span> <span class="kw2">DB_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_Obj                        <span class="sy0">=</span> <span class="st0">'[DBCATCH].[dbo].[&lt;Name, SYSNAME, PU_DB_ADD&gt;]'</span>
      ,@v_App                        <span class="sy0">=</span> <span class="kw2">APP_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_User                       <span class="sy0">=</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span><span class="sy0">OR</span>IG<span class="sy0">IN</span>AL_LOG<span class="sy0">IN</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">USER_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
      ,@v_Spid                       <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>25<span class="br0">&#41;</span>, <span class="kw2">@@SPID</span><span class="br0">&#41;</span>
	  ,@v_System                     <span class="sy0">=</span> <span class="kw2">HOST_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_Debug                      <span class="sy0">=</span> <span class="nu0">0</span>;  
&nbsp;
&nbsp;
<span class="coMULTI">/* Create Temp Tables */</span>
&nbsp;
<span class="kw1">IF</span> @v_Debug                          <span class="sy0">=</span> 1
<span class="kw1">BEGIN</span> <span class="co1">-- debug = 1 Ref: 1</span>
&nbsp;
  <span class="kw1">SELECT</span> <span class="st0">'REF:1 - Define Static Variables'</span>;
&nbsp;
  <span class="kw1">SELECT</span> @v_Now                      <span class="kw1">AS</span> <span class="br0">[</span><span class="kw2">GETDATE</span><span class="br0">]</span>
        ,@v_DB                       <span class="kw1">AS</span> <span class="br0">[</span>DB<span class="br0">]</span>
        ,@v_Obj                      <span class="kw1">AS</span> <span class="br0">[</span>OBJ<span class="br0">]</span>
        ,@v_App                      <span class="kw1">AS</span> <span class="br0">[</span>APP<span class="br0">]</span>
        ,@v_User                     <span class="kw1">AS</span> <span class="br0">[</span><span class="kw1">USER</span><span class="br0">]</span>
        ,@v_Spid                     <span class="kw1">AS</span> <span class="br0">[</span>SPID<span class="br0">]</span>;
&nbsp;
<span class="kw1">END</span>; <span class="co1">-- debug = 1    </span>
&nbsp;
<span class="coMULTI">/* Start the activity_log */</span>
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ActivityLog_ADD<span class="br0">]</span>
  @p_Error_ID                        <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_System                          <span class="sy0">=</span> @v_System,
  @p_DB                              <span class="sy0">=</span> @v_DB,
  @p_Obj                             <span class="sy0">=</span> @v_Obj,
  @p_App                             <span class="sy0">=</span> @v_App,
  @p_User                            <span class="sy0">=</span> @v_User,
  @p_Spid                            <span class="sy0">=</span> @v_Spid,
  @p_Description                     <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_StartTime                       <span class="sy0">=</span> @v_Now,
  @p_EndTime                         <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_ActivityLog_ID                  <span class="sy0">=</span> @v_ActivityLog_ID <span class="kw1">OUTPUT</span>;   
&nbsp;
&nbsp;
  <span class="kw1">BEGIN</span> TRY
&nbsp;
<span class="co1">--==&gt;&gt; Start Code Here!</span>
&nbsp;
&nbsp;
  <span class="kw1">END</span> TRY
&nbsp;
  <span class="kw1">BEGIN</span> CATCH
&nbsp;
    <span class="kw1">SELECT</span> @v_Error                  <span class="sy0">=</span> 100000
          ,@v_MSG                    <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">NVARCHAR</span><span class="br0">&#40;</span><span class="nu0">2500</span><span class="br0">&#41;</span>, 
                                       <span class="st0">'Error: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_NUMBER<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span> 
                                       <span class="st0">' Severity: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_SEVERITY<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' State: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_STATE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' Line: '</span> <span class="sy0">+</span>  <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_L<span class="sy0">IN</span>E<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' Procedure: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_PROCEDURE<span class="br0">&#40;</span><span class="br0">&#41;</span>, @v_Obj<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' MSG: Error from [DBCATCH].[dbo].[TU_Errorlog] with error:'</span> <span class="sy0">+</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_MESSAGE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;  
&nbsp;
    <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ErrorLog_ADD<span class="br0">]</span>
      @p_Error_ID                    <span class="sy0">=</span> @v_Error,
      @p_System                      <span class="sy0">=</span> @v_System,
      @p_DB                          <span class="sy0">=</span> @v_DB,
      @p_Obj                         <span class="sy0">=</span> @v_Obj,
      @p_App                         <span class="sy0">=</span> @v_App,
      @p_User                        <span class="sy0">=</span> @v_User,
      @p_ErrorMsg                    <span class="sy0">=</span> @v_MSG;
&nbsp;
    <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ActivityLog_UPD<span class="br0">]</span>
      @p_ActivityLog_ID              <span class="sy0">=</span> @v_ActivityLog_ID,
      @p_EndTime                     <span class="sy0">=</span> @v_Now,
      @p_Error_ID                    <span class="sy0">=</span> @v_Error,
      @p_Active                      <span class="sy0">=</span> 0,
      @p_Description                 <span class="sy0">=</span> @v_MSG,
      @p_DateModified                <span class="sy0">=</span> @v_Now; 
&nbsp;
	<span class="kw1">SELECT</span> @v_Msg; 
    <span class="kw1">RETURN</span> @v_Error;
&nbsp;
  <span class="kw1">END</span> CATCH;
&nbsp;
EOF: 
&nbsp;
<span class="coMULTI">/* Cleanup */</span>
&nbsp;
<span class="coMULTI">/* Update the activity Log */</span>
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ActivityLog_UPD<span class="br0">]</span>
  @p_ActivityLog_ID                  <span class="sy0">=</span> @v_ActivityLog_ID,
  @p_EndTime                         <span class="sy0">=</span> @v_Now,
  @p_Active                          <span class="sy0">=</span> 0,
  @p_DateModified                    <span class="sy0">=</span> @v_Now;
&nbsp;
GO   
&nbsp;
<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span><span class="st0">'[dbo].[&lt;Name, SYSNAME, PU_DB_ADD&gt;]'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NOT</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&gt;&gt;&gt; CREATED PROCEDURE [dbo].[&lt;Name, SYSNAME, PU_DB_ADD&gt;] &lt;&lt;&lt;'</span>;
<span class="kw1">END</span>;
<span class="kw1">ELSE</span> 
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&gt;&gt;&gt; FAILED TO CREATE PROCEDURE [dbo].[&lt;Name, SYSNAME, PU_DB_ADD&gt;] &lt;&lt;&lt;'</span>;
<span class="kw1">END</span>;</pre></div></div>
<p>Let’s examine the changes in detail. First, we added the Insert procedure call right after checking our debug values and right before we start developing in our Begin TRY statement.</p>
<div id="wpshdo_46" class="wp-synhighlighter-outer"><div id="wpshdt_46" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_46"></a><a id="wpshat_46" class="wp-synhighlighter-title" href="#codesyntax_46"  onClick="javascript:wpsh_toggleBlock(46)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_46" onClick="javascript:wpsh_code(46)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_46" onClick="javascript:wpsh_print(46)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_46" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ActivityLog_ADD<span class="br0">]</span>
  @p_Error_ID                        <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_System                          <span class="sy0">=</span> @v_System,
  @p_DB                              <span class="sy0">=</span> @v_DB,
  @p_Obj                             <span class="sy0">=</span> @v_Obj,
  @p_App                             <span class="sy0">=</span> @v_App,
  @p_User                            <span class="sy0">=</span> @v_User,
  @p_Spid                            <span class="sy0">=</span> @v_Spid,
  @p_Description                     <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_StartTime                       <span class="sy0">=</span> @v_Now,
  @p_EndTime                         <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_ActivityLog_ID                  <span class="sy0">=</span> @v_ActivityLog_ID <span class="kw1">OUTPUT</span>;</pre></div></div>
<p>This starts the activity log with the values we defined and used for our error engine. We created an output param for the new identity and stuffed it into @v_ActivityLog_ID so that when we are at the end of the routine, we can update the row uniquely which is what the update proc expects as one of its input params.</p>
<h3>Call to Update Procedure</h3>
<p>The next change is placing a call to the update procedure right after the error log insert in the TRY CATCH segment as shown below:<a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-3.png"><img loading="lazy" decoding="async" class="alignright wp-image-4218 size-large" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-3-1024x532.png" alt="if you're seeing this, you're building a t-sql activity log!" width="669" height="348" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-3-1024x532.png 1024w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-3-300x156.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-3-768x399.png 768w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-3.png 1067w" sizes="(max-width: 669px) 100vw, 669px" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>The main thing to notice here is that we already have all the information about an error. If an error does happen, and we are already at a point to insert in the error log, and we have to update the activity log anyway, why not insert the error with the activity log?</p>
<p>If we look at the activity log and the error is null, that’s great! Otherwise, we know exactly where to go without going anywhere else, and we know the date and time of the process. If there is an error, we exit the routine directly from the TRY CATCH.</p>
<p>Then, if the process completes successfully, we need to update the activity log with end dates and leave the error id NULL. This is done directly under the cleanup comment as this cleans up our processes getting ready to exit cleanly.<a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-4.png"><img loading="lazy" decoding="async" class="alignright size-full wp-image-4219" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-4.png" alt="" width="459" height="256" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-4.png 459w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-4-300x167.png 300w" sizes="(max-width: 459px) 100vw, 459px" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>And that is it for the development!</p>
<h3><strong>Building the T-SQL Activity Log Demo</strong></h3>
<p>All we need to do now is create a new demo from our updated template. We cannot use our old demo because it does not have the activity log feature set we just plugged into our template framework. Let’s save our template, copy it to a new query window, press CTRL + Shift + M to name the procedure and lets name it the same…PU_Demo1.</p>
<p>Our framework has the plumbing to look if it already exists and recreate itself, so let’s not add more demos. We’ll keep the demo procs somewhat manageable. At the <strong>==&gt;&gt; Start Code Here!</strong> point, let’s place the code:</p>
<div id="wpshdo_47" class="wp-synhighlighter-outer"><div id="wpshdt_47" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_47"></a><a id="wpshat_47" class="wp-synhighlighter-title" href="#codesyntax_47"  onClick="javascript:wpsh_toggleBlock(47)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_47" onClick="javascript:wpsh_code(47)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_47" onClick="javascript:wpsh_print(47)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_47" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">SELECT</span> <span class="st0">'This is Demo1'</span>;</pre></div></div>
<p>We will leave the error number as 10000 but will change the message:</p>
<div id="wpshdo_48" class="wp-synhighlighter-outer"><div id="wpshdt_48" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_48"></a><a id="wpshat_48" class="wp-synhighlighter-title" href="#codesyntax_48"  onClick="javascript:wpsh_toggleBlock(48)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_48" onClick="javascript:wpsh_code(48)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_48" onClick="javascript:wpsh_print(48)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_48" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;">Error <span class="kw1">FROM</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_Errorlog<span class="br0">]</span> <span class="kw1">WITH</span> error:</pre></div></div>
<p>To:</p>
<div id="wpshdo_49" class="wp-synhighlighter-outer"><div id="wpshdt_49" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_49"></a><a id="wpshat_49" class="wp-synhighlighter-title" href="#codesyntax_49"  onClick="javascript:wpsh_toggleBlock(49)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_49" onClick="javascript:wpsh_code(49)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_49" onClick="javascript:wpsh_print(49)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_49" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;">Error <span class="kw1">FROM</span> <span class="br0">[</span>PU_Demo1<span class="br0">]</span> <span class="kw1">WITH</span> error:</pre></div></div>
<p>And that’s it! Let’s compile and execute the procedure PU_Demo1 and see what we have:</p>
<p><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-5.png"><img loading="lazy" decoding="async" class="alignright wp-image-4220 size-large" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-5-1024x205.png" alt="Congrats, you have a t-sql activity log" width="669" height="134" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-5-1024x205.png 1024w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-5-300x60.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-5-768x154.png 768w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-5.png 1173w" sizes="(max-width: 669px) 100vw, 669px" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>We still have one record in the error log; that did not change. But, now we have a single record in our activity log that shows the start and end times, the who, what, when, and where from. The Error ID is null, so it appears that the process ran successfully. It looks like we have a functional feature added, but we will not know for sure until we test the error update. To do this we will change the code of PU_Demo1 from:</p>
<div id="wpshdo_50" class="wp-synhighlighter-outer"><div id="wpshdt_50" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_50"></a><a id="wpshat_50" class="wp-synhighlighter-title" href="#codesyntax_50"  onClick="javascript:wpsh_toggleBlock(50)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_50" onClick="javascript:wpsh_code(50)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_50" onClick="javascript:wpsh_print(50)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_50" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">SELECT</span> <span class="st0">'This is Demo1'</span>;</pre></div></div>
<p>To:</p>
<div id="wpshdo_51" class="wp-synhighlighter-outer"><div id="wpshdt_51" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_51"></a><a id="wpshat_51" class="wp-synhighlighter-title" href="#codesyntax_51"  onClick="javascript:wpsh_toggleBlock(51)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_51" onClick="javascript:wpsh_code(51)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_51" onClick="javascript:wpsh_print(51)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_51" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">SELECT</span> <span class="st0">'This is Demo1'</span>
    <span class="kw1">RAISERROR</span> <span class="br0">&#40;</span><span class="st0">'Message'</span>, 19, 1<span class="br0">&#41;</span> <span class="kw1">WITH</span> <span class="kw2">LOG</span></pre></div></div>
<p>Recompile the PU_Demo1 code and then run the procedure so we can analyze the results:</p>
<p><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-6.png"><img loading="lazy" decoding="async" class="alignright wp-image-4221 size-large" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-6-1024x204.png" alt="you've successfully built a t-sql activity log!" width="669" height="133" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-6-1024x204.png 1024w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-6-300x60.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-6-768x153.png 768w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/3-6.png 1303w" sizes="(max-width: 669px) 100vw, 669px" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3>Final Word, and Looking Ahead</h3>
<p>We built the T-SQL Activity Log. We have two records in the Error log, and we have two records in the Activity Log. The other thing to notice: not only is the Error_ID populated with the correct error code we used to error out in the TRY CATCH, we also have a description which is the error message that we would also find in the error log.</p>
<p>At this stage we have successfully completed adding the activity logging feature to our framework. Our product is already able to help us develop and troubleshoot closer to an enterprise level, while at the same time reducing the time we have to develop tedious tasks. Well done. Come back as we finish our feature set in T-SQL Framework part 4, where we will add Batching as a feature set to our framework.</p>
<p><span style="text-decoration: underline;"><a href="https://sqlsolutionsgroup.com/t-sql-batching/">GO TO PART FOUR</a></span></p>
<p>The post <a href="https://sqlsolutionsgroup.com/the-tsql-activity-log/">The T-SQL Activity Log: Framework, pt. 3</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlsolutionsgroup.com/the-tsql-activity-log/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>The SQL Error Engine: Framework, pt. 2</title>
		<link>https://sqlsolutionsgroup.com/sql-error-engine/</link>
					<comments>https://sqlsolutionsgroup.com/sql-error-engine/#respond</comments>
		
		<dc:creator><![CDATA[Jared Kirkpatrick]]></dc:creator>
		<pubDate>Mon, 05 Aug 2019 11:32:06 +0000</pubDate>
				<category><![CDATA[SQL Group]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[#microsftcertifedmaster]]></category>
		<category><![CDATA[#microsftpartner]]></category>
		<category><![CDATA[#SQLAB]]></category>
		<category><![CDATA[#SQlatino]]></category>
		<category><![CDATA[#SQlatinoamerica]]></category>
		<category><![CDATA[#sqldatabase]]></category>
		<category><![CDATA[#sqldeveloper]]></category>
		<category><![CDATA[#SQLgroupie]]></category>
		<category><![CDATA[#sqlimer]]></category>
		<category><![CDATA[#sqlimerbymay]]></category>
		<category><![CDATA[#sqlinjection]]></category>
		<category><![CDATA[#sqlinternals]]></category>
		<category><![CDATA[#sqlite]]></category>
		<category><![CDATA[#sqlite3]]></category>
		<category><![CDATA[#SQLLearning]]></category>
		<category><![CDATA[#SQLMagazine]]></category>
		<category><![CDATA[#sqlmanagementstudio]]></category>
		<category><![CDATA[#sqlmanager]]></category>
		<category><![CDATA[#Sqlmap]]></category>
		<category><![CDATA[#sqlrun]]></category>
		<category><![CDATA[#sqlsaturday2017]]></category>
		<category><![CDATA[#sqlsatvienna]]></category>
		<category><![CDATA[#sqlserver]]></category>
		<category><![CDATA[#SQLserver2012]]></category>
		<category><![CDATA[#sqlserver2014]]></category>
		<category><![CDATA[#sqlserver2017]]></category>
		<category><![CDATA[#sqlserver2022]]></category>
		<category><![CDATA[#SQLServeronLinux]]></category>
		<category><![CDATA[#SQLsolutionsgroup]]></category>
		<category><![CDATA[#SQLTraining]]></category>
		<category><![CDATA[#SQLYog]]></category>
		<category><![CDATA[error engine]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQLPASS]]></category>
		<category><![CDATA[SQLSaturday]]></category>
		<category><![CDATA[SSG]]></category>
		<category><![CDATA[T-SQL]]></category>
		<guid isPermaLink="false">http://sqlsolutionsgroup.com/?p=4165</guid>

					<description><![CDATA[<p>The post <a href="https://sqlsolutionsgroup.com/sql-error-engine/">The SQL Error Engine: Framework, pt. 2</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2><strong>Building the SQL Error Engine</strong></h2>
<p>In this second post focused on a T-SQL framework (<span style="text-decoration: underline;"><a href="https://sqlsolutionsgroup.com/sql-framework-part-1/">find part one here</a></span>), we will build the plumbing to leverage our first feature of the framework, the error engine. This feature  will runs like an engine and do the manual work we do not want to do. To make it dynamic, the feature must be data-driven using small tools that work with each other. </p>
<p>We will address architecture, database design, functions, and other coding principles, following some best practices. We are not going to describe each one in detail because that is out of scope for this project. That would make this post even longer. If you find that we have glanced over any topic that you feel should be discussed in more detail, please leave some feedback. If there is enough interest, we may publish a blog solely on that topic.</p>
<p>With this blog post, we will:</p>
<ol>
<li>Create a new database to hold our framework</li>
<li>Create code tables, an error definition table, and an error logging table</li>
<li>Populate our base data-driven tables (the code tables and the error definition table)</li>
<li>Create a user-defined function to get our codes for us</li>
<li>Add a new error message within the SQL engine</li>
<li>Create a new template that will leverage the coding effort above</li>
</ol>
<p>A lot of work is ahead of us, and there won’t necessarily be a lot of explanation.  For instance, we will create a database that will hold all stored procedures that will be leveraged to execute against your user databases. Why not just develop this in the user database for ease? Several reasons:</p>
<ol>
<li>We want to develop this once and only once. We come from an environment where one SQL developer may be tasked with writing for six .net developers and we don&#8217;t want to introduce confusion, so just one connection string. The developers make the connection to the code database, and the stored procs that are executed in that code database will be executed against the user data that returns result sets accordingly. In short, all roads lead to Rome.</li>
<li>If all our security is set for an empty database with just a bunch of code, if someone were to gain access uninvited, what do they have? And they have even less if that code is encrypted.</li>
<li>It forces the DBA to use a <a href="https://www.red-gate.com/simple-talk/blogs/discovering-three-or-four-part-names-in-sql-server-database-code/">three-part naming scheme</a> of database name, schema name, and object name. While this may look like it takes more time referencing each object in the database, we have noticed the precision results in a dramatic decrease in troubleshooting time. You get used to the extra typing (especially since intelligence is your friend), and when you are developing enterprise solutions you don’t want to be called out for being bush league when a few more seconds make you into an enterprise surgical developer (right?).</li>
</ol>
<p>You can choose any name you wish to call the database. At SQL Solutions Group, we develop several internal products against the database we are calling DBCatch, so we will be using that. You can also use the name DBCatch and we encourage that. Just as long as you do not sell anything under that name without discussing that with us and the copyright thereof. </p>
<h3><strong>Create Database and Tables</strong></h3>
<p>We are not going to get too fancy with the database options; keeping it simple with this code:</p>
<div id="wpshdo_52" class="wp-synhighlighter-outer"><div id="wpshdt_52" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_52"></a><a id="wpshat_52" class="wp-synhighlighter-title" href="#codesyntax_52"  onClick="javascript:wpsh_toggleBlock(52)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_52" onClick="javascript:wpsh_code(52)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_52" onClick="javascript:wpsh_print(52)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_52" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">CREATE</span> <span class="kw1">DATABASE</span> DBCatch;
GO</pre></div></div>
<p>&nbsp;</p>
<p>Great, the first task is complete. Next, we need to create a few tables. The first set of tables will be the code tables. I do not like creating different code tables for every function that comes up, so I create two tables that act as a kind of named value pair. That way, these two tables take care of almost all my code definition needs. The first table is the Code Group (this is the header), and the second is the Code (this is the detail).  Let’s just jump in and you will see what I am talking about once we populate the tables and you can see them in action.</p>
<div id="wpshdo_53" class="wp-synhighlighter-outer"><div id="wpshdt_53" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_53"></a><a id="wpshat_53" class="wp-synhighlighter-title" href="#codesyntax_53"  onClick="javascript:wpsh_toggleBlock(53)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_53" onClick="javascript:wpsh_code(53)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_53" onClick="javascript:wpsh_print(53)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_53" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> DBCatch;
GO
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_CodeGroup<span class="br0">]</span>
<span class="br0">&#40;</span>
  <span class="br0">[</span>CodeGroup_ID<span class="br0">]</span>    <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>  <span class="kw1">IDENTITY</span> <span class="br0">&#40;</span>1, 1<span class="br0">&#41;</span>   <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>PK_CodeGroup_ID<span class="br0">]</span>   
    <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="kw1">CLUSTERED</span>
 ,<span class="br0">[</span>Name<span class="br0">]</span>            <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>          <span class="sy0">NOT</span> <span class="sy0">NULL</span>
 ,<span class="br0">[</span><span class="kw1">DESC</span><span class="br0">]</span>            <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>255<span class="br0">&#41;</span>          <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> DF_TU_CodeGroup_Desc
    <span class="kw1">DEFAULT</span> <span class="br0">&#40;</span><span class="st0">'Group Code'</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>Active<span class="br0">]</span>          <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>                    <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> DF_TU_CodeGroup_Active
    <span class="kw1">DEFAULT</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>1<span class="br0">&#41;</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>DateCreated<span class="br0">]</span>     <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>               <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> DF_TU_CodeGroup_DateCreated
    <span class="kw1">DEFAULT</span> <span class="br0">&#40;</span><span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>DateModified<span class="br0">]</span>    <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>               <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> DF_TU_CodeGroup_DateModified
    <span class="kw1">DEFAULT</span> <span class="br0">&#40;</span><span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span> <span class="kw1">ON</span> <span class="br0">[</span><span class="kw1">PRIMARY</span><span class="br0">]</span>;
GO
&nbsp;
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_Code<span class="br0">]</span>
<span class="br0">&#40;</span>
  <span class="br0">[</span>Code_ID<span class="br0">]</span>         <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>  <span class="kw1">IDENTITY</span> <span class="br0">&#40;</span>1, 1<span class="br0">&#41;</span>   <span class="sy0">NOT</span> <span class="sy0">NULL</span> 
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>PK_Code_ID<span class="br0">]</span>   
    <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="kw1">CLUSTERED</span>
 ,<span class="br0">[</span>CodeGroup_ID<span class="br0">]</span>    <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                    <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>FK_TU_Code_CodeGroup_ID<span class="br0">]</span>
       <span class="kw1">FOREIGN</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span><span class="br0">[</span>CodeGroup_ID<span class="br0">]</span><span class="br0">&#41;</span> 
    <span class="kw1">REFERENCES</span> <span class="br0">[</span>TU_CodeGroup<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>CodeGroup_ID<span class="br0">]</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>Name<span class="br0">]</span>            <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>          <span class="sy0">NOT</span> <span class="sy0">NULL</span>
 ,<span class="br0">[</span><span class="kw1">DESC</span><span class="br0">]</span>            <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>255<span class="br0">&#41;</span>          <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_Code_Desc<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="st0">'Code'</span>
 ,<span class="br0">[</span>Active<span class="br0">]</span>          <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>                    <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_Code_Active<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> 1
 ,<span class="br0">[</span>DateCreated<span class="br0">]</span>     <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>               <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_Code_DateCreated<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>DateModified<span class="br0">]</span>    <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>               <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_Code_DateModified<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span> <span class="kw1">ON</span> <span class="br0">[</span><span class="kw1">PRIMARY</span><span class="br0">]</span>;
GO</pre></div></div>
<p>&nbsp;</p>
<h3><strong>Naming Scheme and Populating Tables</strong></h3>
<p>At SSG, we adhere to a specific naming scheme. I recommend anyone that develops code should adopt a naming scheme that works, for you and your company. The prefix TU_ above in front of the table names stands for user table. SSG does a lot of data dictionary work and when we describe our objects, we like them to be grouped nicely. This way we can describe each set of objects (like tables, views, procedures, etc.) in sets visually. Now that our code tables are in the DBCatch database, populate them with the data we need:</p>
<div id="wpshdo_54" class="wp-synhighlighter-outer"><div id="wpshdt_54" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_54"></a><a id="wpshat_54" class="wp-synhighlighter-title" href="#codesyntax_54"  onClick="javascript:wpsh_toggleBlock(54)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_54" onClick="javascript:wpsh_code(54)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_54" onClick="javascript:wpsh_print(54)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_54" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> DBCatch;
GO
&nbsp;
  <span class="kw1">SET</span> <span class="kw1">IDENTITY_INSERT</span> TU_CodeGroup <span class="kw1">ON</span>;
&nbsp;
&nbsp;
<span class="kw1">INSERT</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_CodeGroup<span class="br0">]</span>
<span class="br0">&#40;</span>      CodeGroup_ID, Name,                    <span class="br0">[</span><span class="kw1">DESC</span><span class="br0">]</span><span class="br0">&#41;</span>
<span class="kw1">SELECT</span> <span class="nu0">1</span>,            <span class="st0">'ERROR'</span>,                 <span class="st0">'ERROR CODES'</span>;
&nbsp;
&nbsp;
  <span class="kw1">SET</span> <span class="kw1">IDENTITY_INSERT</span> TU_CodeGroup <span class="kw1">OFF</span>;
&nbsp;
&nbsp;
  <span class="kw1">SET</span> <span class="kw1">IDENTITY_INSERT</span> TU_Code <span class="kw1">ON</span>;
&nbsp;
<span class="kw1">INSERT</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_Code<span class="br0">]</span>
<span class="br0">&#40;</span>      Code_ID, CodeGroup_ID, Name,                    <span class="br0">[</span><span class="kw1">DESC</span><span class="br0">]</span><span class="br0">&#41;</span>
<span class="kw1">SELECT</span> <span class="nu0">100</span>,     <span class="nu0">1</span>,            <span class="st0">'DEFAULT'</span>,               <span class="st0">'UNKNOWN ERROR'</span>
<span class="kw1">UNION</span>
<span class="kw1">SELECT</span> <span class="nu0">101</span>,     <span class="nu0">1</span>,            <span class="st0">'SQL'</span>,                   <span class="st0">'INTERNAL SQL SERVER RELATED ERROR'</span>
<span class="kw1">UNION</span>
<span class="kw1">SELECT</span> <span class="nu0">102</span>,     <span class="nu0">1</span>,            <span class="st0">'DBCATCH'</span>,               <span class="st0">'DBCATCH RELATED ERROR'</span>
<span class="kw1">UNION</span> 
<span class="kw1">SELECT</span> <span class="nu0">103</span>,     <span class="nu0">1</span>,            <span class="st0">'ESCLATION'</span>,             <span class="st0">'ERROR THAT HAS BEEN ESCALATED TO A PARENT ERROR'</span>
<span class="kw1">UNION</span>   
<span class="kw1">SELECT</span> <span class="nu0">104</span>,     <span class="nu0">1</span>,            <span class="st0">'MAINTENANCE'</span>,           <span class="st0">'DATABASE MAINTENANCE RELATED ERROR'</span>;
&nbsp;
&nbsp;
  <span class="kw1">SET</span> <span class="kw1">IDENTITY_INSERT</span> TU_Code <span class="kw1">OFF</span>;</pre></div></div>
<p>&nbsp;</p>
<p>You can see the base data we just populated, with the two select statements below. This will make more sense once we create the user-defined function and actually start using it in the template.</p>
<div id="wpshdo_55" class="wp-synhighlighter-outer"><div id="wpshdt_55" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_55"></a><a id="wpshat_55" class="wp-synhighlighter-title" href="#codesyntax_55"  onClick="javascript:wpsh_toggleBlock(55)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_55" onClick="javascript:wpsh_code(55)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_55" onClick="javascript:wpsh_print(55)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_55" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> DBCatch;
GO
&nbsp;
<span class="kw1">SELECT</span> <span class="br0">[</span>CodeGroup_ID<span class="br0">]</span>
      ,<span class="br0">[</span>Name<span class="br0">]</span>
	  ,<span class="br0">[</span><span class="kw1">DESC</span><span class="br0">]</span>
	  ,<span class="br0">[</span>Active<span class="br0">]</span>
	  ,<span class="br0">[</span>DateCreated<span class="br0">]</span>
	  ,<span class="br0">[</span>DateModified<span class="br0">]</span>
  <span class="kw1">FROM</span> <span class="br0">[</span>DBCatch<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_CodeGroup<span class="br0">]</span>;
&nbsp;
<span class="kw1">SELECT</span> <span class="br0">[</span>Code_ID<span class="br0">]</span>
      ,<span class="br0">[</span>CodeGroup_ID<span class="br0">]</span>
      ,<span class="br0">[</span>Name<span class="br0">]</span>
	  ,<span class="br0">[</span><span class="kw1">DESC</span><span class="br0">]</span>
	  ,<span class="br0">[</span>Active<span class="br0">]</span>
	  ,<span class="br0">[</span>DateCreated<span class="br0">]</span>
	  ,<span class="br0">[</span>DateModified<span class="br0">]</span>
  <span class="kw1">FROM</span> <span class="br0">[</span>DBCatch<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_Code<span class="br0">]</span>;</pre></div></div>
<p>&nbsp;</p>
<h3><strong>Trapping Errors with the SQL Error Engine</strong></h3>
<p>Now, let’s dive into the user-defined scalar function. This retrieves the code IDs for us when we use them programmatically within our solution. The idea here is that we will be trapping any errors that come up by a try catch method inside our T_SQL code. Once we capture the error, we categorize it and define it ourselves. This way, the error is not cryptic and we can define it in a way that will point us to the issue. This cuts down our troubleshooting time.</p>
<p>First, we&#8217;ll create the function. Next, we will continue making this solution more customized.</p>
<div id="wpshdo_56" class="wp-synhighlighter-outer"><div id="wpshdt_56" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_56"></a><a id="wpshat_56" class="wp-synhighlighter-title" href="#codesyntax_56"  onClick="javascript:wpsh_toggleBlock(56)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_56" onClick="javascript:wpsh_code(56)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_56" onClick="javascript:wpsh_print(56)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_56" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> DBCATCH;
GO
&nbsp;
<span class="kw1">SET</span> <span class="kw1">NOCOUNT</span> <span class="kw1">ON</span>;
&nbsp;
<span class="kw1">IF</span> <span class="sy0">EXISTS</span><span class="br0">&#40;</span><span class="kw1">SELECT</span> 1
            <span class="kw1">FROM</span> <span class="br0">[</span><span class="sy0">IN</span>F<span class="sy0">OR</span>MATION_SCHEMA<span class="br0">]</span>.<span class="br0">[</span>ROUT<span class="sy0">IN</span>ES<span class="br0">]</span> <span class="br0">&#40;</span>NOLOCK<span class="br0">&#41;</span>
           <span class="kw1">WHERE</span> <span class="br0">[</span>SPECIFIC_SCHEMA<span class="br0">]</span>   <span class="sy0">=</span> <span class="st0">'dbo'</span>
             <span class="sy0">AND</span> <span class="br0">[</span>SPECIFIC_NAME<span class="br0">]</span>     <span class="sy0">=</span> <span class="st0">'FSU_Code_GET'</span><span class="br0">&#41;</span>
<span class="kw1">BEGIN</span>
  <span class="kw1">DROP</span> <span class="kw1">FUNCTION</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>FSU_Code_GET<span class="br0">]</span>;
&nbsp;
  <span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; DROPPED FUNCTION [dbo].[FSU_Code_GET] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span>;
GO
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">FUNCTION</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>FSU_Code_GET<span class="br0">]</span> 
<span class="br0">&#40;</span>	
  @p_CodeGroup                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
 ,@p_Code                            <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
<span class="br0">&#41;</span>
<span class="kw1">RETURNS</span> <span class="kw1">INT</span>
<span class="kw1">WITH</span> ENCRYPTION
<span class="kw1">AS</span>
<span class="kw1">BEGIN</span>
&nbsp;
<span class="coMULTI">/************************************************************************/</span>
<span class="coMULTI">/* Name	  : FSU_Code_GET                                          */</span>
<span class="coMULTI">/* Version      : 1.0                                                   */</span>
<span class="coMULTI">/* Author       : Jared Kirkpatrick                                     */</span>
<span class="coMULTI">/* Date	  : 2019-07-24                                            */</span>
<span class="coMULTI">/* Description  : Get the value from the code table.                    */</span>
<span class="coMULTI">/************************************************************************/</span>
<span class="coMULTI">/* Date         : Version: Who: Description                             */</span>
<span class="coMULTI">/************************************************************************/</span>
<span class="coMULTI">/* 2019-05-24   : 1.0    : JSK: Initial Release.                        */</span>
<span class="coMULTI">/************************************************************************/</span>
&nbsp;
  <span class="kw1">DECLARE</span> @v_Return                  <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>;
&nbsp;
  <span class="kw1">SELECT</span> @v_Return                   <span class="sy0">=</span> b.<span class="br0">[</span>Code_ID<span class="br0">]</span>
    <span class="kw1">FROM</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_CodeGroup<span class="br0">]</span> a 
    <span class="sy0">JOIN</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_Code<span class="br0">]</span>      b 
      <span class="kw1">ON</span> a.<span class="br0">[</span>CodeGroup_ID<span class="br0">]</span>            <span class="sy0">=</span> b.<span class="br0">[</span>CodeGroup_ID<span class="br0">]</span>
   <span class="kw1">WHERE</span> a.<span class="br0">[</span>Name<span class="br0">]</span>                    <span class="sy0">=</span> @p_CodeGroup
     <span class="sy0">AND</span> b.<span class="br0">[</span>Name<span class="br0">]</span>                    <span class="sy0">=</span> @p_Code;
&nbsp;
  <span class="kw1">RETURN</span> @v_Return;
&nbsp;
<span class="kw1">END</span>;
GO
&nbsp;
<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span><span class="st0">'[dbo].[FSU_Code_GET]'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NOT</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; CREATED FUNCTION [dbo].[FSU_Code_GET] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span>;
<span class="kw1">ELSE</span> 
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; FAILED TO CREATE FUNCTION [dbo].[FSU_Code_GET] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span>;
GO</pre></div></div>
<p>&nbsp;</p>
<p>To see what we have done here, let’s look at the two tables we first populated, TU_CodeGroup and TU_Code.</p>
<p><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-1.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-4166 size-full" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-1.png" alt="sql error engine tables" width="955" height="853" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-1.png 955w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-1-300x268.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-1-768x686.png 768w" sizes="(max-width: 955px) 100vw, 955px" /></a></p>
<p>The TU_CodeGroup table has one record, and the value (actually, the {Name} field), is “ERROR”. In the TU_Code table we will be mostly using the code_id that corelates to the “DBCatch” value since we are aiming at categorizing errors we trap from DBCatch. If we want the code for DBCatch errors, we use our function which takes the value of the code group (Error) and the value of the code (“DBCatch”) and we retrieve it by leveraging the function as shown below which will give us the value 102…</p>
<div id="wpshdo_57" class="wp-synhighlighter-outer"><div id="wpshdt_57" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_57"></a><a id="wpshat_57" class="wp-synhighlighter-title" href="#codesyntax_57"  onClick="javascript:wpsh_toggleBlock(57)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_57" onClick="javascript:wpsh_code(57)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_57" onClick="javascript:wpsh_print(57)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_57" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> DBCatch;
GO
&nbsp;
<span class="kw1">SELECT</span> dbo.<span class="br0">[</span>FSU_Code_GET<span class="br0">]</span><span class="br0">&#40;</span><span class="st0">'Error'</span>, <span class="st0">'DBCatch'</span><span class="br0">&#41;</span>;</pre></div></div>
<p>&nbsp;</p>
<p>Next, we create the table that will hold the error definition, and then we will populate those definitions.</p>
<div id="wpshdo_58" class="wp-synhighlighter-outer"><div id="wpshdt_58" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_58"></a><a id="wpshat_58" class="wp-synhighlighter-title" href="#codesyntax_58"  onClick="javascript:wpsh_toggleBlock(58)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_58" onClick="javascript:wpsh_code(58)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_58" onClick="javascript:wpsh_print(58)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_58" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> DBCatch;
GO
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_Error<span class="br0">]</span>
<span class="br0">&#40;</span>
  <span class="br0">[</span>Error_ID<span class="br0">]</span>     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>  <span class="kw1">IDENTITY</span> <span class="br0">&#40;</span>1, 1<span class="br0">&#41;</span>   <span class="sy0">NOT</span> <span class="sy0">NULL</span> 
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>PK_Error_ID<span class="br0">]</span>   
    <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="kw1">CLUSTERED</span>
 ,<span class="br0">[</span>Type_ID<span class="br0">]</span>      <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                    <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>FK_TU_Error_Code_ID<span class="br0">]</span>
       <span class="kw1">FOREIGN</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span><span class="br0">[</span>Type_ID<span class="br0">]</span><span class="br0">&#41;</span> 
    <span class="kw1">REFERENCES</span> <span class="br0">[</span>TU_Code<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>Code_ID<span class="br0">]</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>Name<span class="br0">]</span>         <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>          <span class="sy0">NOT</span> <span class="sy0">NULL</span>
 ,<span class="br0">[</span>Severity<span class="br0">]</span>     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                    <span class="sy0">NULL</span>
 ,<span class="br0">[</span><span class="kw1">STATE</span><span class="br0">]</span>        <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                    <span class="sy0">NULL</span>
 ,<span class="br0">[</span><span class="kw1">DESC</span><span class="br0">]</span>         <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>255<span class="br0">&#41;</span>          <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_Error_Desc<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="st0">'Error'</span>
 ,<span class="br0">[</span>Active<span class="br0">]</span>       <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>                    <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_Error_Active<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> 1
 ,<span class="br0">[</span>DateCreated<span class="br0">]</span>  <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>               <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_Error_DateCreated<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>DateModified<span class="br0">]</span> <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>               <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_Error_DateModified<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span> <span class="kw1">ON</span> <span class="br0">[</span><span class="kw1">PRIMARY</span><span class="br0">]</span>;
&nbsp;
<span class="kw1">USE</span> DBCatch;
GO
&nbsp;
  <span class="kw1">SET</span> <span class="kw1">IDENTITY_INSERT</span> TU_Error <span class="kw1">ON</span>;
&nbsp;
<span class="kw1">INSERT</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_Error<span class="br0">]</span>
<span class="br0">&#40;</span>      Error_ID, <span class="br0">[</span>Type_ID<span class="br0">]</span>, <span class="br0">[</span>Name<span class="br0">]</span>,          <span class="br0">[</span>Severity<span class="br0">]</span>, <span class="br0">[</span><span class="kw1">STATE</span><span class="br0">]</span>, <span class="br0">[</span><span class="kw1">DESC</span><span class="br0">]</span><span class="br0">&#41;</span>
<span class="kw1">SELECT</span> <span class="nu0">100000</span>,   <span class="nu0">100</span>,       <span class="st0">'DEFAULT_DBCATCH'</span>,   <span class="st0">'16'</span>,      <span class="st0">'1'</span>,     <span class="st0">'UNKNOWN ERROR IN DBCATCH'</span>
<span class="kw1">UNION</span>  
<span class="kw1">SELECT</span> <span class="nu0">100001</span>,   <span class="nu0">102</span>,       <span class="st0">'DBCATCH_INSERT'</span>,    <span class="st0">'16'</span>,      <span class="st0">'1'</span>,     <span class="st0">'ERROR INSERTING INTO A DBCATCH TABLE'</span>
<span class="kw1">UNION</span>  
<span class="kw1">SELECT</span> <span class="nu0">100002</span>,   <span class="nu0">102</span>,       <span class="st0">'DBCATCH_UPDATE'</span>,    <span class="st0">'16'</span>,      <span class="st0">'1'</span>,     <span class="st0">'ERROR UPDATING A DBCATCH TABLE'</span>
<span class="kw1">UNION</span>  
<span class="kw1">SELECT</span> <span class="nu0">100003</span>,   <span class="nu0">102</span>,       <span class="st0">'DBCATCH_DELETE'</span>,    <span class="st0">'16'</span>,      <span class="st0">'1'</span>,     <span class="st0">'ERROR DELETING FROM A DBCATCH TABLE'</span>
<span class="kw1">UNION</span>  
<span class="kw1">SELECT</span> <span class="nu0">100004</span>,   <span class="nu0">102</span>,       <span class="st0">'DBCATCH_SELECT'</span>,    <span class="st0">'16'</span>,      <span class="st0">'1'</span>,     <span class="st0">'ERROR DBCATCH DATA COLLECTOR (SELECTING INFO)'</span>;
&nbsp;
&nbsp;
&nbsp;
  <span class="kw1">SET</span> <span class="kw1">IDENTITY_INSERT</span> TU_Error <span class="kw1">OFF</span>;
GO</pre></div></div>
<p>&nbsp;</p>
<p>The final step for the definition is to add an error message in the SQL engine, but we are going to put a twist on this so it is not exactly straightforward. We set the message to be defined at runtime so that we can customize the error message and manipulate. This helps us understand what is happening.</p>
<p>When we get to the template that shows how this works, it will be clear. It is hard to describe what you cannot see, but we will have a demo at the end so that you can see it in action. Then the light bulbs will go off in that “a-ha!” moment.</p>
<h3>Let’s make some error messages!</h3>
<div id="wpshdo_59" class="wp-synhighlighter-outer"><div id="wpshdt_59" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_59"></a><a id="wpshat_59" class="wp-synhighlighter-title" href="#codesyntax_59"  onClick="javascript:wpsh_toggleBlock(59)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_59" onClick="javascript:wpsh_code(59)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_59" onClick="javascript:wpsh_print(59)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_59" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> DBCatch;
GO
&nbsp;
<span class="kw1">IF</span> <span class="sy0">EXISTS</span><span class="br0">&#40;</span><span class="kw1">SELECT</span> 1
            <span class="kw1">FROM</span> <span class="br0">[</span>master<span class="br0">]</span>.<span class="br0">[</span>sys<span class="br0">]</span>.<span class="br0">[</span>messages<span class="br0">]</span> 
           <span class="kw1">WHERE</span> <span class="br0">[</span>message_id<span class="br0">]</span> <span class="sy0">=</span> 100000<span class="br0">&#41;</span>
<span class="kw1">BEGIN</span>
  <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span><span class="kw3">SP_DROPMESSAGE</span><span class="br0">]</span> @msgnum <span class="sy0">=</span> <span class="nu0">100000</span>;
<span class="kw1">END</span>;  
&nbsp;
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span><span class="kw3">SP_ADDMESSAGE</span><span class="br0">]</span> 
  @msgnum <span class="sy0">=</span> <span class="nu0">100000</span>,
  @severity <span class="sy0">=</span> <span class="nu0">16</span>,
  @msgtext <span class="sy0">=</span> N<span class="st0">'%s'</span>;
&nbsp;
<span class="kw1">IF</span> <span class="sy0">EXISTS</span><span class="br0">&#40;</span><span class="kw1">SELECT</span> 1
            <span class="kw1">FROM</span> <span class="br0">[</span>master<span class="br0">]</span>.<span class="br0">[</span>sys<span class="br0">]</span>.<span class="br0">[</span>messages<span class="br0">]</span> 
           <span class="kw1">WHERE</span> <span class="br0">[</span>message_id<span class="br0">]</span> <span class="sy0">=</span> 100001<span class="br0">&#41;</span>
<span class="kw1">BEGIN</span>
  <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span><span class="kw3">SP_DROPMESSAGE</span><span class="br0">]</span> @msgnum <span class="sy0">=</span> <span class="nu0">100001</span>;
<span class="kw1">END</span>;  
&nbsp;
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span><span class="kw3">SP_ADDMESSAGE</span><span class="br0">]</span> 
  @msgnum <span class="sy0">=</span> <span class="nu0">100001</span>,
  @severity <span class="sy0">=</span> <span class="nu0">16</span>,
  @msgtext <span class="sy0">=</span> N<span class="st0">'%s'</span>;
&nbsp;
<span class="kw1">IF</span> <span class="sy0">EXISTS</span><span class="br0">&#40;</span><span class="kw1">SELECT</span> 1
            <span class="kw1">FROM</span> <span class="br0">[</span>master<span class="br0">]</span>.<span class="br0">[</span>sys<span class="br0">]</span>.<span class="br0">[</span>messages<span class="br0">]</span> 
           <span class="kw1">WHERE</span> <span class="br0">[</span>message_id<span class="br0">]</span> <span class="sy0">=</span> 100002<span class="br0">&#41;</span>
<span class="kw1">BEGIN</span>
  <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span><span class="kw3">SP_DROPMESSAGE</span><span class="br0">]</span> @msgnum <span class="sy0">=</span> <span class="nu0">100002</span>;
<span class="kw1">END</span>;  
&nbsp;
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span><span class="kw3">SP_ADDMESSAGE</span><span class="br0">]</span> 
  @msgnum <span class="sy0">=</span> <span class="nu0">100002</span>,
  @severity <span class="sy0">=</span> <span class="nu0">16</span>,
  @msgtext <span class="sy0">=</span> N<span class="st0">'%s'</span>; 
&nbsp;
<span class="kw1">IF</span> <span class="sy0">EXISTS</span><span class="br0">&#40;</span><span class="kw1">SELECT</span> 1
            <span class="kw1">FROM</span> <span class="br0">[</span>master<span class="br0">]</span>.<span class="br0">[</span>sys<span class="br0">]</span>.<span class="br0">[</span>messages<span class="br0">]</span> 
           <span class="kw1">WHERE</span> <span class="br0">[</span>message_id<span class="br0">]</span> <span class="sy0">=</span> 100003<span class="br0">&#41;</span>
<span class="kw1">BEGIN</span>
  <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span><span class="kw3">SP_DROPMESSAGE</span><span class="br0">]</span> @msgnum <span class="sy0">=</span> <span class="nu0">100003</span>;
<span class="kw1">END</span>;  
&nbsp;
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span><span class="kw3">SP_ADDMESSAGE</span><span class="br0">]</span> 
  @msgnum <span class="sy0">=</span> <span class="nu0">100003</span>,
  @severity <span class="sy0">=</span> <span class="nu0">16</span>,
  @msgtext <span class="sy0">=</span> N<span class="st0">'%s'</span>; 
&nbsp;
<span class="kw1">IF</span> <span class="sy0">EXISTS</span><span class="br0">&#40;</span><span class="kw1">SELECT</span> 1
            <span class="kw1">FROM</span> <span class="br0">[</span>master<span class="br0">]</span>.<span class="br0">[</span>sys<span class="br0">]</span>.<span class="br0">[</span>messages<span class="br0">]</span> 
           <span class="kw1">WHERE</span> <span class="br0">[</span>message_id<span class="br0">]</span> <span class="sy0">=</span> 100004<span class="br0">&#41;</span>
<span class="kw1">BEGIN</span>
  <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span><span class="kw3">SP_DROPMESSAGE</span><span class="br0">]</span> @msgnum <span class="sy0">=</span> <span class="nu0">100004</span>;
<span class="kw1">END</span>;  
&nbsp;
<span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span><span class="kw3">SP_ADDMESSAGE</span><span class="br0">]</span> 
  @msgnum <span class="sy0">=</span> <span class="nu0">100004</span>,
  @severity <span class="sy0">=</span> <span class="nu0">16</span>,
  @msgtext <span class="sy0">=</span> N<span class="st0">'%s'</span>; 
&nbsp;
GO</pre></div></div>
<p>&nbsp;</p>
<h3><strong>One Last Thing….</strong></h3>
<p>Before we create our template for the SQL error engine, we create one more table. This holds our error information that will be logged. We also create a simple stored proc to insert into that table. Any time we have an error we will log that error into this table. If you have the stored proc in management studio, that is great to see the error printed for you. But, in most cases a process will be running when you are not looking. Having this log will be helpful because we can look at it after the fact and see what happened. The code for the error log table is:</p>
<div id="wpshdo_60" class="wp-synhighlighter-outer"><div id="wpshdt_60" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_60"></a><a id="wpshat_60" class="wp-synhighlighter-title" href="#codesyntax_60"  onClick="javascript:wpsh_toggleBlock(60)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_60" onClick="javascript:wpsh_code(60)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_60" onClick="javascript:wpsh_print(60)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_60" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> DBCatch;
GO
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_ErrorLog<span class="br0">]</span>
<span class="br0">&#40;</span>
  <span class="br0">[</span>ErrorLog_ID<span class="br0">]</span>     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>  <span class="kw1">IDENTITY</span> <span class="br0">&#40;</span>1, 1<span class="br0">&#41;</span>     <span class="sy0">NOT</span> <span class="sy0">NULL</span> 
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>PK_ErrorLog_ID<span class="br0">]</span>   
    <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="kw1">CLUSTERED</span>
 ,<span class="br0">[</span>Error_ID<span class="br0">]</span>        <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                      <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>FK_TU_ErrorLog_Error_ID<span class="br0">]</span>
       <span class="kw1">FOREIGN</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span><span class="br0">[</span>Error_ID<span class="br0">]</span><span class="br0">&#41;</span> 
    <span class="kw1">REFERENCES</span> <span class="br0">[</span>TU_Error<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>Error_ID<span class="br0">]</span><span class="br0">&#41;</span>   
 ,<span class="br0">[</span>System<span class="br0">]</span>			<span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>            <span class="sy0">NULL</span> 
 ,<span class="br0">[</span>DB<span class="br0">]</span>              <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>            <span class="sy0">NULL</span>
 ,<span class="br0">[</span>Obj<span class="br0">]</span>             <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>            <span class="sy0">NULL</span>
 ,<span class="br0">[</span>App<span class="br0">]</span>             <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>            <span class="sy0">NULL</span>
 ,<span class="br0">[</span><span class="kw1">USER</span><span class="br0">]</span>            <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>            <span class="sy0">NULL</span>
 ,<span class="br0">[</span>SPID<span class="br0">]</span>            <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>            <span class="sy0">NULL</span>
 ,<span class="br0">[</span>ErrorMsg<span class="br0">]</span>        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>2500<span class="br0">&#41;</span>           <span class="sy0">NULL</span> 
 ,<span class="br0">[</span>Active<span class="br0">]</span>          <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>                      <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_ErrorLog_Active<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> 1
 ,<span class="br0">[</span>DateCreated<span class="br0">]</span>     <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                 <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_ErrorLog_DateCreated<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>DateModified<span class="br0">]</span>    <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                 <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_ErrorLog_DateModified<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span> <span class="kw1">ON</span> <span class="br0">[</span><span class="kw1">PRIMARY</span><span class="br0">]</span>;
&nbsp;
GO
&nbsp;
<span class="kw1">USE</span> DBCATCH
GO
&nbsp;
<span class="kw1">IF</span> <span class="sy0">EXISTS</span><span class="br0">&#40;</span><span class="kw1">SELECT</span> 1
            <span class="kw1">FROM</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>sysobjects<span class="br0">]</span> <span class="br0">&#40;</span>NOLOCK<span class="br0">&#41;</span>
           <span class="kw1">WHERE</span> <span class="br0">[</span>id<span class="br0">]</span>                                            <span class="sy0">=</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span>N<span class="st0">'[dbo].[PU_ErrorLog_ADD]'</span><span class="br0">&#41;</span>
             <span class="sy0">AND</span> <span class="kw2">OBJECTPROPERTY</span><span class="br0">&#40;</span><span class="br0">[</span>id<span class="br0">]</span>, N<span class="st0">'IsProcedure'</span><span class="br0">&#41;</span>            <span class="sy0">=</span> 1<span class="br0">&#41;</span> 
&nbsp;
<span class="kw1">BEGIN</span> 
  <span class="kw1">DROP</span> <span class="kw1">PROCEDURE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ErrorLog_ADD<span class="br0">]</span>; 
&nbsp;
  <span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; DROPPED PROCEDURE [dbo].[PU_ErrorLog_ADD] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span> 
GO
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">PROC</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ErrorLog_ADD<span class="br0">]</span>
  @p_Error_ID                        <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                       <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_System                          <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>             <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_DB                              <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>             <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_Obj                             <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>             <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_App                             <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>             <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_User                            <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>             <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_SPID                            <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>             <span class="sy0">=</span> <span class="sy0">NULL</span>,
  @p_ErrorMsg                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>2500<span class="br0">&#41;</span>            <span class="sy0">=</span> <span class="sy0">NULL</span>
<span class="kw1">WITH</span> ENCRYPTION
<span class="kw1">AS</span>
&nbsp;
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* Name        : PU_ErrorLog_ADD                                                                 */</span>
<span class="coMULTI">/* Version     : 1.0                                                                             */</span>
<span class="coMULTI">/* Author      : Jared Kirkpatrick                                                               */</span>
<span class="coMULTI">/* Date        : 2019-07-24                                                                      */</span>
<span class="coMULTI">/* Description : Inserts an error into the errorlog table                                        */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* Date        : Version: Who: Description                                                       */</span>
<span class="coMULTI">/*************************************************************************************************/</span> 
<span class="coMULTI">/* 2019-07-24  : 1.0    : REB: Initial Release.                                                  */</span>
<span class="coMULTI">/*************************************************************************************************/</span>
&nbsp;
<span class="kw1">SET</span> <span class="kw1">NOCOUNT</span> <span class="kw1">ON</span>;
&nbsp;
<span class="coMULTI">/* Declare Variables */</span>
<span class="kw1">DECLARE</span> @v_Error                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_MSG                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>2500<span class="br0">&#41;</span>
&nbsp;
<span class="kw1">IF</span> @p_Error_ID                       <span class="kw1">IS</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>
  <span class="kw1">SELECT</span> @p_Error_ID                 <span class="sy0">=</span> <span class="nu0">0</span>;
<span class="kw1">END</span>  
&nbsp;
<span class="kw1">BEGIN</span> <span class="kw1">TRANSACTION</span> 
&nbsp;
  <span class="kw1">INSERT</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_ErrorLog<span class="br0">]</span>
  <span class="br0">&#40;</span>
    <span class="br0">[</span>Error_ID<span class="br0">]</span>,
    <span class="br0">[</span>System<span class="br0">]</span>,
    <span class="br0">[</span>DB<span class="br0">]</span>,
    <span class="br0">[</span>Obj<span class="br0">]</span>,
    <span class="br0">[</span>App<span class="br0">]</span>,
    <span class="br0">[</span><span class="kw1">USER</span><span class="br0">]</span>,
    <span class="br0">[</span>ErrorMsg<span class="br0">]</span>,
    <span class="br0">[</span>SPID<span class="br0">]</span>
  <span class="br0">&#41;</span>
  <span class="kw1">VALUES</span>
  <span class="br0">&#40;</span>
    @p_Error_ID,
    @p_System,
    @p_DB,
    @p_Obj,
    @p_App,
    @p_User,
    @p_ErrorMsg,
    @p_SPID 
  <span class="br0">&#41;</span>
&nbsp;
  <span class="kw1">SELECT</span> @v_Error                    <span class="sy0">=</span> <span class="kw2">@@ERROR</span>;
&nbsp;
  <span class="kw1">IF</span> @v_Error <span class="sy0">&lt;&gt;</span> 0
  <span class="kw1">BEGIN</span>
&nbsp;
    <span class="kw1">RAISERROR</span><span class="br0">&#40;</span><span class="st0">'INSERT into TU_ErrorLog Failed!'</span>, 16, 1<span class="br0">&#41;</span>
    <span class="kw1">ROLLBACK</span> <span class="kw1">TRANSACTION</span>
    <span class="kw1">RETURN</span> @v_Error;
&nbsp;
  <span class="kw1">END</span>;
&nbsp;
<span class="kw1">COMMIT</span> <span class="kw1">TRANSACTION</span>;
GO
&nbsp;
<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span><span class="st0">'[dbo].[PU_ErrorLog_ADD]'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NOT</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; CREATED PROCEDURE [dbo].[PU_ErrorLog_ADD] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span>;
<span class="kw1">ELSE</span> 
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&lt;&lt;&lt; FAILED TO CREATE PROCEDURE [dbo].[PU_ErrorLog_ADD] &gt;&gt;&gt;'</span>;
<span class="kw1">END</span>;
GO</pre></div></div>
<p>&nbsp;</p>
<p>If you have been following along, your DBCatch database should have the following objects when you look at it in Management Studio:</p>
<p><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-2.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-4167 size-full" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-2.png" alt="sql error engine" width="322" height="535" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-2.png 322w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-2-181x300.png 181w" sizes="(max-width: 322px) 100vw, 322px" /></a></p>
<h3><strong>Producing the Template</strong></h3>
<p>We&#8217;ve put it all together. Now we can create (or better yet, save off) a template that has the feature we just created in a stored procedure. Before we get into the template, we will create additional features, so this template will change as we develop.</p>
<div id="wpshdo_61" class="wp-synhighlighter-outer"><div id="wpshdt_61" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_61"></a><a id="wpshat_61" class="wp-synhighlighter-title" href="#codesyntax_61"  onClick="javascript:wpsh_toggleBlock(61)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_61" onClick="javascript:wpsh_code(61)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_61" onClick="javascript:wpsh_print(61)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_61" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> DBCATCH
GO
&nbsp;
<span class="kw1">IF</span> <span class="sy0">EXISTS</span><span class="br0">&#40;</span><span class="kw1">SELECT</span> 1
            <span class="kw1">FROM</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>sysobjects<span class="br0">]</span> <span class="br0">&#40;</span>NOLOCK<span class="br0">&#41;</span>
           <span class="kw1">WHERE</span> <span class="br0">[</span>id<span class="br0">]</span>          <span class="sy0">=</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span>N<span class="st0">'[dbo].[&lt;Name, SYSNAME, PU_DB_ADD&gt;]'</span><span class="br0">&#41;</span>
             <span class="sy0">AND</span> <span class="kw2">OBJECTPROPERTY</span><span class="br0">&#40;</span><span class="br0">[</span>id<span class="br0">]</span>, N<span class="st0">'IsProcedure'</span><span class="br0">&#41;</span>            <span class="sy0">=</span> 1<span class="br0">&#41;</span> 
&nbsp;
<span class="kw1">BEGIN</span> 
  <span class="kw1">DROP</span> <span class="kw1">PROCEDURE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span><span class="sy0">&lt;</span>Name, SYSNAME, PU_DB_ADD<span class="sy0">&gt;</span><span class="br0">]</span>;
&nbsp;
  <span class="kw1">PRINT</span> <span class="st0">'&gt;&gt;&gt; DROPPED PROCEDURE [dbo].[&lt;Name, SYSNAME, PU_DB_ADD&gt;] &lt;&lt;&lt;'</span>;
<span class="kw1">END</span> 
GO
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">PROC</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span><span class="sy0">&lt;</span>Name, SYSNAME, PU_DB_ADD<span class="sy0">&gt;</span><span class="br0">]</span>
<span class="kw1">WITH</span> ENCRYPTION
<span class="kw1">AS</span>
&nbsp;
<span class="coMULTI">/******************************************************/</span> 
<span class="coMULTI">/* Name        : &lt;Name, SYSNAME, PU_DB_ADD&gt;           */</span>
<span class="coMULTI">/* Version     : 1.0                                  */</span>
<span class="coMULTI">/* Author      :                                      */</span>
<span class="coMULTI">/* Date        : 2019-07-24                           */</span>
<span class="coMULTI">/* Description :                                      */</span>
<span class="coMULTI">/******************************************************/</span> 
<span class="coMULTI">/* Date        : Version: Who: Description            */</span>
<span class="coMULTI">/******************************************************/</span> 
<span class="coMULTI">/* 2019-07-24  : 1.0    :    : Initial Release.       */</span>
<span class="coMULTI">/******************************************************/</span> 
&nbsp;
<span class="kw1">SET</span> <span class="kw1">NOCOUNT</span> <span class="kw1">ON</span>;
&nbsp;
<span class="coMULTI">/* Declare Variables */</span>
<span class="kw1">DECLARE</span> @v_Error                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_MSG                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>500<span class="br0">&#41;</span>
       ,@v_DB                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Obj                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_App                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_User                      <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Spid                      <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_ActivityLog_ID            <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_ADesc                     <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>512<span class="br0">&#41;</span>
       ,@v_Now                       <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>
       ,@v_LastErrorDate             <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>
       ,@v_SystemName                <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_RowCount                  <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Count                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Min<span class="sy0">IN</span>T                    <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Max<span class="sy0">IN</span>T                    <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Version                   <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>       
       ,@v_KeyWord                   <span class="br0">[</span>SYSNAME<span class="br0">]</span>   
       ,@v_MSSQL_ID                  <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>
       ,@v_Domain                    <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>  
       ,@v_Batch_Type_ID             <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span> 
	   ,@v_System                    <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_SQL                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>4000<span class="br0">&#41;</span>  
       ,@v_UserName                  <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_PW                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>
       ,@v_Debug                     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>;
&nbsp;
<span class="kw1">SELECT</span> @v_Now                        <span class="sy0">=</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_DB                         <span class="sy0">=</span> <span class="kw2">DB_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_Obj                        <span class="sy0">=</span> <span class="st0">'[DBCATCH].[dbo].[&lt;Name, SYSNAME, PU_DB_ADD&gt;]'</span>
      ,@v_App                        <span class="sy0">=</span> <span class="kw2">APP_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_User                       <span class="sy0">=</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span><span class="sy0">OR</span>IG<span class="sy0">IN</span>AL_LOG<span class="sy0">IN</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">USER_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
      ,@v_Spid                       <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>25<span class="br0">&#41;</span>, <span class="kw2">@@SPID</span><span class="br0">&#41;</span>
	  ,@v_System                     <span class="sy0">=</span> <span class="kw2">HOST_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_Debug                      <span class="sy0">=</span> <span class="nu0">0</span>;  
&nbsp;
&nbsp;
<span class="coMULTI">/* Create Temp Tables */</span>
&nbsp;
<span class="kw1">IF</span> @v_Debug                          <span class="sy0">=</span> 1
<span class="kw1">BEGIN</span> <span class="co1">-- debug = 1 Ref: 1</span>
&nbsp;
  <span class="kw1">SELECT</span> <span class="st0">'REF:1 - Define Static Variables'</span>;
&nbsp;
  <span class="kw1">SELECT</span> @v_Now                      <span class="kw1">AS</span> <span class="br0">[</span><span class="kw2">GETDATE</span><span class="br0">]</span>
        ,@v_DB                       <span class="kw1">AS</span> <span class="br0">[</span>DB<span class="br0">]</span>
        ,@v_Obj                      <span class="kw1">AS</span> <span class="br0">[</span>OBJ<span class="br0">]</span>
        ,@v_App                      <span class="kw1">AS</span> <span class="br0">[</span>APP<span class="br0">]</span>
        ,@v_User                     <span class="kw1">AS</span> <span class="br0">[</span><span class="kw1">USER</span><span class="br0">]</span>
        ,@v_Spid                     <span class="kw1">AS</span> <span class="br0">[</span>SPID<span class="br0">]</span>;
&nbsp;
<span class="kw1">END</span>; <span class="co1">-- debug = 1    </span>
&nbsp;
&nbsp;
  <span class="kw1">BEGIN</span> TRY
&nbsp;
<span class="co1">--==&gt;&gt; Start Code Here!</span>
&nbsp;
&nbsp;
  <span class="kw1">END</span> TRY
&nbsp;
  <span class="kw1">BEGIN</span> CATCH
&nbsp;
    <span class="kw1">SELECT</span> @v_Error                  <span class="sy0">=</span> 100000
          ,@v_MSG                    <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">NVARCHAR</span><span class="br0">&#40;</span><span class="nu0">2500</span><span class="br0">&#41;</span>, 
                                       <span class="st0">'Error: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_NUMBER<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span> 
                                       <span class="st0">' Severity: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_SEVERITY<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' State: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_STATE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' Line: '</span> <span class="sy0">+</span>  <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_L<span class="sy0">IN</span>E<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' Procedure: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_PROCEDURE<span class="br0">&#40;</span><span class="br0">&#41;</span>, @v_Obj<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
                                       <span class="st0">' MSG: Error from [DBCATCH].[dbo].[TU_Errorlog] with error:'</span> <span class="sy0">+</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_MESSAGE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;  
&nbsp;
    <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ErrorLog_ADD<span class="br0">]</span>
      @p_Error_ID                    <span class="sy0">=</span> @v_Error,
      @p_System                      <span class="sy0">=</span> @v_System,
      @p_DB                          <span class="sy0">=</span> @v_DB,
      @p_Obj                         <span class="sy0">=</span> @v_Obj,
      @p_App                         <span class="sy0">=</span> @v_App,
      @p_User                        <span class="sy0">=</span> @v_User,
      @p_ErrorMsg                    <span class="sy0">=</span> @v_MSG;
&nbsp;
	<span class="kw1">SELECT</span> @v_Msg; 
    <span class="kw1">RETURN</span> @v_Error;
&nbsp;
  <span class="kw1">END</span> CATCH;
&nbsp;
EOF: 
&nbsp;
<span class="coMULTI">/* Cleanup */</span>
&nbsp;
GO   
&nbsp;
<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span><span class="st0">'[dbo].[&lt;Name, SYSNAME, PU_DB_ADD&gt;]'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NOT</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&gt;&gt;&gt; CREATED PROCEDURE [dbo].[&lt;Name, SYSNAME, PU_DB_ADD&gt;] &lt;&lt;&lt;'</span>;
<span class="kw1">END</span>;
<span class="kw1">ELSE</span> 
<span class="kw1">BEGIN</span>
	<span class="kw1">PRINT</span> <span class="st0">'&gt;&gt;&gt; FAILED TO CREATE PROCEDURE [dbo].[&lt;Name, SYSNAME, PU_DB_ADD&gt;] &lt;&lt;&lt;'</span>;
<span class="kw1">END</span>;
GO</pre></div></div>
<p>&nbsp;</p>
<p>Yep, it’s a lot when you first look at it, but we are going to go through it and it will be manageable. If you work with it every day, it will become second nature. The first thing we need to do is change the template parameters. This is embedded in the template and looks like this:</p>
<p><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-3.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-4168" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-3.png" alt="" width="638" height="295" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-3.png 638w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-3-300x139.png 300w" sizes="(max-width: 638px) 100vw, 638px" /></a></p>
<p>This is the code from the very top, and instead of the actual procedure name we see: </p>
<p>[&lt;Name, SYSNAME, PU_DB_ADD&gt;]</p>
<p>To change this parameter, we simultaneously hold down the keys <strong>SHIFT/CTRL/M </strong>and then type in the name of the stored procedure we are creating. For instance, if we want to create a demo, we could type PU_Demo1 (the prefix PU stands for user defined procedure).</p>
<p><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-4.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-4169" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-4.png" alt="" width="879" height="632" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-4.png 879w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-4-300x216.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-4-768x552.png 768w" sizes="(max-width: 879px) 100vw, 879px" /></a></p>
<p>&nbsp;</p>
<p>After you have changed the parameters, go down about 35 lines to the variables…</p>
<div id="wpshdo_62" class="wp-synhighlighter-outer"><div id="wpshdt_62" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_62"></a><a id="wpshat_62" class="wp-synhighlighter-title" href="#codesyntax_62"  onClick="javascript:wpsh_toggleBlock(62)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_62" onClick="javascript:wpsh_code(62)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_62" onClick="javascript:wpsh_print(62)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_62" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">SELECT</span> @v_Now                        <span class="sy0">=</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_DB                         <span class="sy0">=</span> <span class="kw2">DB_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_Obj                        <span class="sy0">=</span> <span class="st0">'[DBCATCH].[dbo].[PU_Demo1]'</span>
      ,@v_App                        <span class="sy0">=</span> <span class="kw2">APP_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_User                       <span class="sy0">=</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span><span class="sy0">OR</span>IG<span class="sy0">IN</span>AL_LOG<span class="sy0">IN</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">USER_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
      ,@v_Spid                       <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>25<span class="br0">&#41;</span>, <span class="kw2">@@SPID</span><span class="br0">&#41;</span>
      ,@v_System                     <span class="sy0">=</span> <span class="kw2">HOST_NAME</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
      ,@v_Debug                      <span class="sy0">=</span> <span class="nu0">0</span>;</pre></div></div>
<p>&nbsp;</p>
<p>We defined the variable @v_obj when we set the parameters above. The system functions define the rest of the variables. If you look closely, they may look familiar. Remember the table TU_Errorlog from above? Here&#8217;s the table definition again:</p>
<div id="wpshdo_63" class="wp-synhighlighter-outer"><div id="wpshdt_63" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_63"></a><a id="wpshat_63" class="wp-synhighlighter-title" href="#codesyntax_63"  onClick="javascript:wpsh_toggleBlock(63)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_63" onClick="javascript:wpsh_code(63)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_63" onClick="javascript:wpsh_print(63)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_63" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>TU_ErrorLog<span class="br0">]</span>
<span class="br0">&#40;</span>
  <span class="br0">[</span>ErrorLog_ID<span class="br0">]</span>     <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>  <span class="kw1">IDENTITY</span> <span class="br0">&#40;</span>1, 1<span class="br0">&#41;</span>     <span class="sy0">NOT</span> <span class="sy0">NULL</span> 
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>PK_ErrorLog_ID<span class="br0">]</span>   
    <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="kw1">CLUSTERED</span>
 ,<span class="br0">[</span>Error_ID<span class="br0">]</span>        <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                      <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>FK_TU_ErrorLog_Error_ID<span class="br0">]</span>
       <span class="kw1">FOREIGN</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span><span class="br0">[</span>Error_ID<span class="br0">]</span><span class="br0">&#41;</span> 
    <span class="kw1">REFERENCES</span> <span class="br0">[</span>TU_Error<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>Error_ID<span class="br0">]</span><span class="br0">&#41;</span>   
 ,<span class="br0">[</span>System<span class="br0">]</span>			<span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>            <span class="sy0">NULL</span> 
 ,<span class="br0">[</span>DB<span class="br0">]</span>              <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>            <span class="sy0">NULL</span>
 ,<span class="br0">[</span>Obj<span class="br0">]</span>             <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>            <span class="sy0">NULL</span>
 ,<span class="br0">[</span>App<span class="br0">]</span>             <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>            <span class="sy0">NULL</span>
 ,<span class="br0">[</span><span class="kw1">USER</span><span class="br0">]</span>            <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>            <span class="sy0">NULL</span>
 ,<span class="br0">[</span>SPID<span class="br0">]</span>            <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span>            <span class="sy0">NULL</span>
 ,<span class="br0">[</span>ErrorMsg<span class="br0">]</span>        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>2500<span class="br0">&#41;</span>           <span class="sy0">NULL</span> 
 ,<span class="br0">[</span>Active<span class="br0">]</span>          <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>                      <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_ErrorLog_Active<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> 1
 ,<span class="br0">[</span>DateCreated<span class="br0">]</span>     <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                 <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_ErrorLog_DateCreated<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>DateModified<span class="br0">]</span>    <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                 <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_TU_ErrorLog_DateModified<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span> <span class="kw1">ON</span> <span class="br0">[</span><span class="kw1">PRIMARY</span><span class="br0">]</span>;
&nbsp;
GO</pre></div></div>
<p>&nbsp;</p>
<p>Do some of the variables look familiar? We are not at that “a-ha!” moment yet, but I am hoping you are connecting the dots. These variables are being defined dynamically at run time that will be used to populate the error log table when we call the TU_ErrorLog_ADD Procedure. </p>
<p>The last part of the variables, defined above, which needs your attention is the @v_Debug value that is set to 0. When developing your stored procedure you may want to set this to 1 and use this technique throughout your logic. Copy and paste the if statement and supply your own run time variables you will be using as shown below:</p>
<div id="wpshdo_64" class="wp-synhighlighter-outer"><div id="wpshdt_64" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_64"></a><a id="wpshat_64" class="wp-synhighlighter-title" href="#codesyntax_64"  onClick="javascript:wpsh_toggleBlock(64)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_64" onClick="javascript:wpsh_code(64)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_64" onClick="javascript:wpsh_print(64)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_64" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">IF</span> @v_Debug                          <span class="sy0">=</span> 1
<span class="kw1">BEGIN</span> <span class="co1">-- debug = 1 Ref: 1</span>
&nbsp;
  <span class="kw1">SELECT</span> <span class="st0">'REF:1 - Define Static Variables'</span>;
&nbsp;
  <span class="kw1">SELECT</span> @v_Now                      <span class="kw1">AS</span> <span class="br0">[</span><span class="kw2">GETDATE</span><span class="br0">]</span>
        ,@v_DB                       <span class="kw1">AS</span> <span class="br0">[</span>DB<span class="br0">]</span>
        ,@v_Obj                      <span class="kw1">AS</span> <span class="br0">[</span>OBJ<span class="br0">]</span>
        ,@v_App                      <span class="kw1">AS</span> <span class="br0">[</span>APP<span class="br0">]</span>
        ,@v_User                     <span class="kw1">AS</span> <span class="br0">[</span><span class="kw1">USER</span><span class="br0">]</span>
        ,@v_Spid                     <span class="kw1">AS</span> <span class="br0">[</span>SPID<span class="br0">]</span>;
&nbsp;
<span class="kw1">END</span>; <span class="co1">-- debug = 1</span></pre></div></div>
<p>&nbsp;</p>
<h3><strong>Kicking the Tires</strong></h3>
<p>Now that the variables are set, we go to the Begin Try / End Try part of the template where we see a comment:  Start Code Here! I bet you cannot guess where you start your logic code of the stored procedure&#8230; Yeah, it really is that simple. When you are done with your stored procedure and it is error-free, then you are done. <strong>That’s it</strong>.</p>
<div id="wpshdo_65" class="wp-synhighlighter-outer"><div id="wpshdt_65" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_65"></a><a id="wpshat_65" class="wp-synhighlighter-title" href="#codesyntax_65"  onClick="javascript:wpsh_toggleBlock(65)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_65" onClick="javascript:wpsh_code(65)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_65" onClick="javascript:wpsh_print(65)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_65" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">BEGIN</span> TRY
&nbsp;
<span class="co1">--==&gt;&gt; Start Code Here!</span>
&nbsp;
&nbsp;
  <span class="kw1">END</span> TRY</pre></div></div>
<p>&nbsp;</p>
<p>If by chance you do get an error, then we go into the error trapping and error message customization part of the template called the begin catch and the end catch. (We love the try and catch functionality in stored procedures. Where do you think the name DBCatch comes from?)</p>
<div id="wpshdo_66" class="wp-synhighlighter-outer"><div id="wpshdt_66" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_66"></a><a id="wpshat_66" class="wp-synhighlighter-title" href="#codesyntax_66"  onClick="javascript:wpsh_toggleBlock(66)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_66" onClick="javascript:wpsh_code(66)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_66" onClick="javascript:wpsh_print(66)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_66" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">BEGIN</span> CATCH
&nbsp;
    <span class="kw1">SELECT</span> @v_Error   <span class="sy0">=</span> 100000
          ,@v_MSG     <span class="sy0">=</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">NVARCHAR</span><span class="br0">&#40;</span><span class="nu0">2500</span><span class="br0">&#41;</span>, 
  <span class="st0">'Error: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_NUMBER<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span> 
  <span class="st0">' Severity: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_SEVERITY<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
  <span class="st0">' State: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_STATE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
  <span class="st0">' Line: '</span> <span class="sy0">+</span>  <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_L<span class="sy0">IN</span>E<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
  <span class="st0">' Procedure: '</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_PROCEDURE<span class="br0">&#40;</span><span class="br0">&#41;</span>, @v_Obj<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span>
  <span class="st0">' MSG: Error from [DBCATCH].[dbo].[TU_Errorlog] with error:'</span> <span class="sy0">+</span> IS<span class="sy0">NULL</span><span class="br0">&#40;</span>ERR<span class="sy0">OR</span>_MESSAGE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;  
&nbsp;
    <span class="kw1">EXEC</span> <span class="br0">[</span>DBCATCH<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>PU_ErrorLog_ADD<span class="br0">]</span>
      @p_Error_ID                    <span class="sy0">=</span> @v_Error,
      @p_System                      <span class="sy0">=</span> @v_System,
      @p_DB                          <span class="sy0">=</span> @v_DB,
      @p_Obj                         <span class="sy0">=</span> @v_Obj,
      @p_App                         <span class="sy0">=</span> @v_App,
      @p_User                        <span class="sy0">=</span> @v_User,
      @p_ErrorMsg                    <span class="sy0">=</span> @v_MSG;
&nbsp;
	<span class="kw1">SELECT</span> @v_Msg; 
    <span class="kw1">RETURN</span> @v_Error;
&nbsp;
  <span class="kw1">END</span> CATCH;</pre></div></div>
<p>&nbsp;</p>
<p>Once we capture the error, we take our defined variables from above and concatenate a run time message that should give us some insight about the object in question. Using some system error functions we create a meaningful message that should help us determine what’s going on.</p>
<p>It then takes the information and calls the error log stored proc, which  adds the record to the table. Then it prints the message just in case you are calling it from management studio. It may look like a lot, but once you break it down into its individual pieces it is really pretty easy to consume. Let’s finish this segment by creating a simple demo that will error out and we can see our framework in action.</p>
<h3><strong>Demo1</strong></h3>
<p>First, we take our template and hold the keys <strong>SHIFT/CTRL/M</strong> and name the stored procedure PU_Demo1.</p>
<p>Second we go to the line where it says start code here:</p>
<p>&#8211;==&gt;&gt; Start Code Here!</p>
<p>And we replace it with:</p>
<div id="wpshdo_67" class="wp-synhighlighter-outer"><div id="wpshdt_67" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_67"></a><a id="wpshat_67" class="wp-synhighlighter-title" href="#codesyntax_67"  onClick="javascript:wpsh_toggleBlock(67)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_67" onClick="javascript:wpsh_code(67)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_67" onClick="javascript:wpsh_print(67)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_67" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">SELECT</span> <span class="st0">'This is Demo1'</span>
    <span class="kw1">RAISERROR</span> <span class="br0">&#40;</span><span class="st0">'Message'</span>, 19, 1<span class="br0">&#41;</span> <span class="kw1">WITH</span> <span class="kw2">LOG</span></pre></div></div>
<p>&nbsp;</p>
<p>Third, we compile the stored procedure by clicking on the execute button, and then we are run the procedure by opening a new query window and typing:</p>
<div id="wpshdo_68" class="wp-synhighlighter-outer"><div id="wpshdt_68" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_68"></a><a id="wpshat_68" class="wp-synhighlighter-title" href="#codesyntax_68"  onClick="javascript:wpsh_toggleBlock(68)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_68" onClick="javascript:wpsh_code(68)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_68" onClick="javascript:wpsh_print(68)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_68" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> DBCatch;
GO
&nbsp;
<span class="kw1">EXEC</span> PU_Demo1;
&nbsp;
GO</pre></div></div>
<p>&nbsp;</p>
<p>Once we execute that we will see the following message below:</p>
<p><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-5.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-4170" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-5.png" alt="" width="776" height="419" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-5.png 776w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-5-300x162.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-5-768x415.png 768w" sizes="(max-width: 776px) 100vw, 776px" /></a></p>
<p>&nbsp;</p>
<p>Lastly, if we go to the error log table we should see a single record like that below:</p>
<p><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-6.png"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-4171" src="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-6-1024x628.png" alt="" width="669" height="410" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-6-1024x628.png 1024w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-6-300x184.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-6-768x471.png 768w, https://sqlsolutionsgroup.com/wp-content/uploads/2019/08/Part-2-image-6.png 1173w" sizes="(max-width: 669px) 100vw, 669px" /></a></p>
<h3><strong>Conclusion</strong></h3>
<p>We really did not get some earth-shattering enlightenment about the error with our SQL error engine. But lets face it, all we did is raiserror with nothing going on so there was not much to go on.</p>
<p>But, we do have the information about where the error happened (TU_Demo1), from where (management studio) and from what system. You could say this Demo was the worst-case solution in terms of getting a great message out of the error (I wanted to keep the demo as simple as we could and show the worst case). This at least gives us a pretty good starting point. Especially if your solution had 100 stored procs wrapped in its process running in a job every night. I hope you are thinking where you can start using this functionality as we come to a close of the second part of this series.</p>
<p>Come back when we extend the functionality of this framework by adding a running activity log that will interact with our already running error handler.</p>
<p><a href="https://sqlsolutionsgroup.com/the-tsql-activity-log/"><strong><span style="text-decoration: underline;">GO TO PART THREE</span></strong></a></p>
<p>The post <a href="https://sqlsolutionsgroup.com/sql-error-engine/">The SQL Error Engine: Framework, pt. 2</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlsolutionsgroup.com/sql-error-engine/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Building a T-SQL Framework</title>
		<link>https://sqlsolutionsgroup.com/t-sql-framework/</link>
					<comments>https://sqlsolutionsgroup.com/t-sql-framework/#respond</comments>
		
		<dc:creator><![CDATA[Jared Kirkpatrick]]></dc:creator>
		<pubDate>Wed, 02 Mar 2016 14:22:07 +0000</pubDate>
				<category><![CDATA[SQL Group]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[#microsftcertifedmaster]]></category>
		<category><![CDATA[#microsftpartner]]></category>
		<category><![CDATA[#SQLAB]]></category>
		<category><![CDATA[#SQlatino]]></category>
		<category><![CDATA[#SQlatinoamerica]]></category>
		<category><![CDATA[#sqldatabase]]></category>
		<category><![CDATA[#sqldeveloper]]></category>
		<category><![CDATA[#SQLgroupie]]></category>
		<category><![CDATA[#sqlimer]]></category>
		<category><![CDATA[#sqlimerbymay]]></category>
		<category><![CDATA[#sqlinjection]]></category>
		<category><![CDATA[#sqlinternals]]></category>
		<category><![CDATA[#sqlite]]></category>
		<category><![CDATA[#sqlite3]]></category>
		<category><![CDATA[#SQLLearning]]></category>
		<category><![CDATA[#SQLMagazine]]></category>
		<category><![CDATA[#sqlmanagementstudio]]></category>
		<category><![CDATA[#sqlmanager]]></category>
		<category><![CDATA[#Sqlmap]]></category>
		<category><![CDATA[#sqlrun]]></category>
		<category><![CDATA[#sqlsaturday2017]]></category>
		<category><![CDATA[#sqlsatvienna]]></category>
		<category><![CDATA[#sqlserver]]></category>
		<category><![CDATA[#SQLserver2012]]></category>
		<category><![CDATA[#sqlserver2014]]></category>
		<category><![CDATA[#sqlserver2017]]></category>
		<category><![CDATA[#sqlserver2022]]></category>
		<category><![CDATA[#SQLServeronLinux]]></category>
		<category><![CDATA[#SQLsolutionsgroup]]></category>
		<category><![CDATA[#SQLTraining]]></category>
		<category><![CDATA[#SQLYog]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQLPASS]]></category>
		<category><![CDATA[SQLSaturday]]></category>
		<category><![CDATA[SSG]]></category>
		<category><![CDATA[T-SQL]]></category>
		<guid isPermaLink="false">http://sqlsolutionsgroup.com/?p=2869</guid>

					<description><![CDATA[<p>Depending on the objective, building a framework allows the architect to imbed the fundamental segments of a structure so that the existing requirements can be built on top of the foundation, leveraging the functionality of the framework. This usually includes core functionality that repeats consistently through a process like Logging, Error handling, Successes/Failure Notifications, Import/Export [&#8230;]</p>
<p>The post <a href="https://sqlsolutionsgroup.com/t-sql-framework/">Building a T-SQL Framework</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Depending on the objective, building a framework allows the architect to imbed the fundamental segments of a structure so that the existing requirements can be built on top of the foundation, leveraging the functionality of the framework. This usually includes core functionality that repeats consistently through a process like Logging, Error handling, Successes/Failure Notifications, Import/Export Validations, and File System  processes  just to name a few.</p>
<p>There are several different types of frameworks. ETL Frameworks have been receiving the most popularity lately, but they can extend to T-SQL, Analysis Services, Reporting Services, CLR, and even PowerShell within Microsoft SQL Server Data Services. Usually all frameworks will have a simple set of core processes that would benefit any new process by embedding the procedure in question to run consistently through a mechanism such as a template that would allow the extension of logic code from developers.</p>
<p>Today we are going to start a multi-step project to create a basic T-SQL framework from the ground up. This framework will have three components, including:</p>
<ul>
<li><strong>Logging</strong> – Each process that runs in the framework will log its activity to a table. This feature can also be leveraged later if you created an ETL framework or extended to add additional information according to your business needs.</li>
<li><strong>Batching</strong> – Each T-sql procedure will be grouped into a batch. This is another extension of logging but it is also the the same foundation in which to build batching row sets for insert, update, delete, or even selects.</li>
<li><strong>Error Handling</strong> – The framework will incorporate some custom error handling that will identify, define, and log errors that happen through the framework.</li>
</ul>
<p>In the end we will create a stored procedure template that will facilitate the consistent execution of the frameworks features while allowing the developer to code the logic necessary for their task at hand.</p>
<p>In this section of the project we are going to look at creating a new database, the table structures necessary to support the framework, and populate the database with base data (insert into the code tables), that will allow our framework to be data driven.</p>
<p>The first thing we are going to do is create a database called DBCatch.  The defaults will be fine for the database with the statement below:</p>
<p><div id="wpshdo_69" class="wp-synhighlighter-outer"><div id="wpshdt_69" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_69"></a><a id="wpshat_69" class="wp-synhighlighter-title" href="#codesyntax_69"  onClick="javascript:wpsh_toggleBlock(69)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_69" onClick="javascript:wpsh_code(69)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_69" onClick="javascript:wpsh_print(69)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_69" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> master;
GO
&nbsp;
&nbsp;
<span class="kw1">IF</span> <span class="sy0">NOT</span> <span class="sy0">EXISTS</span><span class="br0">&#40;</span><span class="kw1">SELECT</span> 1
                <span class="kw1">FROM</span> master.<span class="me1">sys</span>.<span class="me1">databases</span>
	        <span class="kw1">WHERE</span> name <span class="sy0">=</span> <span class="st0">'DBCatch'</span><span class="br0">&#41;</span>
<span class="kw1">BEGIN</span>
&nbsp;
  <span class="kw1">CREATE</span> <span class="kw1">DATABASE</span> DBCatch;
&nbsp;
<span class="kw1">END</span>;
GO</pre></div></div></p>
<p>Now let&#8217;s take a quick look at the tables that we will create and give an explanation of each one. This is a great place to start a data dictionary but since that is outside of our scope we will not be defining that today. Here is a look at the database diagram once we have all our tables built:</p>
<p><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2016/02/diagram-1.jpg" rel="attachment wp-att-2889"><img loading="lazy" decoding="async" class="aligncenter wp-image-2889 size-large" src="https://sqlsolutionsgroup.com/wp-content/uploads/2016/02/diagram-1-1024x569.jpg" alt="T-sql framework diagram" width="669" height="372" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2016/02/diagram-1-1024x569.jpg 1024w, https://sqlsolutionsgroup.com/wp-content/uploads/2016/02/diagram-1-300x167.jpg 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2016/02/diagram-1-768x427.jpg 768w, https://sqlsolutionsgroup.com/wp-content/uploads/2016/02/diagram-1.jpg 1152w" sizes="(max-width: 669px) 100vw, 669px" /></a></p>
<p>First, start with the code tables CodeGroup and Code. We do not want to clutter our database with all the code tables that will be needed to make the database data driven so we combine them into a name value pair. Let&#8217;s take a phone code example for instance. If we were storing phone numbers, then the overall group name would be phone so we would make an entry into the CodeGroup called phone. Next, we take the primary key that was created for the group phone and we carry it over to the Code table when we define what kind of phone entry we are inserting like:</p>
<ul>
<li>Cell Phone</li>
<li>Home Phone</li>
<li>Work Phone</li>
<li>Fax</li>
<li>Toll Free Phone</li>
<li>Alternate Phone</li>
</ul>
<p>This type of code works for 90% of the codes and definitions we want, but we need another structure for everything else. We will use a technique called the registry table. Back in the day, some developers used the windows registry to store look up data but that became problematic. Great idea but the implementation left something to be desired, so a new idea of creating a structure/table like the registry was created and adopted by a few developers and by us today. The registry table is made up of a RegKey (Registry Key),  like for example if you wanted an email list we could have a RegKey of:</p>
<p>HKEY_LOCAL_MACHINE\SOFTWARE\DBCatch\MAINT\DBMAIL\RECIPIENTS</p>
<p>And then the RegValue (Registry Value) of the emails that make up the email list. Now, one last thing that is important about this table is that it is not encrypted because everyone has their own favorite flavor of encryption, and the nature of this type of data is usually somewhat sensitive (Data paths, email addresses, Powershell directories, etc.). We create a simple level of obscurity by converting the character values into varbinary and then back to character when we need to use them. This is not a bad thing because we will design the framework to do so seamlessly.</p>
<p>The first feature set of tables are the error handling tables. We would normally start with our number one feature we defined (logging), but it is dependent on the error handling functionality in order to be complete. The error tables are Error which will define the error, and ErrorLog which will hold a record for each error that is thrown. In the Error table we will first have to go to our code tables and create a group (CodeGroup), called “Error”, and then define the codes (Code), of the error that will be caught such as:</p>
<ul>
<li>Default or Unknown</li>
<li>SQL – Internal sql server error</li>
<li>DBCATCH generated error</li>
<li>INSERT</li>
<li>UPDATE</li>
<li>DELETE</li>
<li>T-SQL (usually for dynamic sql)</li>
<li>ESCALATION – error that has been escalated to a parent error</li>
<li>MAINTENACE – a maintenance related error</li>
</ul>
<p>The primary key for the Code table will be set in the Foreign Key column “Type_ID” that describes the type of error we are defining. The additional attributes Name, Severity, State, and Desc will be described in detail in the next segment when we define the logic code for the Error and ErrorLog tables.</p>
<p>The next table is the Activity log or ActivityLog.  It will hold a record for every procedure that is executed within the framework, and if there is an error with the procedure it will show that here as well. The activity log will log the who, what, wherefrom, when, and how long did it take. This information will be obtained at runtime through the template.</p>
<p>The last set of records are the “Batch” and “BatchDetail” tables that will extend the logging into groups so that we can see where in a process things go wrong, slow down, or just what groups of statements are being executed together. Although we are only dealing with stored procedure batches at the moment, we are taking into account that we will want to extend the functionality to batch records, or even processes at a future date so we will populate a type_id foreign key that reflects the code for stored procedure batch. The rest of the attributes will be defined in later segments when the logic code is created and the template is designed to wrap the functionality up into a working framework.</p>
<p>Now that we have a brief explanation of the tables we are going to provide the DDL to create the tables in the T-SQL Statement below.</p>
<p><div id="wpshdo_70" class="wp-synhighlighter-outer"><div id="wpshdt_70" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_70"></a><a id="wpshat_70" class="wp-synhighlighter-title" href="#codesyntax_70"  onClick="javascript:wpsh_toggleBlock(70)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_70" onClick="javascript:wpsh_code(70)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_70" onClick="javascript:wpsh_print(70)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_70" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="coMULTI">/************************************************************************/</span>
<span class="coMULTI">/* Name	        : Create DBCatch Table Structures                       */</span>
<span class="coMULTI">/* Version      : 1.0                                                   */</span>
<span class="coMULTI">/* Author       : Jared Kirkpatrick                                     */</span>
<span class="coMULTI">/* Date	        : 2015-11-15                                            */</span>
<span class="coMULTI">/* Description	: Create Table Structures                               */</span>
<span class="coMULTI">/************************************************************************/</span>
<span class="coMULTI">/* Date         : Version: Who: Description                             */</span>
<span class="coMULTI">/************************************************************************/</span>
<span class="coMULTI">/* 2015-11-15   : 1.0    : JSK: Initial Release.                        */</span>
<span class="coMULTI">/************************************************************************/</span>
&nbsp;
&nbsp;
<span class="coMULTI">/************************************************************************/</span>
<span class="coMULTI">/* ::NOTES::														    */</span>
<span class="coMULTI">/************************************************************************/</span>
&nbsp;
&nbsp;
<span class="kw1">USE</span> DBCatch;
GO
&nbsp;
<span class="kw1">DECLARE</span> @v_Mode <span class="kw1">INT</span>
&nbsp;
<span class="kw1">SELECT</span> @v_Mode <span class="sy0">=</span> <span class="nu0">1</span> <span class="co1">-- 0 = drop only 1 = drop/create 2 = create only</span>
&nbsp;
<span class="kw1">IF</span> @v_Mode <span class="sy0">&lt;</span> 2
<span class="kw1">BEGIN</span>
&nbsp;
&nbsp;
<span class="coMULTI">/*****************************BASE FRAMEWORK*********************************/</span>
	<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span>N<span class="st0">'[dbo].[ErrorLog]'</span>, <span class="st0">'u'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NOT</span> <span class="sy0">NULL</span> 
	<span class="kw1">BEGIN</span>
  		<span class="kw1">PRINT</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span><span class="nu0">13</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'Dropping table [dbo].[ErrorLog].'</span>;	
		<span class="kw1">DROP</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>ErrorLog<span class="br0">]</span>;
	<span class="kw1">END</span>;
&nbsp;
<span class="coMULTI">/*****************************BASE FRAMEWORK*********************************/</span>
	<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span>N<span class="st0">'[dbo].[ActivityLog]'</span>, <span class="st0">'u'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NOT</span> <span class="sy0">NULL</span> 
	<span class="kw1">BEGIN</span>
  		<span class="kw1">PRINT</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span><span class="nu0">13</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'Dropping table [dbo].[ActivityLog].'</span>;	
		<span class="kw1">DROP</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>ActivityLog<span class="br0">]</span>;
	<span class="kw1">END</span>;
&nbsp;
<span class="coMULTI">/*****************************BASE FRAMEWORK*********************************/</span>
	<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span>N<span class="st0">'[dbo].[BatchDetail]'</span>, <span class="st0">'u'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NOT</span> <span class="sy0">NULL</span> 
	<span class="kw1">BEGIN</span>
  		<span class="kw1">PRINT</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span><span class="nu0">13</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'Dropping table [dbo].[BatchDetail].'</span>;	
		<span class="kw1">DROP</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>BatchDetail<span class="br0">]</span>;
	<span class="kw1">END</span>;
&nbsp;
<span class="coMULTI">/*****************************BASE FRAMEWORK*********************************/</span>
	<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span>N<span class="st0">'[dbo].[Batch]'</span>, <span class="st0">'u'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NOT</span> <span class="sy0">NULL</span> 
	<span class="kw1">BEGIN</span>
  		<span class="kw1">PRINT</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span><span class="nu0">13</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'Dropping table [dbo].[Batch].'</span>;	
		<span class="kw1">DROP</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Batch<span class="br0">]</span>;
	<span class="kw1">END</span>;
&nbsp;
<span class="coMULTI">/*****************************BASE FRAMEWORK*********************************/</span>
	<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span>N<span class="st0">'[dbo].[Error]'</span>, <span class="st0">'u'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NOT</span> <span class="sy0">NULL</span> 
	<span class="kw1">BEGIN</span>
  		<span class="kw1">PRINT</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span><span class="nu0">13</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'Dropping table [dbo].[Error].'</span>;	
		<span class="kw1">DROP</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Error<span class="br0">]</span>;
	<span class="kw1">END</span>;
&nbsp;
<span class="coMULTI">/*****************************BASE FRAMEWORK*********************************/</span>	
	<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span>N<span class="st0">'[dbo].[Registry]'</span>, <span class="st0">'u'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NOT</span> <span class="sy0">NULL</span>
	<span class="kw1">BEGIN</span>
  		<span class="kw1">PRINT</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span><span class="nu0">13</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'Dropping table [dbo].[Registry].'</span>;	
		<span class="kw1">DROP</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Registry<span class="br0">]</span>;
	<span class="kw1">END</span>;	
&nbsp;
<span class="coMULTI">/*****************************BASE FRAMEWORK*********************************/</span>
	<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span>N<span class="st0">'[dbo].[Code]'</span>, <span class="st0">'u'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NOT</span> <span class="sy0">NULL</span> 
	<span class="kw1">BEGIN</span>
  		<span class="kw1">PRINT</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span><span class="nu0">13</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'Dropping table [dbo].[Code].'</span>;	
		<span class="kw1">DROP</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Code<span class="br0">]</span>;
	<span class="kw1">END</span>;
&nbsp;
<span class="coMULTI">/*****************************BASE FRAMEWORK*********************************/</span>
	<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span>N<span class="st0">'[dbo].[CodeGroup]'</span>, <span class="st0">'u'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NOT</span> <span class="sy0">NULL</span> 
	<span class="kw1">BEGIN</span>
  		<span class="kw1">PRINT</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span><span class="nu0">13</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'Dropping table [dbo].[CodeGroup].'</span>;	
		<span class="kw1">DROP</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>CodeGroup<span class="br0">]</span>;
	<span class="kw1">END</span>;
&nbsp;
<span class="kw1">END</span>;	
&nbsp;
&nbsp;
<span class="kw1">IF</span> @v_Mode <span class="sy0">&gt;=</span> 1
<span class="kw1">BEGIN</span>   <span class="co1">-- @v_Mode &gt;= 1</span>
&nbsp;
<span class="coMULTI">/************************************************************************/</span>
<span class="coMULTI">/* ::NOTES:  Create the objects                                        	*/</span>
<span class="coMULTI">/************************************************************************/</span>
&nbsp;
<span class="coMULTI">/*================================================================================================*/</span>
<span class="coMULTI">/****** Object:  Table [dbo].[CodeGroup]          Script Date: 2015-11-15                 ******/</span>
<span class="coMULTI">/*================================================================================================*/</span>
&nbsp;
	<span class="kw1">PRINT</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span><span class="nu0">13</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'Creating table [dbo].[CodeGroup].'</span>;	
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>CodeGroup<span class="br0">]</span>
<span class="br0">&#40;</span>
  <span class="br0">[</span>CodeGroup_ID<span class="br0">]</span>               <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>  <span class="kw1">IDENTITY</span> <span class="br0">&#40;</span>1, 1<span class="br0">&#41;</span>                                        <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>PK_CodeGroup_ID<span class="br0">]</span>   
    <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="kw1">CLUSTERED</span>
 ,<span class="br0">[</span>Name<span class="br0">]</span>                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NOT</span> <span class="sy0">NULL</span>
 ,<span class="br0">[</span><span class="kw1">DESC</span><span class="br0">]</span>                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>255<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> DF_CodeGroup_Desc
    <span class="kw1">DEFAULT</span> <span class="br0">&#40;</span><span class="st0">'Group Code'</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>Active<span class="br0">]</span>                     <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>                                                         <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> DF_CodeGroup_Active
    <span class="kw1">DEFAULT</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>1<span class="br0">&#41;</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>DateCreated<span class="br0">]</span>                <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> DF_CodeGroup_DateCreated
    <span class="kw1">DEFAULT</span> <span class="br0">&#40;</span><span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>DateModified<span class="br0">]</span>               <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> DF_CodeGroup_DateModified
    <span class="kw1">DEFAULT</span> <span class="br0">&#40;</span><span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span> <span class="kw1">ON</span> <span class="br0">[</span><span class="kw1">PRIMARY</span><span class="br0">]</span>;
&nbsp;
<span class="coMULTI">/* Alt key Unique index */</span>
<span class="kw1">CREATE</span> <span class="kw1">UNIQUE</span> <span class="kw1">NONCLUSTERED</span> <span class="kw1">INDEX</span> ak_CodeGroup_Name <span class="kw1">ON</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>CodeGroup<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>Name<span class="br0">]</span><span class="br0">&#41;</span>
&nbsp;
&nbsp;
<span class="coMULTI">/*================================================================================================*/</span>
<span class="coMULTI">/****** Object:  Table [dbo].[Code]            Script Date: 2015-11-15                    ******/</span>
<span class="coMULTI">/*================================================================================================*/</span>
&nbsp;
	<span class="kw1">PRINT</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span><span class="nu0">13</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'Creating table [dbo].[Code].'</span>;	
&nbsp;
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Code<span class="br0">]</span>
<span class="br0">&#40;</span>
  <span class="br0">[</span>Code_ID<span class="br0">]</span>                    <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>  <span class="kw1">IDENTITY</span> <span class="br0">&#40;</span>1, 1<span class="br0">&#41;</span>                                        <span class="sy0">NOT</span> <span class="sy0">NULL</span> 
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>PK_Code_ID<span class="br0">]</span>   
    <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="kw1">CLUSTERED</span>
 ,<span class="br0">[</span>CodeGroup_ID<span class="br0">]</span>               <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                                                         <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>FK_Code_CodeGroup_ID<span class="br0">]</span>
       <span class="kw1">FOREIGN</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span><span class="br0">[</span>CodeGroup_ID<span class="br0">]</span><span class="br0">&#41;</span> 
    <span class="kw1">REFERENCES</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>CodeGroup<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>CodeGroup_ID<span class="br0">]</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>Name<span class="br0">]</span>                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NOT</span> <span class="sy0">NULL</span>
 ,<span class="br0">[</span><span class="kw1">DESC</span><span class="br0">]</span>                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>255<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Code_Desc<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="st0">'Code'</span>
 ,<span class="br0">[</span>Active<span class="br0">]</span>                     <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>                                                         <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Code_Active<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> 1
 ,<span class="br0">[</span>DateCreated<span class="br0">]</span>                <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Code_DateCreated<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>DateModified<span class="br0">]</span>               <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Code_DateModified<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span> <span class="kw1">ON</span> <span class="br0">[</span><span class="kw1">PRIMARY</span><span class="br0">]</span>;
&nbsp;
&nbsp;
<span class="coMULTI">/* FK Index */</span>
<span class="kw1">CREATE</span> <span class="kw1">NONCLUSTERED</span> <span class="kw1">INDEX</span> idxfk_Code_CodeGroup_ID <span class="kw1">ON</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Code<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>CodeGroup_ID<span class="br0">]</span><span class="br0">&#41;</span>
&nbsp;
&nbsp;
<span class="coMULTI">/*================================================================================================*/</span>
<span class="coMULTI">/****** Object:  Table [dbo].[Registry]        Script Date: 2015-11-15                    ******/</span>
<span class="coMULTI">/*================================================================================================*/</span>
<span class="kw1">IF</span> <span class="kw2">OBJECT_ID</span><span class="br0">&#40;</span>N<span class="st0">'[dbo].[Registry]'</span>, <span class="st0">'u'</span><span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="sy0">NULL</span>
<span class="kw1">BEGIN</span>
&nbsp;
	<span class="kw1">PRINT</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span><span class="nu0">13</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'Creating table [dbo].[Registry].'</span>;	
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Registry<span class="br0">]</span>
<span class="br0">&#40;</span>
  <span class="br0">[</span>Registry_ID<span class="br0">]</span>			       <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>  <span class="kw1">IDENTITY</span> <span class="br0">&#40;</span>1,1<span class="br0">&#41;</span>                                         <span class="sy0">NOT</span> <span class="sy0">NULL</span> 
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>PK_Registry_ID<span class="br0">]</span>   
    <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="kw1">CLUSTERED</span>
 ,<span class="br0">[</span>RegKey<span class="br0">]</span>				       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>255<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS	         <span class="sy0">NOT</span> <span class="sy0">NULL</span>
 ,<span class="br0">[</span>RegValue<span class="br0">]</span>				   <span class="br0">[</span><span class="kw1">VARBINARY</span><span class="br0">]</span><span class="br0">&#40;</span>255<span class="br0">&#41;</span>                                              <span class="sy0">NOT</span> <span class="sy0">NULL</span>
 ,<span class="br0">[</span>Active<span class="br0">]</span>                     <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>                                                         <span class="sy0">NOT</span> <span class="sy0">NULL</span>
   <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Registry_Active<span class="br0">]</span>
   <span class="kw1">DEFAULT</span> <span class="br0">&#40;</span>1<span class="br0">&#41;</span>
 ,<span class="br0">[</span>DateCreated<span class="br0">]</span>			       <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>      					                             <span class="sy0">NOT</span> <span class="sy0">NULL</span>
   <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Registry_DateCreated<span class="br0">]</span>
   <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>DateModified<span class="br0">]</span>			   <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>												     <span class="sy0">NOT</span> <span class="sy0">NULL</span>
   <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Registry_DateModified<span class="br0">]</span>
   <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span> <span class="kw1">ON</span> <span class="br0">[</span><span class="kw1">PRIMARY</span><span class="br0">]</span>;
&nbsp;
<span class="kw1">END</span>;
&nbsp;
&nbsp;
<span class="coMULTI">/* Alt key Unique index */</span>
<span class="kw1">CREATE</span> <span class="kw1">UNIQUE</span> <span class="kw1">NONCLUSTERED</span> <span class="kw1">INDEX</span> ak_Registry_RegKey <span class="kw1">ON</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Registry<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>RegKey<span class="br0">]</span><span class="br0">&#41;</span> <span class="sy0">IN</span>CLUDE <span class="br0">&#40;</span><span class="br0">[</span>RegValue<span class="br0">]</span><span class="br0">&#41;</span>
&nbsp;
<span class="coMULTI">/*================================================================================================*/</span>
<span class="coMULTI">/****** Object:  Table [dbo].[Error]           Script Date: 2015-11-15                    ******/</span>
<span class="coMULTI">/*================================================================================================*/</span>
&nbsp;
	<span class="kw1">PRINT</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span><span class="nu0">13</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'Creating table [dbo].[Error].'</span>;	
&nbsp;
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Error<span class="br0">]</span>
<span class="br0">&#40;</span>
  <span class="br0">[</span>Error_ID<span class="br0">]</span>                   <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>  <span class="kw1">IDENTITY</span> <span class="br0">&#40;</span>1, 1<span class="br0">&#41;</span>                                        <span class="sy0">NOT</span> <span class="sy0">NULL</span> 
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>PK_Error_ID<span class="br0">]</span>   
    <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="kw1">CLUSTERED</span>
 ,<span class="br0">[</span>Type_ID<span class="br0">]</span>                    <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                                                         <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>FK_Error_Code_ID<span class="br0">]</span>
       <span class="kw1">FOREIGN</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span><span class="br0">[</span>Type_ID<span class="br0">]</span><span class="br0">&#41;</span> 
    <span class="kw1">REFERENCES</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Code<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>Code_ID<span class="br0">]</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>Name<span class="br0">]</span>                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NOT</span> <span class="sy0">NULL</span>
 ,<span class="br0">[</span>Severity<span class="br0">]</span>                   <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                                                         <span class="sy0">NULL</span>
 ,<span class="br0">[</span><span class="kw1">STATE</span><span class="br0">]</span>                      <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                                                         <span class="sy0">NULL</span>
 ,<span class="br0">[</span><span class="kw1">DESC</span><span class="br0">]</span>                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>255<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Error_Desc<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="st0">'Error'</span>
 ,<span class="br0">[</span>Active<span class="br0">]</span>                     <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>                                                         <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Error_Active<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> 1
 ,<span class="br0">[</span>DateCreated<span class="br0">]</span>                <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Error_DateCreated<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>DateModified<span class="br0">]</span>               <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Error_DateModified<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span> <span class="kw1">ON</span> <span class="br0">[</span><span class="kw1">PRIMARY</span><span class="br0">]</span>;
&nbsp;
&nbsp;
<span class="coMULTI">/* FK Index */</span>
<span class="kw1">CREATE</span> <span class="kw1">NONCLUSTERED</span> <span class="kw1">INDEX</span> idxfk_Error_Type_ID <span class="kw1">ON</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Error<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>Type_ID<span class="br0">]</span><span class="br0">&#41;</span>
&nbsp;
&nbsp;
<span class="coMULTI">/*================================================================================================*/</span>
<span class="coMULTI">/****** Object:  Table [dbo].[Batch]           Script Date: 2015-11-15                    ******/</span>
<span class="coMULTI">/*================================================================================================*/</span>
&nbsp;
	<span class="kw1">PRINT</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span><span class="nu0">13</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'Creating table [dbo].[Batch].'</span>;	
&nbsp;
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Batch<span class="br0">]</span>
<span class="br0">&#40;</span>
  <span class="br0">[</span>Batch_ID<span class="br0">]</span>			       <span class="br0">[</span><span class="kw1">UNIQUEIDENTIFIER</span><span class="br0">]</span>                                            <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>PK_Batch_ID<span class="br0">]</span>   
    <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="kw1">CLUSTERED</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Batch_ID<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">UNIQUEIDENTIFIER</span>, <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">BINARY</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span>, NEWID<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span> 
                                      <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">BINARY</span><span class="br0">&#40;</span>6<span class="br0">&#41;</span>, <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
 ,<span class="br0">[</span>Type_ID<span class="br0">]</span>                    <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                                                         <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>FK_Batch_Type_ID<span class="br0">]</span>
       <span class="kw1">FOREIGN</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span><span class="br0">[</span>Type_ID<span class="br0">]</span><span class="br0">&#41;</span> 
    <span class="kw1">REFERENCES</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Code<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>Code_ID<span class="br0">]</span><span class="br0">&#41;</span> 
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Batch_Type_ID<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> 0    
 ,<span class="br0">[</span>Name<span class="br0">]</span>                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Batch_Name<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="st0">'Batch:'</span> <span class="sy0">+</span> <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">NVARCHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span>, <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, 110<span class="br0">&#41;</span>    
 ,<span class="br0">[</span>Parent_ID<span class="br0">]</span>                  <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                                                         <span class="sy0">NULL</span>
 ,<span class="br0">[</span>Active<span class="br0">]</span>                     <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>                                                         <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Batch_Active<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> 1
 ,<span class="br0">[</span>DateCreated<span class="br0">]</span>                <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Batch_DateCreated<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>DateModified<span class="br0">]</span>               <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Batch_DateModified<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span> <span class="kw1">ON</span> <span class="br0">[</span><span class="kw1">PRIMARY</span><span class="br0">]</span>;
&nbsp;
&nbsp;
<span class="coMULTI">/* FK Index */</span>
<span class="kw1">CREATE</span> <span class="kw1">NONCLUSTERED</span> <span class="kw1">INDEX</span> idxfk_Batch_Type_ID <span class="kw1">ON</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Batch<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>Type_ID<span class="br0">]</span><span class="br0">&#41;</span>
&nbsp;
&nbsp;
<span class="coMULTI">/*================================================================================================*/</span>
<span class="coMULTI">/****** Object:  Table [dbo].[BatchDetail]        Script Date: 2015-11-15                 ******/</span>
<span class="coMULTI">/*================================================================================================*/</span>
&nbsp;
	<span class="kw1">PRINT</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span><span class="nu0">13</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'Creating table [dbo].[BatchDetail].'</span>;	
&nbsp;
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>BatchDetail<span class="br0">]</span>
<span class="br0">&#40;</span>
  <span class="br0">[</span>BatchDetail_ID<span class="br0">]</span>			   <span class="br0">[</span><span class="kw1">BIGINT</span><span class="br0">]</span>  <span class="kw1">IDENTITY</span> <span class="br0">&#40;</span>1, 1<span class="br0">&#41;</span>                                     <span class="sy0">NOT</span> <span class="sy0">NULL</span> 
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>PK_BatchDetail_ID<span class="br0">]</span>   
    <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="kw1">CLUSTERED</span>
 ,<span class="br0">[</span>Batch_ID<span class="br0">]</span>                   <span class="br0">[</span><span class="kw1">UNIQUEIDENTIFIER</span><span class="br0">]</span>                                            <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>FK_BatchDetail_Batch_ID<span class="br0">]</span>
       <span class="kw1">FOREIGN</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span><span class="br0">[</span>Batch_ID<span class="br0">]</span><span class="br0">&#41;</span> 
    <span class="kw1">REFERENCES</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Batch<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>Batch_ID<span class="br0">]</span><span class="br0">&#41;</span> 
 ,<span class="br0">[</span>BatchSize<span class="br0">]</span>                  <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                                                         <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Batch_BatchSize<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> 0     
 ,<span class="br0">[</span><span class="kw2">OBJECT_ID</span><span class="br0">]</span>                  <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                                                         <span class="sy0">NULL</span>   
 ,<span class="br0">[</span>Entity_ID<span class="br0">]</span>                  <span class="br0">[</span><span class="kw1">UNIQUEIDENTIFIER</span><span class="br0">]</span>                                            <span class="sy0">NULL</span>   
 ,<span class="br0">[</span><span class="kw1">OBJECT</span><span class="br0">]</span>                     <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NULL</span>
 ,<span class="br0">[</span>StartDate<span class="br0">]</span>                  <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NULL</span>
 ,<span class="br0">[</span>EndDate<span class="br0">]</span>                    <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NULL</span>
 ,<span class="br0">[</span>Rank<span class="br0">]</span>                       <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                                                         <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_BatchDetail_Rank<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> 1
 ,<span class="br0">[</span>Active<span class="br0">]</span>                     <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>                                                         <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_BatchDetail_Active<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> 1
 ,<span class="br0">[</span>DateCreated<span class="br0">]</span>                <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_BatchDetail_DateCreated<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>DateModified<span class="br0">]</span>               <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_BatchDetail_DateModified<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span> <span class="kw1">ON</span> <span class="br0">[</span><span class="kw1">PRIMARY</span><span class="br0">]</span>;
&nbsp;
&nbsp;
<span class="coMULTI">/* FK Index */</span>
<span class="kw1">CREATE</span> <span class="kw1">NONCLUSTERED</span> <span class="kw1">INDEX</span> idxfk_BatchDetail_Batch_ID <span class="kw1">ON</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>BatchDetail<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>Batch_ID<span class="br0">]</span><span class="br0">&#41;</span>
&nbsp;
<span class="coMULTI">/*================================================================================================*/</span>
<span class="coMULTI">/****** Object:  Table [dbo].[ActivityLog]         Script Date: 2015-11-15                ******/</span>
<span class="coMULTI">/*================================================================================================*/</span>
	<span class="kw1">PRINT</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span><span class="nu0">13</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'Creating table [dbo].[ActivityLog].'</span>;	
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>ActivityLog<span class="br0">]</span> 
<span class="br0">&#40;</span>
  <span class="br0">[</span>ActivityLog_ID<span class="br0">]</span>             <span class="br0">[</span><span class="kw1">BIGINT</span><span class="br0">]</span>  <span class="kw1">IDENTITY</span> <span class="br0">&#40;</span>1, 1<span class="br0">&#41;</span>                                     <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>PK_ActivityLog_ID<span class="br0">]</span>   
    <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="kw1">CLUSTERED</span>  
 ,<span class="br0">[</span>Error_ID<span class="br0">]</span>                   <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                                                         <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>FK_ActivityLog_Error_ID<span class="br0">]</span>
       <span class="kw1">FOREIGN</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span><span class="br0">[</span>Error_ID<span class="br0">]</span><span class="br0">&#41;</span> 
    <span class="kw1">REFERENCES</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Error<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>Error_ID<span class="br0">]</span><span class="br0">&#41;</span>   
 ,<span class="br0">[</span>SystemName<span class="br0">]</span>                 <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NULL</span>
 ,<span class="br0">[</span>DB<span class="br0">]</span>                         <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NULL</span>
 ,<span class="br0">[</span>Obj<span class="br0">]</span>                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NULL</span>
 ,<span class="br0">[</span>App<span class="br0">]</span>                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NULL</span>
 ,<span class="br0">[</span><span class="kw1">USER</span><span class="br0">]</span>                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NULL</span> 
 ,<span class="br0">[</span>SPID<span class="br0">]</span>                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NULL</span> 
 ,<span class="br0">[</span>Description<span class="br0">]</span>                <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>512<span class="br0">&#41;</span>	<span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS         <span class="sy0">NULL</span> 
 ,<span class="br0">[</span>StartTime<span class="br0">]</span>                  <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NULL</span>
 ,<span class="br0">[</span>EndTime<span class="br0">]</span>                    <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NULL</span> 
 ,<span class="br0">[</span>Active<span class="br0">]</span>                     <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>                                                         <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_ActivityLog_Active<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="br0">&#40;</span>1<span class="br0">&#41;</span>
 ,<span class="br0">[</span>DateCreated<span class="br0">]</span>			       <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>												     <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_ActivityLog_DateCreated<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>DateModified<span class="br0">]</span>			   <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>												     <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_ActivityLog_DateModified<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>			
<span class="br0">&#41;</span> <span class="kw1">ON</span> <span class="br0">[</span><span class="kw1">PRIMARY</span><span class="br0">]</span>;
&nbsp;
&nbsp;
<span class="coMULTI">/* FK Index */</span>
<span class="kw1">CREATE</span> <span class="kw1">NONCLUSTERED</span> <span class="kw1">INDEX</span> idxfk_ActivityLog_Error_ID <span class="kw1">ON</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>ActivityLog<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>Error_ID<span class="br0">]</span><span class="br0">&#41;</span>
&nbsp;
<span class="coMULTI">/*================================================================================================*/</span>
<span class="coMULTI">/****** Object:  Table [dbo].[ErrorLog]           Script Date: 2015-11-15                 ******/</span>
<span class="coMULTI">/*================================================================================================*/</span>
&nbsp;
	<span class="kw1">PRINT</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span><span class="nu0">13</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'Creating table [dbo].[ErrorLog].'</span>;	
&nbsp;
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>ErrorLog<span class="br0">]</span>
<span class="br0">&#40;</span>
  <span class="br0">[</span>ErrorLog_ID<span class="br0">]</span>                <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>  <span class="kw1">IDENTITY</span> <span class="br0">&#40;</span>1, 1<span class="br0">&#41;</span>                                        <span class="sy0">NOT</span> <span class="sy0">NULL</span> 
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>PK_ErrorLog_ID<span class="br0">]</span>   
    <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="kw1">CLUSTERED</span>
 ,<span class="br0">[</span>Error_ID<span class="br0">]</span>                   <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                                                         <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>FK_ErrorLog_Error_ID<span class="br0">]</span>
       <span class="kw1">FOREIGN</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span><span class="br0">[</span>Error_ID<span class="br0">]</span><span class="br0">&#41;</span> 
    <span class="kw1">REFERENCES</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Error<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>Error_ID<span class="br0">]</span><span class="br0">&#41;</span>   
 ,<span class="br0">[</span>DB<span class="br0">]</span>                         <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NULL</span>
 ,<span class="br0">[</span>Obj<span class="br0">]</span>                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NULL</span>
 ,<span class="br0">[</span>App<span class="br0">]</span>                        <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NULL</span>
 ,<span class="br0">[</span><span class="kw1">USER</span><span class="br0">]</span>                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NULL</span>
 ,<span class="br0">[</span>SPID<span class="br0">]</span>                       <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>100<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NULL</span>
 ,<span class="br0">[</span>ErrorMsg<span class="br0">]</span>                   <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>2500<span class="br0">&#41;</span><span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NULL</span> 
 ,<span class="br0">[</span>Active<span class="br0">]</span>                     <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>                                                         <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_ErrorLog_Active<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> 1
 ,<span class="br0">[</span>DateCreated<span class="br0">]</span>                <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_ErrorLog_DateCreated<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>DateModified<span class="br0">]</span>               <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_ErrorLog_DateModified<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span> <span class="kw1">ON</span> <span class="br0">[</span><span class="kw1">PRIMARY</span><span class="br0">]</span>;
&nbsp;
&nbsp;
<span class="coMULTI">/* FK Index */</span>
<span class="kw1">CREATE</span> <span class="kw1">NONCLUSTERED</span> <span class="kw1">INDEX</span> idxfk_ErrorLog_Error_ID <span class="kw1">ON</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>ErrorLog<span class="br0">]</span><span class="br0">&#40;</span><span class="br0">[</span>Error_ID<span class="br0">]</span><span class="br0">&#41;</span>
&nbsp;
<span class="coMULTI">/*================================================================================================*/</span>
<span class="coMULTI">/****** Object:  Table [dbo].[Application]        Script Date: 2015-11-15                 ******/</span>
<span class="coMULTI">/*================================================================================================*/</span>
&nbsp;
	<span class="kw1">PRINT</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span><span class="nu0">13</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'Creating table [dbo].[Application].'</span>;	
&nbsp;
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Application<span class="br0">]</span>
<span class="br0">&#40;</span>
  <span class="br0">[</span>Application_ID<span class="br0">]</span>             <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>  <span class="kw1">IDENTITY</span> <span class="br0">&#40;</span>1, 1<span class="br0">&#41;</span>                                        <span class="sy0">NOT</span> <span class="sy0">NULL</span> 
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>PK_Application_ID<span class="br0">]</span>   
    <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="kw1">CLUSTERED</span>
 ,<span class="br0">[</span>ApplicationName<span class="br0">]</span>            <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>255<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> U_Applications_ApplicationName
	<span class="kw1">UNIQUE</span>
 ,<span class="br0">[</span>AppDesc<span class="br0">]</span>                    <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>512<span class="br0">&#41;</span> <span class="kw1">COLLATE</span> SQL_Latin1_General_CP1_CI_AS          <span class="sy0">NULL</span>
 ,<span class="br0">[</span>Active<span class="br0">]</span>                     <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>                                                         <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Application_Active<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> 1
 ,<span class="br0">[</span>DateCreated<span class="br0">]</span>                <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Application_DateCreated<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
 ,<span class="br0">[</span>DateModified<span class="br0">]</span>               <span class="br0">[</span><span class="kw1">DATETIME</span><span class="br0">]</span>                                                    <span class="sy0">NOT</span> <span class="sy0">NULL</span>
    <span class="kw1">CONSTRAINT</span> <span class="br0">[</span>DF_Application_DateModified<span class="br0">]</span>
    <span class="kw1">DEFAULT</span> <span class="kw2">GETDATE</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span> <span class="kw1">ON</span> <span class="br0">[</span><span class="kw1">PRIMARY</span><span class="br0">]</span>;
&nbsp;
&nbsp;
&nbsp;
&nbsp;
<span class="kw1">END</span>
GO</pre></div></div></p>
<p>The last part of this segment is to populate the data-driven tables which are CodeGroup, Code, Registry, and Error. Now we are populating Error so that we can capture errors and put them in one of the groups we are defining. The other thing we are doing is creating new errors in SQL server but we are not completely defining them, what I mean is that the error message that is usually associate with an error is left out by design so that the message can be created at runtime for a more user friendly surgical message. This will be explained in much more detail in the last segment but take a look at the code because it will be referenced in the near future. The code is listed below but one last thing is that you must have elevated privileges (sa sysadmin) to run this script since it does add system level functionality:</p>
<p><div id="wpshdo_71" class="wp-synhighlighter-outer"><div id="wpshdt_71" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_71"></a><a id="wpshat_71" class="wp-synhighlighter-title" href="#codesyntax_71"  onClick="javascript:wpsh_toggleBlock(71)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_71" onClick="javascript:wpsh_code(71)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_71" onClick="javascript:wpsh_print(71)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_71" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">USE</span> <span class="br0">[</span>DBCatch<span class="br0">]</span>;
GO
&nbsp;
<span class="kw1">SET</span> <span class="kw1">NOCOUNT</span> <span class="kw1">ON</span>;
&nbsp;
<span class="kw1">DECLARE</span> @v_Debug               <span class="br0">[</span><span class="kw1">BIT</span><span class="br0">]</span>                          <span class="sy0">=</span> <span class="nu0">1</span> <span class="co1">-- 1 = print all info msgs, 0 silent install</span>
       ,@v_Error               <span class="br0">[</span><span class="kw1">INT</span><span class="br0">]</span>                          <span class="sy0">=</span> 0
       ,@v_NewLine             <span class="br0">[</span><span class="kw1">NCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>2<span class="br0">&#41;</span>                     <span class="sy0">=</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>13<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>10<span class="br0">&#41;</span>
       ,@v_DynSQL2             <span class="br0">[</span><span class="kw1">NCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>1<span class="br0">&#41;</span>                     <span class="sy0">=</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span>39<span class="br0">&#41;</span>
       ,@v_MSG                 <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>2000<span class="br0">&#41;</span>
       ,@v_SQL                 <span class="br0">[</span><span class="kw1">NVARCHAR</span><span class="br0">]</span><span class="br0">&#40;</span>4000<span class="br0">&#41;</span>;
&nbsp;
&nbsp;
<span class="coMULTI">/* Registry */</span>
  <span class="kw1">IF</span> @v_Debug <span class="sy0">=</span> 1 
  <span class="kw1">BEGIN</span> <span class="co1">-- debug code</span>
&nbsp;
    <span class="kw1">SELECT</span> <span class="st0">'Populating Table: [DBCatch].[dbo].[Registry]'</span>;
&nbsp;
  <span class="kw1">END</span>; <span class="co1">-- debug code</span>
&nbsp;
<span class="coMULTI">/* Registry */</span>
<span class="kw1">INSERT</span> <span class="br0">[</span>DBCatch<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Registry<span class="br0">]</span>
<span class="br0">&#40;</span>RegKey, RegValue<span class="br0">&#41;</span>
<span class="kw1">SELECT</span> <span class="st0">'HKEY_LOCAL_MACHINE<span class="es0">\S</span>OFTWARE<span class="es0">\D</span>BCatch<span class="es0">\M</span>AINTVER'</span>, <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">VARBINARY</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, <span class="st0">'0.01'</span><span class="br0">&#41;</span>
<span class="kw1">UNION</span>
<span class="kw1">SELECT</span> <span class="st0">'HKEY_LOCAL_MACHINE<span class="es0">\S</span>OFTWARE<span class="es0">\D</span>BCatch<span class="es0">\M</span>AINT<span class="es0">\D</span>BMAIL<span class="es0">\R</span>ECIPIENTS'</span>, <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">VARBINARY</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, <span class="st0">'ja*************@***************up.com;'</span><span class="br0">&#41;</span>
<span class="kw1">UNION</span>
<span class="kw1">SELECT</span> <span class="st0">'HKEY_LOCAL_MACHINE<span class="es0">\S</span>OFTWARE<span class="es0">\D</span>BCatch<span class="es0">\P</span>SS<span class="es0">\P</span>ATH'</span>, <span class="kw1">CONVERT</span><span class="br0">&#40;</span><span class="kw1">VARBINARY</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>, <span class="st0">'C:<span class="es0">\M</span>SSQL<span class="es0">\C</span>ode<span class="es0">\D</span>BCatch<span class="es0">\P</span>SScripts<span class="es0">\'</span>)
UNION
SELECT '</span>HKEY_LOCAL_MACH<span class="sy0">IN</span>E\SOFTWARE\DBCatch\SSIS\<span class="kw1">PATH</span><span class="st0">', CONVERT(VARBINARY(255), '</span>C:\MSSQL\Code\DBCatch\Projects\SSISConfig\<span class="st0">')
UNION
SELECT '</span>HKEY_LOCAL_MACH<span class="sy0">IN</span>E\SOFTWARE\DBCatch\BATCH\ROWSET<span class="st0">', CONVERT(VARBINARY(255), '</span><span class="nu0">25000</span><span class="st0">')
UNION
SELECT '</span>HKEY_LOCAL_MACH<span class="sy0">IN</span>E\SOFTWARE\CLETL\EXTRACTHIST\SEC<span class="st0">', CONVERT(VARBINARY(255), '</span><span class="nu0">300</span><span class="st0">')
&nbsp;
&nbsp;
&nbsp;
  IF @v_Debug = 1 
  BEGIN -- debug code
&nbsp;
    SELECT '</span><span class="br0">[</span>DBCatch<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Registry<span class="br0">]</span> <span class="kw1">VALUES</span><span class="st0">';
&nbsp;
    SELECT CONVERT([VARCHAR](2000), [RegValue])
          ,* 
      FROM [DBCatch].[dbo].[Registry] (NOLOCK);
&nbsp;
	 -- select dbo.FSU_RegValue_GET ('</span>HKEY_LOCAL_MACH<span class="sy0">IN</span>E\SOFTWARE\DBCatch\EXTRACTHIST\SEC<span class="st0">')
&nbsp;
  END; -- debug code 
&nbsp;
/* Codes */
  IF @v_Debug = 1 
  BEGIN -- debug code
&nbsp;
    SELECT '</span>Populating <span class="kw1">TABLE</span>: <span class="br0">[</span>DBCatch<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>CodeGroup<span class="br0">]</span><span class="st0">';
&nbsp;
  END; -- debug code
&nbsp;
  SET IDENTITY_INSERT [dbo].[CodeGroup] ON;
&nbsp;
INSERT [DBCatch].[dbo].[CodeGroup]
(      CodeGroup_ID, Name,                    [Desc])
SELECT 0,            '</span><span class="kw1">DEFAULT</span><span class="st0">',               '</span>TEMP<span class="sy0">/</span><span class="kw1">UNKNOWN</span> CODE <span class="kw1">GROUP</span><span class="st0">'
UNION
SELECT 1,            '</span>ERR<span class="sy0">OR</span><span class="st0">',                 '</span>ERR<span class="sy0">OR</span> CODES<span class="st0">'
UNION
SELECT 2,            '</span>BATCH<span class="st0">',                 '</span>TYPE <span class="kw1">OF</span> BATCHS<span class="st0">'
UNION
SELECT 4,            '</span>L<span class="sy0">IN</span>EAGE<span class="st0">',               '</span>TYPE <span class="kw1">OF</span> L<span class="sy0">IN</span>EAGE<span class="st0">';
&nbsp;
  SET IDENTITY_INSERT [dbo].[CodeGroup] OFF;
&nbsp;
&nbsp;
  IF @v_Debug = 1 
  BEGIN -- debug code
&nbsp;
    SELECT '</span><span class="br0">[</span>DBCatch<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>CodeGroup<span class="br0">]</span> <span class="kw1">VALUES</span><span class="st0">';
&nbsp;
    SELECT * 
      FROM [DBCatch].[dbo].[CodeGroup] (NOLOCK);
&nbsp;
  END; -- debug code
&nbsp;
  IF @v_Debug = 1 
  BEGIN -- debug code
&nbsp;
    SELECT '</span>Populating <span class="kw1">TABLE</span>: <span class="br0">[</span>DBCatch<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Code<span class="br0">]</span><span class="st0">';
&nbsp;
  END; -- debug code
&nbsp;
  SET IDENTITY_INSERT [dbo].[Code] ON;
&nbsp;
INSERT [DBCatch].[dbo].[Code]
(      Code_ID, CodeGroup_ID, Name,                    [Desc])
SELECT 0,       0,            '</span><span class="kw1">DEFAULT</span><span class="st0">',               '</span>TEMP<span class="sy0">/</span><span class="kw1">UNKNOWN</span> CODE<span class="st0">'
UNION
SELECT 100,     1,            '</span><span class="kw1">DEFAULT</span><span class="st0">',               '</span><span class="kw1">UNKNOWN</span> ERR<span class="sy0">OR</span><span class="st0">'
UNION
SELECT 101,     1,            '</span><span class="kw1">SQL</span><span class="st0">',                   '</span><span class="sy0">IN</span>TERNAL <span class="kw1">SQL</span> SERVER RELATED ERR<span class="sy0">OR</span><span class="st0">'
UNION
SELECT 102,     1,            '</span>DBCATCH<span class="st0">',               '</span>DBCatch RELATED ERR<span class="sy0">OR</span><span class="st0">'
UNION
SELECT 103,     1,            '</span><span class="kw1">INSERT</span><span class="st0">',                '</span><span class="kw1">SQL</span> <span class="kw1">TABLE</span> <span class="kw1">INSERT</span> RELATED ERR<span class="sy0">OR</span><span class="st0">'
UNION
SELECT 104,     1,            '</span><span class="kw1">UPDATE</span><span class="st0">',                '</span><span class="kw1">SQL</span> <span class="kw1">TABLE</span> <span class="kw1">UPDATE</span> RELATED ERR<span class="sy0">OR</span><span class="st0">'
UNION
SELECT 105,     1,            '</span><span class="kw1">DELETE</span><span class="st0">',                '</span><span class="kw1">SQL</span> <span class="kw1">TABLE</span> <span class="kw1">DELETE</span> RELATED ERR<span class="sy0">OR</span><span class="st0">'
UNION
SELECT 106,     1,            '</span>T<span class="sy0">-</span><span class="kw1">SQL</span><span class="st0">',                 '</span>T<span class="sy0">-</span><span class="kw1">SQL</span> RELATED ERR<span class="sy0">OR</span><span class="st0">'
UNION 
SELECT 107,     1,            '</span>ESCLATION<span class="st0">',             '</span>ERR<span class="sy0">OR</span> THAT HAS BEEN ESCALATED <span class="kw1">TO</span> A PARENT ERR<span class="sy0">OR</span><span class="st0">'
UNION   
SELECT 108,     1,            '</span>MA<span class="sy0">IN</span>TENANCE<span class="st0">',           '</span><span class="kw1">DATABASE</span> MA<span class="sy0">IN</span>TENANCE RELATED ERR<span class="sy0">OR</span><span class="st0">'
UNION
SELECT 200,     2,            '</span><span class="kw1">DEFAULT</span><span class="st0">',               '</span><span class="kw1">DEFAULT</span> BATCH TYPE<span class="st0">'
UNION
SELECT 201,     2,            '</span><span class="kw1">PROCEDURE</span><span class="st0">',             '</span>SP BATCH <span class="kw1">FOR</span> <span class="sy0">OR</span>D<span class="sy0">IN</span>AL COLLECTION<span class="st0">'
UNION
SELECT 202,     2,            '</span>REC<span class="sy0">OR</span>DCOUNT<span class="st0">',           '</span><span class="kw1">SET</span> NUMBER <span class="kw1">OF</span> REC<span class="sy0">OR</span>DS <span class="kw1">TO</span> BE BATCHED<span class="st0">'
UNION
SELECT 400,     4,            '</span><span class="kw1">DEFAULT</span><span class="st0">',               '</span><span class="kw1">DEFAULT</span> L<span class="sy0">IN</span>EAGE<span class="st0">'
UNION
SELECT 401,     4,            '</span><span class="kw1">TABLE</span><span class="st0">',                 '</span>SOURCE <span class="kw1">TABLE</span> L<span class="sy0">IN</span>EAGE<span class="st0">';
&nbsp;
&nbsp;
  SET IDENTITY_INSERT [dbo].[Code] OFF;
&nbsp;
  IF @v_Debug = 1 
  BEGIN -- debug code
&nbsp;
    SELECT '</span><span class="br0">[</span>DBCatch<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Code<span class="br0">]</span> <span class="kw1">VALUES</span><span class="st0">';
&nbsp;
    SELECT * 
      FROM [DBCatch].[dbo].[Code] (NOLOCK);
&nbsp;
  END; -- debug code
&nbsp;
  IF @v_Debug = 1 
  BEGIN -- debug code
&nbsp;
    SELECT '</span>Populating <span class="kw1">TABLE</span>: <span class="br0">[</span>DBCatch<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Error<span class="br0">]</span><span class="st0">';
&nbsp;
  END; -- debug code
&nbsp;
  SET IDENTITY_INSERT [dbo].[Error] ON;
&nbsp;
INSERT [DBCatch].[dbo].[Error]
(      Error_ID, [Type_ID], [Name],              [Severity],[State], [Desc])
SELECT 0,        100,       '</span><span class="kw1">DEFAULT</span><span class="st0">',           '</span><span class="nu0">16</span><span class="st0">',      '</span><span class="nu0">1</span><span class="st0">',     '</span><span class="kw1">UNKNOWN</span><span class="sy0">/</span>TEMP ERR<span class="sy0">OR</span><span class="st0">'
UNION
SELECT 100000,   102,       '</span>DEFAULT_DBCatch<span class="st0">',   '</span><span class="nu0">16</span><span class="st0">',      '</span><span class="nu0">1</span><span class="st0">',     '</span><span class="kw1">UNKNOWN</span><span class="sy0">/</span>TEMP ERR<span class="sy0">OR</span> <span class="sy0">IN</span> DBCatch<span class="st0">'
UNION  
SELECT 100001,   102,       '</span>DBCatch_<span class="sy0">IN</span>SERT<span class="st0">',    '</span><span class="nu0">16</span><span class="st0">',      '</span><span class="nu0">1</span><span class="st0">',     '</span>ERR<span class="sy0">OR</span> <span class="sy0">IN</span>SERT<span class="sy0">IN</span>G <span class="kw1">INTO</span> A <span class="kw1">TABLE</span><span class="st0">'
UNION  
SELECT 100002,   102,       '</span>DBCatch_UPDATE<span class="st0">',    '</span><span class="nu0">16</span><span class="st0">',      '</span><span class="nu0">1</span><span class="st0">',     '</span>ERR<span class="sy0">OR</span> UPDAT<span class="sy0">IN</span>G A <span class="kw1">TABLE</span><span class="st0">'
UNION  
SELECT 100003,   102,       '</span>DBCatch_DELETE<span class="st0">',    '</span><span class="nu0">16</span><span class="st0">',      '</span><span class="nu0">1</span><span class="st0">',     '</span>ERR<span class="sy0">OR</span> DELET<span class="sy0">IN</span>G <span class="kw1">FROM</span> A <span class="kw1">TABLE</span><span class="st0">'
UNION  
SELECT 100004,   102,       '</span>DBCatch_SELECT<span class="st0">',    '</span><span class="nu0">16</span><span class="st0">',      '</span><span class="nu0">1</span><span class="st0">',     '</span>ERR<span class="sy0">OR</span> DBCatch <span class="kw1">DATA</span> COLLECT<span class="sy0">OR</span> <span class="br0">&#40;</span>SELECT<span class="sy0">IN</span>G <span class="sy0">IN</span>FO<span class="br0">&#41;</span><span class="st0">'
UNION  
SELECT 100005,   102,       '</span>DBCatch_ASSEMBLY<span class="st0">',  '</span><span class="nu0">16</span><span class="st0">',      '</span><span class="nu0">1</span><span class="st0">',     '</span>ERR<span class="sy0">OR</span> DBCatch C# SP<span class="sy0">/</span>FN<span class="st0">'
UNION
SELECT 100006,   102,       '</span>DBCatch_WMIC<span class="st0">',      '</span><span class="nu0">16</span><span class="st0">',      '</span><span class="nu0">1</span><span class="st0">',     '</span>ERR<span class="sy0">OR</span> DBCatch WMIC Query<span class="st0">'
UNION  
SELECT 100007,   102,       '</span>ERR<span class="sy0">OR</span>ENG<span class="sy0">IN</span>E<span class="st0">',       '</span><span class="nu0">16</span><span class="st0">',       '</span><span class="nu0">1</span><span class="st0">',    '</span>ERR<span class="sy0">OR</span> WITH<span class="sy0">IN</span> THE FOUNDATION<span class="st0">'
UNION  
SELECT 100008,   102,       '</span><span class="kw1">BACKUP</span><span class="st0">',            '</span><span class="nu0">16</span><span class="st0">',       '</span><span class="nu0">1</span><span class="st0">',     '</span>ERR<span class="sy0">OR</span> <span class="kw1">WITH</span> A <span class="kw1">BACKUP</span><span class="st0">'
UNION  
SELECT 100009,   102,       '</span>SQLJOB<span class="st0">',            '</span><span class="nu0">16</span><span class="st0">',       '</span><span class="nu0">1</span><span class="st0">',     '</span>ERR<span class="sy0">OR</span> <span class="kw1">WITH</span> A <span class="kw1">SQL</span> JOB<span class="st0">'
UNION  
SELECT 100010,   104,       '</span>RE<span class="sy0">IN</span>DEX<span class="st0">',           '</span><span class="nu0">16</span><span class="st0">',       '</span><span class="nu0">1</span><span class="st0">',     '</span>ERR<span class="sy0">OR</span> EXECUT<span class="sy0">IN</span>G <span class="kw1">DATABASE</span> RE<span class="sy0">IN</span>DEX<span class="sy0">IN</span>G MA<span class="sy0">IN</span>TENANCE UTILITY<span class="st0">';
&nbsp;
  SET IDENTITY_INSERT [dbo].[Error] OFF;
&nbsp;
IF @v_Debug = 1 
BEGIN -- debug code
&nbsp;
  SELECT '</span><span class="br0">[</span>DBCatch<span class="br0">]</span>.<span class="br0">[</span>dbo<span class="br0">]</span>.<span class="br0">[</span>Error<span class="br0">]</span> <span class="kw1">VALUES</span><span class="st0">';
&nbsp;
  SELECT * 
    FROM [DBCatch].[dbo].[Error] (NOLOCK);
&nbsp;
END; -- debug code
&nbsp;
/* Add error Messages */
IF EXISTS(SELECT 1
            FROM [master].[sys].[messages] 
           WHERE [message_id] = 100001)
BEGIN
  EXEC [DBCatch].[dbo].[sp_dropmessage] @msgnum = 100001;
END;  
&nbsp;
EXEC [DBCatch].[dbo].[sp_addmessage] 
  @msgnum = 100001,
  @severity = 16,
  @msgtext = N'</span><span class="sy0">%</span>s<span class="st0">';</span></pre></div></div></p>
<p>We are well on our way to having a basic T-SQL framework that is scalable enough when completed that it can be extended itself or incorporated into a new framework outside of just stored procedures.</p>
<p>The post <a href="https://sqlsolutionsgroup.com/t-sql-framework/">Building a T-SQL Framework</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlsolutionsgroup.com/t-sql-framework/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Weaning yourself off of SQL Profiler (Part 1)</title>
		<link>https://sqlsolutionsgroup.com/wean-off-sql-profiler-part-1/</link>
					<comments>https://sqlsolutionsgroup.com/wean-off-sql-profiler-part-1/#comments</comments>
		
		<dc:creator><![CDATA[Wayne Sheffield]]></dc:creator>
		<pubDate>Tue, 09 Jun 2015 06:26:24 +0000</pubDate>
				<category><![CDATA[Extended Events]]></category>
		<category><![CDATA[SQL Group]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[#microsftcertifedmaster]]></category>
		<category><![CDATA[#microsftpartner]]></category>
		<category><![CDATA[#SQLAB]]></category>
		<category><![CDATA[#SQlatino]]></category>
		<category><![CDATA[#SQlatinoamerica]]></category>
		<category><![CDATA[#sqldatabase]]></category>
		<category><![CDATA[#sqldeveloper]]></category>
		<category><![CDATA[#SQLgroupie]]></category>
		<category><![CDATA[#sqlimer]]></category>
		<category><![CDATA[#sqlimerbymay]]></category>
		<category><![CDATA[#sqlinjection]]></category>
		<category><![CDATA[#sqlinternals]]></category>
		<category><![CDATA[#sqlite]]></category>
		<category><![CDATA[#sqlite3]]></category>
		<category><![CDATA[#SQLLearning]]></category>
		<category><![CDATA[#SQLMagazine]]></category>
		<category><![CDATA[#sqlmanagementstudio]]></category>
		<category><![CDATA[#sqlmanager]]></category>
		<category><![CDATA[#Sqlmap]]></category>
		<category><![CDATA[#sqlrun]]></category>
		<category><![CDATA[#sqlsaturday2017]]></category>
		<category><![CDATA[#sqlsatvienna]]></category>
		<category><![CDATA[#sqlserver]]></category>
		<category><![CDATA[#SQLserver2012]]></category>
		<category><![CDATA[#sqlserver2014]]></category>
		<category><![CDATA[#sqlserver2017]]></category>
		<category><![CDATA[#sqlserver2022]]></category>
		<category><![CDATA[#SQLServeronLinux]]></category>
		<category><![CDATA[#SQLsolutionsgroup]]></category>
		<category><![CDATA[#SQLTraining]]></category>
		<category><![CDATA[#SQLYog]]></category>
		<category><![CDATA[scripts]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL Script]]></category>
		<category><![CDATA[SQLPASS]]></category>
		<category><![CDATA[SQLSaturday]]></category>
		<category><![CDATA[SSG]]></category>
		<category><![CDATA[T-SQL]]></category>
		<category><![CDATA[XE]]></category>
		<guid isPermaLink="false">http://sqlsolutionsgroup.com/?p=2336</guid>

					<description><![CDATA[<p>In this brave, new world of Extended Events (XE, XEvents), I find myself with a mixture of scripts for troubleshooting issues – some use XE, and some use traces. We’ve all been told that XE is a much better system (it is much more lightweight, causing less of an issue with the server). In fact, [&#8230;]</p>
<p>The post <a href="https://sqlsolutionsgroup.com/wean-off-sql-profiler-part-1/">Weaning yourself off of SQL Profiler (Part 1)</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2015/06/NoProfiler.png"><img loading="lazy" decoding="async" class="alignright wp-image-2348 size-medium" src="https://sqlsolutionsgroup.com/wp-content/uploads/2015/06/NoProfiler-300x243.png" alt="NoProfiler" width="300" height="243" hspace="15" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2015/06/NoProfiler-300x243.png 300w, https://sqlsolutionsgroup.com/wp-content/uploads/2015/06/NoProfiler.png 560w" sizes="(max-width: 300px) 100vw, 300px" /></a>In this brave, new world of Extended Events (XE, XEvents), I find myself with a mixture of scripts for troubleshooting issues – some use XE, and some use traces. We’ve all been told that XE is a much better system (it is much more lightweight, causing less of an issue with the server). In fact, it is so much better that Microsoft has deprecated SQL Trace and SQL Profiler, and in the future, one will not be able to run any traces at all. Believe it or not, this is a good thing!</p>
<p><a href="https://blogs.lessthandot.com/index.php/uncategorized/youre-invited-to-t-sql-tuesday-67-extended-events/"><img loading="lazy" decoding="async" class="alignleft wp-image-1860 size-thumbnail" src="https://sqlsolutionsgroup.com/wp-content/uploads/2014/12/TSQL2sDay150x150-150x150.jpg" alt="TSQL2sDay150x150" width="150" height="150" srcset="https://sqlsolutionsgroup.com/wp-content/uploads/2014/12/TSQL2sDay150x150-150x150.jpg 150w, https://sqlsolutionsgroup.com/wp-content/uploads/2014/12/TSQL2sDay150x150.jpg 154w" sizes="(max-width: 150px) 100vw, 150px" /></a>It just so happens that today is the 67<sup>th</sup> installment of the monthly T-SQL Tuesday blogging event. T-SQL Tuesday, that wonderful monthly blogging party started by Adam Machanic where a selected host challenges the SQL Server universe to have a blog post about a specific topic. This wild frenzy of SQL Server blog posting occurs on the second Tuesday of each month. This month, it is being hosted by my friend (and the person with the highest amount of energy known to mankind) Jes Borland (<span style="color: #3366ff;"><a style="color: #3366ff;" href="https://blogs.lessthandot.com/index.php?disp=authdir&amp;author=420">b</a></span> / <span style="color: #3366ff;"><a style="color: #3366ff;" href="https://twitter.com/grrl_geek">t</a></span>), and the topic that she has chosen is Extended Events. Her specific challenge to the SQL Server universe is:</p>
<blockquote><p>I want to know (and others do, too) how you’ve solved problems with Extended Events. What sessions have you created? What unique way have you used predicates or targets? What challenges have you overcome?</p></blockquote>
<p>The biggest challenge that I have is not a technical challenge&#8230; it&#8217;s a personal challenge: actually getting started with XE. I have so many scripts for doing traces, that I just immediately use them instead of the better XE system. I really need to wean myself off of using Profiler / traces. Therefore, I’ve decided to start converting my trace scripts into XE scripts, and I&#8217;ll share with you how I go about doing it. Today, I’m going to look at my favorite trace script – a trace to capture deadlock information.</p>
<p>First off, let’s start with the trace script:</p>
<p><div id="wpshdo_72" class="wp-synhighlighter-outer"><div id="wpshdt_72" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_72"></a><a id="wpshat_72" class="wp-synhighlighter-title" href="#codesyntax_72"  onClick="javascript:wpsh_toggleBlock(72)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_72" onClick="javascript:wpsh_code(72)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_72" onClick="javascript:wpsh_print(72)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_72" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="co1">-- Create a trace to capture deadlocks</span>
<span class="kw1">DECLARE</span> @rc <span class="kw1">INTEGER</span>,
        @TraceID <span class="kw1">INTEGER</span>,
        @maxfilesize <span class="kw1">BIGINT</span>,
        @OutputFileName <span class="kw1">NVARCHAR</span><span class="br0">&#40;</span>256<span class="br0">&#41;</span>,
        @TraceStopTime <span class="kw1">DATETIME</span>,
        @<span class="kw1">ON</span> <span class="kw1">BIT</span>,
        @intfilter <span class="kw1">INT</span>,
        @bigintfilter <span class="kw1">BIGINT</span>;
&nbsp;
<span class="kw1">SET</span> @<span class="kw1">ON</span> <span class="sy0">=</span> <span class="nu0">1</span>;
<span class="kw1">SET</span> @maxfilesize <span class="sy0">=</span> <span class="nu0">10</span>; <span class="co1">--mb </span>
<span class="kw1">DECLARE</span> @FileName <span class="kw1">NVARCHAR</span><span class="br0">&#40;</span>256<span class="br0">&#41;</span>;
<span class="co1">-- added InstanceName for when server is running multiple instances</span>
<span class="kw1">SET</span> @FileName <span class="sy0">=</span> N<span class="st0">'C:<span class="es0">\S</span>QL<span class="es0">\T</span>races<span class="es0">\'</span> + CONVERT(sysname, SERVERPROPERTY('</span>InstanceName<span class="st0">')) + '</span>\<span class="st0">' +
               CONVERT(CHAR(8), GETDATE(), 112) + '</span>_<span class="st0">' +
               REPLACE(CONVERT(CHAR(8), GETDATE(), 114), '</span>:<span class="st0">', '</span><span class="st0">');
EXECUTE xp_create_subdir @FileName;               
SET @FileName = @FileName + N'</span>\<span class="st0">' + REPLACE(@@SERVERNAME, N'</span>\<span class="st0">', N'</span>_<span class="st0">') + '</span>_DeadlockTrace_<span class="st0">' + CONVERT(CHAR(8), GETDATE(), 112) + N'</span>_<span class="st0">' + REPLACE(CONVERT(CHAR(8), GETDATE(), 114), N'</span>:<span class="st0">', N'</span><span class="st0">') + N'</span>Z<span class="st0">';
PRINT @FileName;
SET @TraceStopTime = DATEADD(HOUR, 6, GETDATE());
EXEC @rc = sp_trace_create @TraceID output, 2, @FileName, @maxfilesize, @TraceStopTime;
&nbsp;
IF (@rc != 0) GOTO error
&nbsp;
-- Set the events
-- Event 148: Deadlock Graph
EXEC sp_trace_setevent @TraceID, 148, 1, @on;   -- TextData
EXEC sp_trace_setevent @TraceID, 148, 11, @on;  -- LoginName
EXEC sp_trace_setevent @TraceID, 148, 12, @on;  -- SPID
EXEC sp_trace_setevent @TraceID, 148, 14, @on;  -- StartTime
-- Event 25: Lock:Deadlock
EXEC sp_trace_setevent @TraceID, 25, 1, @on;    -- TextData
EXEC sp_trace_setevent @TraceID, 25, 2, @on;    -- BinaryData
EXEC sp_trace_setevent @TraceID, 25, 6, @on;    -- NTUserName
EXEC sp_trace_setevent @TraceID, 25, 9, @on;    -- ClientProcessID
EXEC sp_trace_setevent @TraceID, 25, 10, @on;   -- ApplicationName
EXEC sp_trace_setevent @TraceID, 25, 11, @on;   -- LoginName
EXEC sp_trace_setevent @TraceID, 25, 12, @on;   -- SPID
EXEC sp_trace_setevent @TraceID, 25, 13, @on;   -- Duration
EXEC sp_trace_setevent @TraceID, 25, 14, @on;   -- StartTime
EXEC sp_trace_setevent @TraceID, 25, 15, @on;   -- EndTime
EXEC sp_trace_setevent @TraceID, 25, 22, @on;   -- ObjectID
EXEC sp_trace_setevent @TraceID, 25, 32, @on;   -- Mode
EXEC sp_trace_setevent @TraceID, 25, 35, @on;   -- DatabaseName
EXEC sp_trace_setevent @TraceID, 25, 57, @on;   -- Type
-- Event 59: Lock:Deadlock Chain
EXEC sp_trace_setevent @TraceID, 59, 1, @on;    -- TextData
EXEC sp_trace_setevent @TraceID, 59, 2, @on;    -- BinaryData
EXEC sp_trace_setevent @TraceID, 59, 12, @on;   -- SPID
EXEC sp_trace_setevent @TraceID, 59, 14, @on;   -- StartTime
EXEC sp_trace_setevent @TraceID, 59, 22, @on;   -- ObjectID
EXEC sp_trace_setevent @TraceID, 59, 32, @on;   -- Mode
EXEC sp_trace_setevent @TraceID, 59, 35, @on;   -- DatabaseName
EXEC sp_trace_setevent @TraceID, 59, 57, @on;   -- Type
&nbsp;
&nbsp;
-- Set the Filters
-- Set the trace status to start
EXEC sp_trace_setstatus @TraceID, 1;
&nbsp;
-- display trace id for future references
SELECT TraceID=@TraceID;
GOTO finish;
&nbsp;
error: 
SELECT ErrorCode=@rc;
&nbsp;
finish: 
GO</span></pre></div></div></p>
<p>From this script, you can see that the trace is collecting data from three events (Deadlock Graph (148), Lock:Deadlock (25) and Lock:Deadlock Chain (59)) and several columns for each event. The next step is to convert all of this information into XE events / actions. For this, I’ll modify the script in BOL (at <a href="https://msdn.microsoft.com/en-us/library/ff878264.aspx" rel="noopener noreferrer">https://msdn.microsoft.com/en-us/library/ff878264.aspx</a>) to the following to return the XE events / actions for a specified running trace. Since the trace needs to be running, execute the above trace script to start the trace, then run the following code:</p>
<p><div id="wpshdo_73" class="wp-synhighlighter-outer"><div id="wpshdt_73" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_73"></a><a id="wpshat_73" class="wp-synhighlighter-title" href="#codesyntax_73"  onClick="javascript:wpsh_toggleBlock(73)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_73" onClick="javascript:wpsh_code(73)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_73" onClick="javascript:wpsh_print(73)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_73" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="co1">-- change the following value to the trace_id for the running trace to be converted to XE</span>
<span class="kw1">DECLARE</span> @trace_id <span class="kw1">INTEGER</span> <span class="sy0">=</span> <span class="nu0">2</span>;
&nbsp;
<span class="kw1">SELECT</span> <span class="kw1">DISTINCT</span>
        tb.<span class="me1">trace_event_id</span>,
        te.<span class="me1">name</span> <span class="kw1">AS</span> <span class="st0">'Event Class'</span>,
        em.<span class="me1">package_name</span> <span class="kw1">AS</span> <span class="st0">'Package'</span>,
        em.<span class="me1">xe_event_name</span> <span class="kw1">AS</span> <span class="st0">'XEvent Name'</span>,
        tb.<span class="me1">trace_column_id</span>,
        tc.<span class="me1">name</span> <span class="kw1">AS</span> <span class="st0">'SQL Trace Column'</span>,
        am.<span class="me1">xe_action_name</span> <span class="kw1">AS</span> <span class="st0">'Extended Events action'</span>
<span class="kw1">FROM</span>    sys.<span class="kw4">FN_TRACE_GETEVENTINFO</span><span class="br0">&#40;</span>@trace_id<span class="br0">&#41;</span> ei
        <span class="sy0">JOIN</span> sys.<span class="me1">trace_events</span> te
            <span class="kw1">ON</span> te.<span class="me1">trace_event_id</span> <span class="sy0">=</span> ei.<span class="me1">eventid</span>
        <span class="sy0">JOIN</span> sys.<span class="me1">trace_columns</span> tc  <span class="co1">-- all available trace columns</span>
            <span class="kw1">ON</span> tc.<span class="me1">trace_column_id</span> <span class="sy0">=</span> ei.<span class="me1">columnid</span>
        <span class="kw1">LEFT</span> <span class="sy0">OUTER</span> <span class="sy0">JOIN</span> sys.<span class="me1">trace_xe_event_map</span> em
            <span class="kw1">ON</span> em.<span class="me1">trace_event_id</span> <span class="sy0">=</span> te.<span class="me1">trace_event_id</span>
        <span class="kw1">LEFT</span> <span class="sy0">OUTER</span> <span class="sy0">JOIN</span> sys.<span class="me1">trace_event_bindings</span> tb
            <span class="kw1">ON</span> tb.<span class="me1">trace_event_id</span> <span class="sy0">=</span> em.<span class="me1">trace_event_id</span>
            <span class="sy0">AND</span> tc.<span class="me1">trace_column_id</span> <span class="sy0">=</span> tb.<span class="me1">trace_column_id</span>
        <span class="kw1">LEFT</span> <span class="sy0">OUTER</span> <span class="sy0">JOIN</span> sys.<span class="me1">trace_xe_action_map</span> am
            <span class="kw1">ON</span> am.<span class="me1">trace_column_id</span> <span class="sy0">=</span> tc.<span class="me1">trace_column_id</span>
<span class="kw1">ORDER</span> <span class="kw1">BY</span> tb.<span class="me1">trace_event_id</span>, tb.<span class="me1">trace_column_id</span>;</pre></div></div></p>
<p>These results may contain NULL values in the “Extended Events action” column. A NULL value here means that there is not a corresponding event action for that column. For my deadlock trace, I get the following results:</p>
<p><img decoding="async" src="https://blog.waynesheffield.com/wayne/wp-content/uploads/2016/11/SSMS2014XE00-TraceXExref.png" alt="SSMS2014XE00-TraceXExref" /></p>
<p>With this information, I can now jump into SSMS (2014) and use the New Session wizard to create a new XE session (Expand the Management and Extended Events nodes. Right click on Sessions and select New Session). I name the session “Deadlocks”, and click the “Events” page to select the events that I want to use.</p>
<p><img decoding="async" src="https://blog.waynesheffield.com/wayne/wp-content/uploads/2016/11/SSMS2014XE01-NewXESession.png" alt="SSMS2014XE01-NewXESession" /></p>
<p>Since all of the events that I’m looking for contain “Deadlock”, I search for this and 5 events are displayed. I double-click each of the three listed above (or select them and click the “&gt;” button) to move them to the “Selected Events” grid.</p>
<p><img decoding="async" src="https://blog.waynesheffield.com/wayne/wp-content/uploads/2016/11/SSMS2014XE02-SelectEvents.png" alt="SSMS2014XE02-SelectEvents" /></p>
<p>The next step is to configure the columns, so click the Configure button.</p>
<p><img decoding="async" src="https://blog.waynesheffield.com/wayne/wp-content/uploads/2016/11/SSMS2014XE03-ConfigureEvents.png" alt="SSMS2014XE03-ConfigureEvents" /></p>
<p>Select the lock_deadlock event, and on the “Global Fields (Actions)” tab select the client_app_name, client_pid, database_name, nt_username, server_principal_name and session_id columns.</p>
<p><img decoding="async" src="https://blog.waynesheffield.com/wayne/wp-content/uploads/2016/11/SSMS2014XE04-ConfigureEventColumns.png" alt="SSMS2014XE04-ConfigureEventColumns" /></p>
<p>Click on the “Event Fields” tab, and check the checkboxes for database_name and resource_description. Fields that show up in this tab with checkboxes have customizable actions, and don’t actually collect the information unless checked. Frequently this will be because these fields require an additional level of resource usage to gather this information.</p>
<p><img decoding="async" src="https://blog.waynesheffield.com/wayne/wp-content/uploads/2016/11/SSMS2014XE05-ConfigureEventColumns.png" alt="SSMS2014XE05-ConfigureEventColumns" /></p>
<p>Select the lock_deadlock_chain event, and select the session_id and database_name columns on the “Global Fields (Actions)” tab. Click on the “Event Fields” tab and check the checkbox for database_name and resource_description. Finally, select the xml_deadlock_report event, and select the server_principal_name and session_id columns on the “Global Fields (Actions)” tab.</p>
<p>Finally, click on the Data Storage page, and add an event_file target type. The file name defaults to the name that you gave the session earlier. I set the maximum size to 250mb and 5 rollover files. If you select to script to a new query window (HIGHLY recommended), you will have a script with all of the DDL necessary to create this XE.</p>
<p><img decoding="async" src="https://blog.waynesheffield.com/wayne/wp-content/uploads/2016/11/SSMS2014XE06-ConfigureDataStorage.png" alt="SSMS2014XE06-ConfigureDataStorage" /></p>
<p>At this point, there are two changes that I like to make. First, I like to make my scripts so that they won’t have an error, and if the XE session already exists then one will be generated. To make it bullet-proof, I add an IF EXISTS check at the top and drop the XE session if it already exists. Secondly, I like to call xp_create_subdir to create the directory that the script points to, just in case the directory doesn’t exist. Note that xp_create_subdir will be successful if the directory already exists, so I don’t check to ensure that the directory doesn’t exist before executing this procedure.</p>
<p>My final XE Deadlock script looks like:</p>
<p><div id="wpshdo_74" class="wp-synhighlighter-outer"><div id="wpshdt_74" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_74"></a><a id="wpshat_74" class="wp-synhighlighter-title" href="#codesyntax_74"  onClick="javascript:wpsh_toggleBlock(74)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_74" onClick="javascript:wpsh_code(74)" title="Show code only"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_74" onClick="javascript:wpsh_print(74)" title="Print code"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img decoding="async" border="0" style="border: 0 none" src="https://sqlsolutionsgroup.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_74" class="wp-synhighlighter-inner" style="display: block;"><pre class="tsql" style="font-family:monospace;"><span class="kw1">IF</span> <span class="sy0">EXISTS</span> <span class="br0">&#40;</span><span class="kw1">SELECT</span> 1 <span class="kw1">FROM</span> sys.<span class="me1">server_event_sessions</span> <span class="kw1">WHERE</span> name <span class="sy0">=</span> <span class="st0">'Deadlocks'</span><span class="br0">&#41;</span>
	<span class="kw1">DROP</span> EVENT <span class="kw1">SESSION</span> <span class="br0">[</span>Deadlocks<span class="br0">]</span> <span class="kw1">ON</span> SERVER;
GO
<span class="kw1">EXECUTE</span> xp_create_subdir <span class="st0">'C:<span class="es0">\S</span>QL<span class="es0">\X</span>E_Out'</span>;
GO
<span class="kw1">CREATE</span> EVENT <span class="kw1">SESSION</span> <span class="br0">[</span>Deadlocks<span class="br0">]</span>
<span class="kw1">ON</span> SERVER
<span class="kw1">ADD</span> EVENT sqlserver.<span class="me1">lock_deadlock</span><span class="br0">&#40;</span>
    <span class="kw1">SET</span> collect_database_name<span class="sy0">=</span><span class="br0">&#40;</span>1<span class="br0">&#41;</span>,collect_resource_description<span class="sy0">=</span><span class="br0">&#40;</span>1<span class="br0">&#41;</span>
	<span class="kw1">ACTION</span> 
	<span class="br0">&#40;</span>
			  sqlserver.<span class="me1">client_app_name</span>	<span class="co1">-- ApplicationName from SQLTrace</span>
			, sqlserver.<span class="me1">client_pid</span>	<span class="co1">-- ClientProcessID from SQLTrace</span>
			, sqlserver.<span class="me1">nt_username</span>	<span class="co1">-- NTUserName from SQLTrace</span>
			, sqlserver.<span class="me1">server_principal_name</span>	<span class="co1">-- LoginName from SQLTrace</span>
			, sqlserver.<span class="me1">session_id</span>	<span class="co1">-- SPID from SQLTrace</span>
	<span class="br0">&#41;</span>
<span class="br0">&#41;</span>,
<span class="kw1">ADD</span> EVENT sqlserver.<span class="me1">lock_deadlock_chain</span><span class="br0">&#40;</span>
    <span class="kw1">SET</span> collect_database_name<span class="sy0">=</span><span class="br0">&#40;</span>1<span class="br0">&#41;</span>,collect_resource_description<span class="sy0">=</span><span class="br0">&#40;</span>1<span class="br0">&#41;</span>
	<span class="kw1">ACTION</span> 
	<span class="br0">&#40;</span>
			  sqlserver.<span class="me1">session_id</span>	<span class="co1">-- SPID from SQLTrace</span>
	<span class="br0">&#41;</span>
<span class="br0">&#41;</span>,
<span class="kw1">ADD</span> EVENT sqlserver.<span class="me1">xml_deadlock_report</span><span class="br0">&#40;</span>
	<span class="kw1">ACTION</span> 
	<span class="br0">&#40;</span>
			  sqlserver.<span class="me1">server_principal_name</span>	<span class="co1">-- LoginName from SQLTrace</span>
			, sqlserver.<span class="me1">session_id</span>	<span class="co1">-- SPID from SQLTrace</span>
	<span class="br0">&#41;</span>
<span class="br0">&#41;</span>
<span class="kw1">ADD</span> TARGET package0.<span class="me1">event_file</span>
<span class="br0">&#40;</span>
	<span class="kw1">SET</span> filename <span class="sy0">=</span> <span class="st0">'C:<span class="es0">\S</span>QL<span class="es0">\X</span>E_Out<span class="es0">\D</span>eadlocks.xel'</span>,
		max_file_size <span class="sy0">=</span> 250,
		max_rollover_files <span class="sy0">=</span> 5
<span class="br0">&#41;</span>
<span class="kw1">WITH</span> <span class="br0">&#40;</span>STARTUP_STATE<span class="sy0">=</span><span class="kw1">OFF</span><span class="br0">&#41;</span>
;</pre></div></div></p>
<p>Now that you have this XE session scripted out, it can be easily installed on multiple servers. If you encounter a deadlock problem, you can easily start the XE session and let it run to trap your deadlocks. They will be persisted to a file dedicated for the deadlocks. You can use my Deadlock Shredder script at <a href="https://bit.ly/ShredDL">https://bit.ly/ShredDL</a> to read the deadlocks from the file and shred the deadlock XML into a tabular output.</p>
<p>Note that the default system_health XE session also captures deadlocks. I like to have a dedicated session for just deadlocks. As lightweight as XE is, sometimes it may benefit a server to turn off the system_health session. Additionally, Jonathan Kehayias has a script that will take a running trace and completely script out an XE session for it. This script can be found at <a href="https://www.sqlskills.com/blogs/jonathan/converting-sql-trace-to-extended-events-in-sql-server-2012/">https://www.sqlskills.com/blogs/jonathan/converting-sql-trace-to-extended-events-in-sql-server-2012/</a>. Even though this script is available, I like to figure things out for myself so that I can learn what is actually going on.</p>
<p><strong>Did you catch the note above where I mentioned that the default system_health XE captures deadlocks</strong><strong>?</strong> This means that if you are still enabling trace flags 1204 and/or 1222 to capture deadlock information in your error logs, you don’t need to do that anymore. Furthermore, by using this Deadlock XE, you can have the deadlocks persisted to a file where, in combination with my Deadlock Shredder script, it will be even easier to analyze the deadlocks than trying to figure it out from the captured information in the error logs.</p>
<p>I hope that this post will help someone with the conversion from using SQL Profiler to using XE instead. The process for converting other traces would be the same, so it can be easily adapted. I also hope that these deadlock scripts will be helpful to you!</p>
<p>In my next post, I will be comparing the results of the deadlock trace and the deadlock XE session.</p>
<p>And Jes – thanks for hosting this month! I’m really looking forward to seeing the roundup for this month.</p>
<p>The post <a href="https://sqlsolutionsgroup.com/wean-off-sql-profiler-part-1/">Weaning yourself off of SQL Profiler (Part 1)</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlsolutionsgroup.com/wean-off-sql-profiler-part-1/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Using Linked Servers the Right Way</title>
		<link>https://sqlsolutionsgroup.com/using-linked-servers-the-right-way/</link>
					<comments>https://sqlsolutionsgroup.com/using-linked-servers-the-right-way/#comments</comments>
		
		<dc:creator><![CDATA[Randy Knight]]></dc:creator>
		<pubDate>Sun, 28 Oct 2012 17:36:16 +0000</pubDate>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL Group]]></category>
		<category><![CDATA[#microsftcertifedmaster]]></category>
		<category><![CDATA[#microsftpartner]]></category>
		<category><![CDATA[#SQLAB]]></category>
		<category><![CDATA[#SQlatino]]></category>
		<category><![CDATA[#SQlatinoamerica]]></category>
		<category><![CDATA[#sqldatabase]]></category>
		<category><![CDATA[#sqldeveloper]]></category>
		<category><![CDATA[#SQLgroupie]]></category>
		<category><![CDATA[#sqlimer]]></category>
		<category><![CDATA[#sqlimerbymay]]></category>
		<category><![CDATA[#sqlinjection]]></category>
		<category><![CDATA[#sqlinternals]]></category>
		<category><![CDATA[#sqlite]]></category>
		<category><![CDATA[#sqlite3]]></category>
		<category><![CDATA[#SQLLearning]]></category>
		<category><![CDATA[#SQLMagazine]]></category>
		<category><![CDATA[#sqlmanagementstudio]]></category>
		<category><![CDATA[#sqlmanager]]></category>
		<category><![CDATA[#Sqlmap]]></category>
		<category><![CDATA[#sqlrun]]></category>
		<category><![CDATA[#sqlsaturday2017]]></category>
		<category><![CDATA[#sqlsatvienna]]></category>
		<category><![CDATA[#sqlserver]]></category>
		<category><![CDATA[#SQLserver2012]]></category>
		<category><![CDATA[#sqlserver2014]]></category>
		<category><![CDATA[#sqlserver2017]]></category>
		<category><![CDATA[#sqlserver2022]]></category>
		<category><![CDATA[#SQLServeronLinux]]></category>
		<category><![CDATA[#SQLsolutionsgroup]]></category>
		<category><![CDATA[#SQLTraining]]></category>
		<category><![CDATA[#SQLYog]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[SQLPASS]]></category>
		<category><![CDATA[SQLSaturday]]></category>
		<category><![CDATA[SSG]]></category>
		<category><![CDATA[T-SQL]]></category>
		<guid isPermaLink="false">http://sqlsolutionsgroup.com/blog/?p=181</guid>

					<description><![CDATA[<p>Linked Servers are a very popular way to access distributed data in environments with lots of SQL Server instances on different serves, or even on other Database Management Systems like Oracle or MySQL. While linked servers can be very useful if used correctly, I have found that more often than not, they are not used correctly [&#8230;]</p>
<p>The post <a href="https://sqlsolutionsgroup.com/using-linked-servers-the-right-way/">Using Linked Servers the Right Way</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Linked Servers are a very popular way to access distributed data in environments with lots of SQL Server instances on different serves, or even on other Database Management Systems like Oracle or MySQL. While linked servers can be very useful if used correctly, I have found that more often than not, they are not used correctly and are a source of lots of performance problems.  In this article we’ll take a look at using linked servers the right way (and a few wrong ones).</p>
<h3><strong>Linked Server Review</strong></h3>
<p>To start with, lets look at how a linked server works.  We configure a linked server by specifying the remote data source and a name for the sever.</p>
<p><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2016/09/linked1-1.png"><img loading="lazy" decoding="async" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="linked1" src="https://sqlsolutionsgroup.com/wp-content/uploads/2016/09/linked1_thumb.png" alt="linked1" width="509" height="462" border="0" /></a></p>
<p>This allows us to use the linked server name <strong>ADVENTUREWORKS</strong> to access the <strong>AdventureWorks</strong> database on the instance <strong>RKLAPTOPSS</strong>.  Note that the Linked Server name can be whatever we want it to.  It does not have to be the name of the instance. I prefer this practice because you can use the same linked server name in multiple environments (Development, QA, Production, etc.)</p>
<p>Authentication settings have to be configured as well.</p>
<p><a href="https://sqlsolutionsgroup.com/wp-content/uploads/2016/09/image.png"><img loading="lazy" decoding="async" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://sqlsolutionsgroup.com/wp-content/uploads/2016/09/image_thumb.png" alt="image" width="506" height="457" border="0" /></a></p>
<p>In this case, I am saying to just pass through the login’s security context to the remote server.  I could also choose to always use a certain security context or to map local login’s to remote logins. The security implications of these choices are beyond the scope of this post but the most important thing is that in most cases Options 2 and 4 should not be used.</p>
<hr />
<p class="has-text-align-center" style="font-size: 20px;">With the Remote DBA managed service from</p>
<p class="has-text-align-center" style="font-size: 20px;">SQL Solutions Group, we do your database dirty</p>
<p class="has-text-align-center" style="font-size: 20px;">work, freeing up your team for projects</p>
<p class="has-text-align-center" style="font-size: 20px;">that impact the bottom line.</p>
<p class="has-text-align-center" style="font-size: 20px;"><a href="https://sqlsolutionsgroup.com/services/remote-dba-services/" target="_blank" rel="noopener noreferrer"><span style="text-decoration: underline;">Learn More</span></a></p>
<hr />
<h3><strong>Four Part Naming in Linked Servers</strong></h3>
<p>Now that we have a linked server set up, we can access it from the local SQL Server instance.  The most common way to do this is to use four part names to refer to objects on the remote server.</p>
<blockquote><p><em>&lt;LinkedServerName&gt;.&lt;DatabaseName&gt;.&lt;Schema&gt;.&lt;Object&gt;</em></p></blockquote>
<pre class="csharpcode"><span class="kwrd">SELECT</span> *
<span class="kwrd">FROM</span> ADVENTUREWORKS.AdventureWorks.HumanResources.Employee
<span class="kwrd">WHERE</span> Gender = <span class="str">'M'</span></pre>
<p>While this is the most popular way to use Linked Servers, it is also the worst way in terms of performance.  To understand this, you need to always ask the following question: “Where will the query be optimized?”</p>
<p>In this case, the optimizer on the local server will determine the execution plan.  But it doesn’t know anything about indexes and statistics that exist on the Employee table on the remote server.  There may well be an index on Gender which could be taken advantage of, but the local optimizer has no way to know that.   So this query will result in a table scan, every time, regardless of remote indexes. In addition, all of the data will be sent across the network only to be filtered for Gender on the local system.</p>
<p><strong>OPENQUERY()</strong></p>
<p>A better way to do this is to use a function like OPENQUERY().  Essentially what we are doing is executing a remote query on the linked server and just asking for the results back.</p>
<pre class="csharpcode"><span class="kwrd">SELECT</span> *
<span class="kwrd">FROM</span> <span class="kwrd">OPENQUERY</span>
   (
    ADVENTUREWORKS,
    <span class="str">'SELECT * FROM AdventureWorks.HumanResources.Employee WHERE Gender = '</span><span class="str">'M'</span><span class="str">''</span>
   )</pre>
<p>The function takes two parameters.  The remote server to execute the query on, and the query itself.  Note that this is remotely executing so if the server was to another DBMS, you’d want the query written in that engine’s flavor of SQL.</p>
<p>This is a simple example, but imagine if the remote table had a million plus rows.  The inefficient table scan plus bringing all that over the network so that it can be filtered locally.  I have “fixed” queries that were taking 12+ hours to run and reduced the time to just minutes by making this simple change to the code.</p>
<p>The post <a href="https://sqlsolutionsgroup.com/using-linked-servers-the-right-way/">Using Linked Servers the Right Way</a> appeared first on <a href="https://sqlsolutionsgroup.com">SQL Solutions Group</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlsolutionsgroup.com/using-linked-servers-the-right-way/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
			</item>
	</channel>
</rss>
