<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Ed Elliott&#39;s Agile SQL Club</title>
    <link>https://the.agilesql.club/</link>
    <description>Recent content on Ed Elliott&#39;s Agile SQL Club</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <copyright>2021</copyright>
    <lastBuildDate>Wed, 14 Jan 2026 19:35:27 +0000</lastBuildDate>
    <atom:link href="https://the.agilesql.club/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Runing tSQLt Tests with Claude</title>
      <link>https://the.agilesql.club/2026/01/runing-tsqlt-tests-with-claude/</link>
      <pubDate>Wed, 14 Jan 2026 19:35:27 +0000</pubDate>
      <guid>https://the.agilesql.club/2026/01/runing-tsqlt-tests-with-claude/</guid>
      <description>&lt;p&gt;Running tSQLt unit tests is great from &lt;a href=&#34;https://the.agilesql.club/2025/12/tsqlt-test-adapter-for-visual-studio-2022-/&#34;&gt;Visual Studio &lt;/a&gt; but my development workflow isn&amp;rsquo;t just write tests, run tests, fix tests, run tests anymore, it is 2026 and I am a big fan of using claude code to help me write more efficiently than I used to be with just a keyboard and mouse.&lt;/p&gt;&#xA;&lt;p&gt;I was using claude and asked it to write tests, there were some errors and so I had to paste the error over to claude, let claude diagnose and then I had to rerun the tests and my first reaction was to wonder why I am even involved in this process? It should be that I tell claude what to do, it writes the code and the tests and then runs the tests to check it all works, there is no reason for me to copy and paste anything.&lt;/p&gt;</description>
    </item>
    <item>
      <title>tSQLt Test Adapter for Visual Studio 2022&#43;</title>
      <link>https://the.agilesql.club/2025/12/tsqlt-test-adapter-for-visual-studio-2022-/</link>
      <pubDate>Tue, 30 Dec 2025 14:56:27 +0100</pubDate>
      <guid>https://the.agilesql.club/2025/12/tsqlt-test-adapter-for-visual-studio-2022-/</guid>
      <description>&lt;p&gt;I have had a number of requests for me to update the tSqlt Test Adapter over the years so it would work with more recent versions of Visual Studio. I finally got around to doing this and I am pleased to say that the new version works with VS 2022, 2025 and should continue to work in future releases.&lt;/p&gt;&#xA;&lt;p&gt;Between Visual Studio 2017 and 2019 the changes required were minimal but between 2017 and 2022 the changes meant a rewrite of the test adapter visual studio integration parts which meant it wasn&amp;rsquo;t a simple change.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Github Copilot in SSMS can include data in its memory, simple prompt injections ahead</title>
      <link>https://the.agilesql.club/2025/11/github-copilot-in-ssms-can-include-data-in-its-memory-simple-prompt-injections-ahead/</link>
      <pubDate>Sat, 15 Nov 2025 09:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2025/11/github-copilot-in-ssms-can-include-data-in-its-memory-simple-prompt-injections-ahead/</guid>
      <description>&lt;p&gt;SQL Server Management Studio (SSMS) has recently added support for Github Copilot. This is a great feature that can help with writing SQL queries and scripts sql development. However, there is a potential security risk that means that I will only be using it for local development with a database that has no externally provided data.&lt;/p&gt;&#xA;&lt;p&gt;When evaluating GitHub copilot I think there are three core risks:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Destructive commands being run for me without me asking - I don&amp;rsquo;t want to be the first person whose copilot broke something.&lt;/li&gt;&#xA;&lt;li&gt;Sensitive/PII data being read and sent to GitHub or somewhere else.&lt;/li&gt;&#xA;&lt;li&gt;Prompts in the data causing malicious code to be generated.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;The first one is most scary, if I ask a question like &amp;ldquo;I need to speed up this database quickly&amp;rdquo;, what is to stop copilot from deleting the data? That would fulfil the request quickly. I am told that the connection that copilot uses is read only so this cannot happen but there is no visibility of this. What I really need here is to be able to configure the connection so I can force the connection to be read only (likely using a lower privileged user).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Delta Lake over Spark Connect</title>
      <link>https://the.agilesql.club/2025/06/delta-lake-over-spark-connect/</link>
      <pubDate>Wed, 18 Jun 2025 20:10:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2025/06/delta-lake-over-spark-connect/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/tags/spark-connect/&#34;&gt;All Spark Connect Posts&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;I have just finished an update for the spark connect dotnet lib that contains the &lt;code&gt;DeltaTable&lt;/code&gt; implementation so that we can now use .NET to maintain delta tables, over and above what we get out of the box by using &lt;code&gt;DataFrame.Write.Format(&amp;quot;delta&amp;quot;)&lt;/code&gt;, this is an example of how to use the delta api from .NET:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; deltaTable = DeltaTable.ForPath(spark, deltaPath);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    deltaTable.History().Show(&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1000&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    deltaTable.Update(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;id &amp;lt; 10&amp;#34;&lt;/span&gt;, (Col(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;), Lit(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    deltaTable.ToDF().Show(&lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; source = spark.Range( &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;).WithColumn(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;, Lit(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;teddy&amp;#34;&lt;/span&gt;)).Alias(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;src&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    deltaTable&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .As(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tgt&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .Merge(source, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;src.id = tgt.id&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .WithSchemaEvolution()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .WhenNotMatchedInsertAll()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .WhenMatchedUpdateAll()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .Execute(spark);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    deltaTable.ToDF().Show(&lt;span style=&#34;color:#ae81ff&#34;&gt;50&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    deltaTable.RestoreToVersion(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    deltaTable.ToDF().Show(&lt;span style=&#34;color:#ae81ff&#34;&gt;50&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    deltaTable.Delete(Lit(&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    deltaTable.ToDF().Show(&lt;span style=&#34;color:#ae81ff&#34;&gt;50&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    deltaTable.Detail().Show();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; newDeltaTable = DeltaTable&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .CreateOrReplace(spark)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .TableName(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deltatablefuntest&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .AddColumn(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; DeltaTableColumnBuilder(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;col_a&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .DataType(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;int&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .Build()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .AddColumn(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; DeltaTableColumnBuilder(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;col_b&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .DataType(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;int&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .GeneratedAlwaysAs(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1980&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .Nullable(&lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .Build()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .Execute();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    newDeltaTable.ToDF().Show();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; sourceDataFrame = spark.CreateDataFrame((&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; List&amp;lt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)&amp;gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1980&lt;/span&gt;), (&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1980&lt;/span&gt;), (&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1980&lt;/span&gt;), (&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1980&lt;/span&gt;), (&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1980&lt;/span&gt;), (&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1980&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }).Cast&amp;lt;ITuple&amp;gt;(), &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; StructType((List&amp;lt;StructField&amp;gt;) [&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; StructField(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;this_is_cola&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; IntegerType(), &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;), &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; StructField(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;colb&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; BigIntType(), &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;)])).Alias(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;source&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sourceDataFrame.Show();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    newDeltaTable.As(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;target&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .Merge(sourceDataFrame, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;source.this_is_cola = target.col_a&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .WhenMatchedUpdate(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (Col(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;target.col_a&amp;#34;&lt;/span&gt;), Col(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;source.this_is_cola&amp;#34;&lt;/span&gt;)), &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (Col(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;target.col_b&amp;#34;&lt;/span&gt;), Col(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;source.colb&amp;#34;&lt;/span&gt;)))   &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .WhenNotMatchedInsert(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (Col(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;target.col_a&amp;#34;&lt;/span&gt;), Col(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;source.this_is_cola&amp;#34;&lt;/span&gt;)), &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (Col(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;target.col_b&amp;#34;&lt;/span&gt;), Col(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;source.colb&amp;#34;&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .WithSchemaEvolution()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .Execute(spark);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    newDeltaTable.ToDF().Show();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    newDeltaTable.Optimize().ExecuteCompaction();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    newDeltaTable.Vacuum();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There isn&amp;rsquo;t really too much to say, the only thing worth pointing out is how nice the delta extensions work with spark, it was really super easy to implement the functions once I had figured out the first one.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ADF: Publish suddenly includes everything where it used to be incremental changes since the last publish</title>
      <link>https://the.agilesql.club/2025/06/adf-publish-suddenly-includes-everything-where-it-used-to-be-incremental-changes-since-the-last-publish/</link>
      <pubDate>Sun, 15 Jun 2025 09:10:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2025/06/adf-publish-suddenly-includes-everything-where-it-used-to-be-incremental-changes-since-the-last-publish/</guid>
      <description>&lt;p&gt;I recently encountered an interesting issue with ADF where the publish feature suddenly attempted to republish every single object, claiming they were new, despite having incrementally published changed objects for some time.&lt;/p&gt;&#xA;&lt;p&gt;We were using the publish feature where you work on a branch until you are happy, then you raise a PR to main, merge to main, and then switch back to ADF and click publish to push the changes to the &lt;code&gt;adf_publish&lt;/code&gt; branch.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spark Connect Dotnet November 2024 Where are we?</title>
      <link>https://the.agilesql.club/2024/11/spark-connect-dotnet-november-2024-where-are-we/</link>
      <pubDate>Sat, 16 Nov 2024 09:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2024/11/spark-connect-dotnet-november-2024-where-are-we/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/tags/spark-connect/&#34;&gt;All Spark Connect Posts&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;There have been quite a few changes in the last couple of months and I just wanted to give a quick update on the current state of the project. In terms of usage I am starting to hear from people using the library and submitting pr&amp;rsquo;s and requests so although usage is pretty low (which is expected from the fact that the Microsoft supported version usage wasn&amp;rsquo;t very high) it is growing which is interesting.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spark Connect Dotnet Variant Data Type</title>
      <link>https://the.agilesql.club/2024/10/spark-connect-dotnet-variant-data-type/</link>
      <pubDate>Sat, 12 Oct 2024 09:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2024/10/spark-connect-dotnet-variant-data-type/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/tags/spark-connect/&#34;&gt;All Spark Connect Posts&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;I recently published the latest version of the Spark Connect Dotnet library which includes support for the new &lt;code&gt;Variant&lt;/code&gt; data type in Apache Spark 4.0 &lt;a href=&#34;https://www.nuget.org/packages/GOEddie.Spark.Dotnet/4.0.0-build.26&#34;&gt;here&lt;/a&gt;. One of the new features of Spark 4.0 is the &lt;code&gt;Variant&lt;/code&gt; data type which is a faster way of processing Json data (&lt;a href=&#34;https://www.databricks.com/blog/introducing-open-variant-data-type-delta-lake-and-apache-spark&#34;&gt;see here&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;h2 id=&#34;sample-data&#34;&gt;Sample data&lt;/h2&gt;&#xA;&lt;p&gt;For this post I used a copy of the sample data from Adobe (&lt;a href=&#34;https://opensource.adobe.com/Spry/samples/data_region/JSONDataSetSample.html)&#34;&gt;https://opensource.adobe.com/Spry/samples/data_region/JSONDataSetSample.html)&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;creating-the-variant-column&#34;&gt;Creating the Variant Column&lt;/h2&gt;&#xA;&lt;p&gt;The first thing we need to do is get the data into spark, normally you would have a file and do a spark.read on he json file, in this example I will have a hard coded string and use &lt;code&gt;CreateDataFrame&lt;/code&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Delta Lake from .NET in a Spark Connect gRPC world</title>
      <link>https://the.agilesql.club/2024/02/delta-lake-from-.net-in-a-spark-connect-grpc-world/</link>
      <pubDate>Sat, 17 Feb 2024 10:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2024/02/delta-lake-from-.net-in-a-spark-connect-grpc-world/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/2025/06/delta-lake-over-spark-connect/&#34;&gt;UPDATE - I have implemented delta in spark-connect-dotnet&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/tags/spark-connect/&#34;&gt;All Spark Connect Posts&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/GoEddie/spark-connect-blogs/tree/main/8-delta&#34;&gt;Code&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-to-do&#34;&gt;What to do?&lt;/h2&gt;&#xA;&lt;p&gt;At some point we will want to do something with delta lake and so I wanted to explore the options. Before we do that there is a little explaining to do about delta lake and Spark. There are two completely separate sides to this, the first is getting Spark to read and write in delta format and the second is performing operations on the factual files directly without using Spark, operations like &lt;code&gt;Vaccum&lt;/code&gt; etc.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Apache Spark from PHP - it is not just a .NET thing</title>
      <link>https://the.agilesql.club/2024/02/apache-spark-from-php-it-is-not-just-a-.net-thing/</link>
      <pubDate>Sat, 10 Feb 2024 07:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2024/02/apache-spark-from-php-it-is-not-just-a-.net-thing/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/tags/spark-connect/&#34;&gt;All Spark Connect Posts&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/GoEddie/spark-connect-blogs/tree/main/7-php&#34;&gt;Code&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;goal-of-this-post&#34;&gt;Goal of this post&lt;/h2&gt;&#xA;&lt;p&gt;I wanted to explore what the Spark Connect API looked like from other languages, I am not a php developer - I used it a long time ago and read up on some of the modern changes but apologies if I insult any php-ers! I will say that I quite like php.&lt;/p&gt;&#xA;&lt;h2 id=&#34;setup&#34;&gt;Setup&lt;/h2&gt;&#xA;&lt;p&gt;The instructions are from &lt;a href=&#34;https://grpc.io/docs/languages/php/quickstart/&#34;&gt;https://grpc.io/docs/languages/php/quickstart/&lt;/a&gt; with an extra step. There are a load of dependencies that we will need in the example repo so I thought the simplest way to get this running was to get the current php gRPC example running and then add my code as an extra example in-place and then use the existing dependencies to build and run this code.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Implementing functions and more fun in Spark Connect using gRPC and .NET</title>
      <link>https://the.agilesql.club/2024/02/implementing-functions-and-more-fun-in-spark-connect-using-grpc-and-.net/</link>
      <pubDate>Sat, 10 Feb 2024 07:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2024/02/implementing-functions-and-more-fun-in-spark-connect-using-grpc-and-.net/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/tags/spark-connect/&#34;&gt;All Spark Connect Posts&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/GoEddie/spark-connect-blogs/tree/main/6-spark-functions/SparkConnect&#34;&gt;Code&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;goal-of-this-post&#34;&gt;Goal of this post&lt;/h2&gt;&#xA;&lt;p&gt;The goal of this post is to look at creating a &lt;code&gt;SparkSession&lt;/code&gt; and a &lt;code&gt;DataFrame&lt;/code&gt; that will wrap the &lt;code&gt;Range&lt;/code&gt; relation and then we will use the &lt;code&gt;WithColumn&lt;/code&gt; function to add a column to the &lt;code&gt;DataFrame&lt;/code&gt; and then we will use the &lt;code&gt;Show&lt;/code&gt; function to show the &lt;code&gt;DataFrame&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;We won&amp;rsquo;t have a builder but we are moving towards:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; spark = SparkSession&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .Builder&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .Remote(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://localhost:15002&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .GetOrCreate();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; dataFrame = spark.Range(&lt;span style=&#34;color:#ae81ff&#34;&gt;1000&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dataFrame.Show();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; dataFrame2 = dataFrame&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .WithColumn(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Lit(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hello From Spark, via Spark Connect&amp;#34;&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;m pretty much going to leave the code as-is from the previous post but will move things about a bit and add a &lt;code&gt;SparkSession&lt;/code&gt; and a &lt;code&gt;DataFrame&lt;/code&gt; class. Also, instead of passing the session id and client around i&amp;rsquo;m going to wrap them in the &lt;code&gt;SparkSession&lt;/code&gt; so that we can just pass a single object and also use it to construct the &lt;code&gt;DataFrame&lt;/code&gt; so we don&amp;rsquo;t even have to worry about passing it around.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Moving towards the DataFrame API using the Spark Connect gRPC API in .NET</title>
      <link>https://the.agilesql.club/2024/02/moving-towards-the-dataframe-api-using-the-spark-connect-grpc-api-in-.net/</link>
      <pubDate>Mon, 05 Feb 2024 07:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2024/02/moving-towards-the-dataframe-api-using-the-spark-connect-grpc-api-in-.net/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/tags/spark-connect/&#34;&gt;All Spark Connect Posts&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/GoEddie/spark-connect-blogs/tree/main/5-returned-relation/SparkConnect&#34;&gt;Code&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;goal-of-this-post&#34;&gt;Goal of this post&lt;/h2&gt;&#xA;&lt;p&gt;So there are two goals of this post, the first is to take a look at Apache Arrow and how we can do things like show the output from &lt;code&gt;DataFrame&lt;/code&gt;.&lt;code&gt;Show&lt;/code&gt;, the second is to start to create objects that look more familiar to us, i.e. the &lt;code&gt;DataFrame&lt;/code&gt; API.&lt;/p&gt;&#xA;&lt;p&gt;I want to take it in small steps, I 100% know that this sort of syntax is possible:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring the Spark Connect gRPC API more</title>
      <link>https://the.agilesql.club/2024/02/exploring-the-spark-connect-grpc-api-more/</link>
      <pubDate>Thu, 01 Feb 2024 07:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2024/02/exploring-the-spark-connect-grpc-api-more/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/tags/spark-connect/&#34;&gt;All Spark Connect Posts&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/GoEddie/spark-connect-blogs/tree/main/4-gRPC&#34;&gt;Code&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;goal-of-this-post&#34;&gt;Goal of this post&lt;/h2&gt;&#xA;&lt;p&gt;In this post we will continue looking at the gRPC API and the &lt;code&gt;AnalyzePlan&lt;/code&gt; method which takes a plan and analyzes it. To be honest I expected this to be longer but decided just to do the &lt;code&gt;AnalyzePlan&lt;/code&gt; method. There are a few more API&amp;rsquo;s like &lt;code&gt;ReleaseExecute&lt;/code&gt;, &lt;code&gt;InterruptAsync&lt;/code&gt;, and &lt;code&gt;ReattachExecute&lt;/code&gt; that I was going to cover but changed my mind so consider this part of the last post :).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring the Spark Connect gRPC API</title>
      <link>https://the.agilesql.club/2024/01/exploring-the-spark-connect-grpc-api/</link>
      <pubDate>Fri, 26 Jan 2024 09:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2024/01/exploring-the-spark-connect-grpc-api/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/tags/spark-connect/&#34;&gt;All Spark Connect Posts&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/GoEddie/spark-connect-blogs/tree/main/3-gRPC&#34;&gt;Code&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;goal-of-this-post&#34;&gt;Goal of this post&lt;/h2&gt;&#xA;&lt;p&gt;In the first two posts, we looked at how to run some Spark code, firstly against a local Spark Connect server and then against a Databricks cluster. In this post, we will look more at the actual gRPC API itself, namely &lt;code&gt;ExecutePlan,&lt;/code&gt; &lt;code&gt;Config&lt;/code&gt;, and &lt;code&gt;AddArtifacts&lt;/code&gt;/&lt;code&gt;ArtifactsStatus.&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;sparkconnectservicesparkconnectserviceclient&#34;&gt;&lt;code&gt;SparkConnectService.SparkConnectServiceClient&lt;/code&gt;&lt;/h3&gt;&#xA;&lt;p&gt;The way we call the API is using the &lt;code&gt;SparkConnectServiceClient&lt;/code&gt;, when we take the .proto files from the Spark &lt;a href=&#34;https://github.com/apache/spark/tree/master/connector/connect/common/src/main/protobuf/spark/connect&#34;&gt;repo&lt;/a&gt;, and we add them to a visual studio with the &lt;code&gt;Protobuf&lt;/code&gt; build action that comes from the &lt;code&gt;Grpc.Tools&lt;/code&gt; NuGet package then the &lt;code&gt;SparkConnectService&lt;/code&gt; is generated as C# code.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using Spark Connect from .NET to run Spark jobs on Databricks</title>
      <link>https://the.agilesql.club/2024/01/using-spark-connect-from-.net-to-run-spark-jobs-on-databricks/</link>
      <pubDate>Tue, 23 Jan 2024 09:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2024/01/using-spark-connect-from-.net-to-run-spark-jobs-on-databricks/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/tags/spark-connect/&#34;&gt;All Spark Connect Posts&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;goal-of-this-post&#34;&gt;Goal of this post&lt;/h2&gt;&#xA;&lt;p&gt;This post aims to show how we can create a .NET application, deploy it to Databricks, and then run a Databricks job that calls our .NET code, which uses Spark Connect to run a Spark job on the Databricks job cluster to write some data out to Azure storage.&lt;/p&gt;&#xA;&lt;p&gt;In the &lt;a href=&#34;https://the.agilesql.club/Blogs/Ed-Elliott/Spark-Connect/Using-Spark-Connect-From-DotNet&#34;&gt;previous post&lt;/a&gt;, I showed how to use the Range command to create a Spark DataFrame and then save it locally as a parquet file. In this post, we will use the Sql command, which will return a DataFrame or, in our world, a Relation. We will then pass that relation to a WriteOperation command, which will write the results of the Sql out to Azure storage.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spark Connect Dotnet First Major Milestone</title>
      <link>https://the.agilesql.club/2024/01/spark-connect-dotnet-first-major-milestone/</link>
      <pubDate>Wed, 17 Jan 2024 09:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2024/01/spark-connect-dotnet-first-major-milestone/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/tags/spark-connect/&#34;&gt;All Spark Connect Posts&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;When I wrote the spark-connect-dotnet lib I didn&amp;rsquo;t envisage that I would implement every function, instead it would be a combination of implementing the most common functionality and showing people how they can make their own gRPC calls to call the rest of the functions but what I found is that actually implementing the functions once I had figured out the shared functionality was pretty easy and by implementing all of the functions I was able to get the supporting functions like collecting data back through arrow working.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using Spark Connect from .NET</title>
      <link>https://the.agilesql.club/2024/01/using-spark-connect-from-.net/</link>
      <pubDate>Wed, 17 Jan 2024 09:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2024/01/using-spark-connect-from-.net/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/tags/spark-connect/&#34;&gt;All Spark Connect Posts&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introductory-ramble&#34;&gt;Introductory Ramble&lt;/h2&gt;&#xA;&lt;h3 id=&#34;spark-connect&#34;&gt;Spark Connect&lt;/h3&gt;&#xA;&lt;p&gt;In July 2022, at the Data and AI summit, Apache Spark announced &amp;ldquo;Spark Connect,&amp;rdquo; which was a way of connecting to Apache Spark using the gRPC protocol rather than using the supplied Java or Python APIs. I&amp;rsquo;ve been using Spark since 2017 and have been completely obsessed with how transformative it has been in the data processing space.&lt;/p&gt;&#xA;&lt;h3 id=&#34;me&#34;&gt;Me&lt;/h3&gt;&#xA;&lt;p&gt;Over the past couple of decades working in IT, I have found a particular interest in protocols. When I was learning how MSSQL worked, I spent a while figuring out how to read data from disk via backups rather than via the database server (MS Tape Format, if anyone cared). I spent more time than anyone should learning how to parse TDS (before the [MS-TDS] documentation was a thing)—having my head buried in a set of network traces and a pencil and pen has given me more pleasure than I can tell you.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spark Connect</title>
      <link>https://the.agilesql.club/spark-connect/</link>
      <pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/spark-connect/</guid>
      <description>&lt;h1 id=&#34;spark-connect&#34;&gt;Spark Connect&lt;/h1&gt;&#xA;&lt;h3 id=&#34;references&#34;&gt;References&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://spark.apache.org/docs/latest/spark-connect-overview.html&#34;&gt;https://spark.apache.org/docs/latest/spark-connect-overview.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.databricks.com/blog/2022/07/07/introducing-spark-connect-the-power-of-apache-spark-everywhere.html&#34;&gt;https://www.databricks.com/blog/2022/07/07/introducing-spark-connect-the-power-of-apache-spark-everywhere.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;reference-implementations&#34;&gt;Reference Implementations&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/sjrusso8/spark-connect-rs&#34;&gt;Rust&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/apache/spark-connect-go&#34;&gt;GOLang&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;source-grpc-proto-files&#34;&gt;Source gRPC proto files&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/apache/spark/tree/master/connector/connect/common/src/main/protobuf/spark/connect&#34;&gt;https://github.com/apache/spark/tree/master/connector/connect/common/src/main/protobuf/spark/connect&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;useful-videos&#34;&gt;Useful Videos&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=vTd3OqDzjuo&#34;&gt;If this doesn&amp;rsquo;t get you excited then nothing will&lt;/a&gt; it is, of course, suitable for work, it is a talk about Spark Connect.&lt;/p&gt;&#xA;&lt;h3 id=&#34;spark-connect-from-net&#34;&gt;Spark Connect From .NET&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/2024/01/using-spark-connect-from-.net/&#34;&gt;https://the.agilesql.club/2024/01/using-spark-connect-from-.net/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/2024/01/using-spark-connect-from-.net-to-run-spark-jobs-on-databricks/&#34;&gt;https://the.agilesql.club/2024/01/using-spark-connect-from-.net-to-run-spark-jobs-on-databricks/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/tags/spark-connect/&#34;&gt;All Spark Connect Posts&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Privacy Policy</title>
      <link>https://the.agilesql.club/privacy/policy/</link>
      <pubDate>Wed, 17 Mar 2021 05:38:00 +0000</pubDate>
      <guid>https://the.agilesql.club/privacy/policy/</guid>
      <description>&lt;h2 id=&#34;the-agile-sql-club-privacy-policy-google-made-me-do-it&#34;&gt;The Agile SQL CLub Privacy Policy (google Made me do it)&lt;/h2&gt;&#xA;&lt;p&gt;The website uses cookies to track views and where you go, if you block cookies then they will be stopped. The reason for tracking is to see which posts are popular and where a really old post is still popular and is out of date I can put a note on it to say so.&lt;/p&gt;&#xA;&lt;p&gt;I collect no information about you.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ADF: Error trying to debug pipeline: BadRequest</title>
      <link>https://the.agilesql.club/2021/03/adf-error-trying-to-debug-pipeline-badrequest/</link>
      <pubDate>Fri, 12 Mar 2021 21:10:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2021/03/adf-error-trying-to-debug-pipeline-badrequest/</guid>
      <description>&lt;p&gt;I made a mistake recently when I was creating an ADF pipeline, annoyingly I made loads of changes and then clicked the debug button, when I pressed debug the pipeline failed to start and I was presented with this little beaut of an error message:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://the.agilesql.club/assets/images/adfdebugfail.png&#34; alt=&#34;Error debugging pipeline&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;The pipeline was quite complicated and so I didn&amp;rsquo;t know exactly what was causing it so I went through the usual ADF troubleshooting steps (save all then refesh the web page) that didn&amp;rsquo;t help. The thought of doing the &amp;ldquo;binary chop&amp;rdquo; on my pipeline was not fun especially as I use a macbook and ctrl+z doesn&amp;rsquo;t undo (nor does cmd+z) annoyingly.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ADF: Querying JSON documents</title>
      <link>https://the.agilesql.club/2021/02/adf-querying-json-documents/</link>
      <pubDate>Fri, 26 Feb 2021 02:10:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2021/02/adf-querying-json-documents/</guid>
      <description>&lt;p&gt;In my previous blog post I talked about how to read from an XML Webervice and use xpath to query the XML on the expressions side of things. You can read the XML article here (&lt;a href=&#34;https://the.agilesql.club/2021/02/adf-xml-objects-and-xpath-in-the-expression-language/)&#34;&gt;https://the.agilesql.club/2021/02/adf-xml-objects-and-xpath-in-the-expression-language/)&lt;/a&gt;. Now, what if we don&amp;rsquo;t have XML but have JSON? Well well indeed, what if there was a way to query JSON documents using a query, imagine if you will a JSONQuery where you can pass a similar query to an xpath query to retrieve specific values from the JSON document. That would be awesome wouldn&amp;rsquo;t it? Well it isn&amp;rsquo;t available here, the is no support fpr JSONQuery in ADF. However, we can create an xml document from a JSON document and then query that, if we are very very careful about how we pass the JSON document to the xml function.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ADF, XML objects and XPath in the expression language</title>
      <link>https://the.agilesql.club/2021/02/adf-xml-objects-and-xpath-in-the-expression-language/</link>
      <pubDate>Fri, 12 Feb 2021 06:30:00 +0100</pubDate>
      <guid>https://the.agilesql.club/2021/02/adf-xml-objects-and-xpath-in-the-expression-language/</guid>
      <description>&lt;p&gt;When you use ADF, there are two sides to the coin. The first is the data itself that ADF does very well, from moving it from one site to another to flattening JSON documents and converting from CSV to Avro, to Parquet, to SQL is powerful. The other side of the coin is how ADF uses data as variables to manage the pipeline, and it is this side of the coin that I wish to talk about today.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Synapse Analytics and .NET for Apache Spark Example 4 - JOINS</title>
      <link>https://the.agilesql.club/2021/01/synapse-analytics-and-.net-for-apache-spark-example-4-joins/</link>
      <pubDate>Mon, 25 Jan 2021 19:10:00 +0100</pubDate>
      <guid>https://the.agilesql.club/2021/01/synapse-analytics-and-.net-for-apache-spark-example-4-joins/</guid>
      <description>&lt;p&gt;This is a bit of a longer one, a look at how to do all the different joins and the exciting thing for MSSQL developers is that we get a couple of extra joins (semi and anti semi oooooooh).&lt;/p&gt;&#xA;&lt;h2 id=&#34;t-sql&#34;&gt;T-SQL&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    chicago.safety_data one &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INNER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;JOIN&lt;/span&gt; chicago.safety_data two &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; one.Address &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; two.Address;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;spark-sql&#34;&gt;Spark SQL&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    chicago.safety_data one &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INNER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;JOIN&lt;/span&gt; chicago.safety_data two &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; one.Address &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; two.Address&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;dataframe-api-c&#34;&gt;DataFrame API (C#)&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; dataFrame = spark.Read().Table(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;chicago.safety_data&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dataFrame.Alias(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;one&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .Join(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    dataFrame.Alias(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;two&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    , Functions.Col(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;one.Address&amp;#34;&lt;/span&gt;) == Functions.Col(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;two.Address&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    , &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;inner&amp;#34;&lt;/span&gt;).Show();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;t-sql-left-outer-join&#34;&gt;T-SQL LEFT OUTER JOIN&lt;/h2&gt;&#xA;&lt;h2 id=&#34;spark-sql-1&#34;&gt;Spark SQL&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ELECT &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    chicago.safety_data one &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;LEFT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;OUTER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;JOIN&lt;/span&gt; chicago.safety_data two &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; one.Address &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; two.Address&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;dataframe-api-c-1&#34;&gt;DataFrame API (C#)&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; dataFrame = spark.Read().Table(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;chicago.safety_data&amp;#34;&lt;/span&gt;);;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dataFrame.Alias(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;one&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .Join(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    dataFrame.Alias(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;two&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    , Functions.Col(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;one.Address&amp;#34;&lt;/span&gt;) == Functions.Col(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;two.Address&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    , &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;left_outer&amp;#34;&lt;/span&gt;).Show();  &lt;span style=&#34;color:#75715e&#34;&gt;//alternative &amp;#34;left&amp;#34; or &amp;#34;leftouter&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;t-sql-right-outer-join&#34;&gt;T-SQL RIGHT OUTER JOIN&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    chicago.safety_data one &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;RIGHT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;OUTER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;JOIN&lt;/span&gt; chicago.safety_data two &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; one.Address &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; two.Address;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;spark-sql-2&#34;&gt;Spark SQL&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    chicago.safety_data one &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;RIGHT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;OUTER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;JOIN&lt;/span&gt; chicago.safety_data two &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; one.Address &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; two.Address&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;dataframe-api-c-2&#34;&gt;DataFrame API (C#)&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; dataFrame = spark.Read().Table(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;chicago.safety_data&amp;#34;&lt;/span&gt;);;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dataFrame.Alias(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;one&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .Join(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    dataFrame.Alias(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;two&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    , Functions.Col(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;one.Address&amp;#34;&lt;/span&gt;) == Functions.Col(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;two.Address&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    , &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;right_outer&amp;#34;&lt;/span&gt;).Show();   &lt;span style=&#34;color:#75715e&#34;&gt;//alternative &amp;#34;right&amp;#34; or &amp;#34;rightouter&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;t-sql-full-outer-join&#34;&gt;T-SQL FULL OUTER JOIN&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    chicago.safety_data one &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;FULL&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;OUTER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;JOIN&lt;/span&gt; chicago.safety_data two &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; one.Address &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; two.Address;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;spark-sql-3&#34;&gt;Spark SQL&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    chicago.safety_data one &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;FULL&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;OUTER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;JOIN&lt;/span&gt; chicago.safety_data two &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; one.Address &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; two.Address&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;dataframe-api-c-3&#34;&gt;DataFrame API (C#)&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; dataFrame = spark.Read().Table(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;chicago.safety_data&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dataFrame.Alias(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;one&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .Join(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    dataFrame.Alias(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;two&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    , Functions.Col(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;one.Address&amp;#34;&lt;/span&gt;) == Functions.Col(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;two.Address&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    , &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;full_outer&amp;#34;&lt;/span&gt;).Show(); &lt;span style=&#34;color:#75715e&#34;&gt;//alternative &amp;#34;outer&amp;#34; or &amp;#34;fullouter&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;t-sql-cross-join&#34;&gt;T-SQL CROSS JOIN&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    chicago.safety_data one &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CROSS&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;JOIN&lt;/span&gt; chicago.safety_data two;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;spark-sql-4&#34;&gt;Spark SQL&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    chicago.safety_data one &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CROSS&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;JOIN&lt;/span&gt; chicago.safety_data&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;dataframe-api-c-4&#34;&gt;DataFrame API (C#)&lt;/h2&gt;&#xA;&lt;p&gt;Note that we must use &lt;code&gt;CrossJoin&lt;/code&gt; rather than &lt;code&gt;Join&lt;/code&gt; when we don&amp;rsquo;t pass in a list of columns to join on.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Synapse Analytics and .NET for Apache Spark Example 3 - CTE()</title>
      <link>https://the.agilesql.club/2021/01/synapse-analytics-and-.net-for-apache-spark-example-3-cte/</link>
      <pubDate>Tue, 19 Jan 2021 17:10:00 +0100</pubDate>
      <guid>https://the.agilesql.club/2021/01/synapse-analytics-and-.net-for-apache-spark-example-3-cte/</guid>
      <description>&lt;p&gt;The next example is how to do a CTE (Common Table Expression). When creating the CTE I will also rename one of the columns from &amp;ldquo;dataType&amp;rdquo; to &amp;ldquo;x&amp;rdquo;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;t-sql&#34;&gt;T-SQL&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;WITH&lt;/span&gt; CTE(x, dataType, dataSubType)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; dateTime, dataType, dataSubType &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; chicago.safety_data&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; CTE;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;spark-sql&#34;&gt;Spark SQL&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;WITH&lt;/span&gt; CTE &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; dateTime &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; x, dataType, dataSubType &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; chicago.safety_data)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; CTE&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;dataframe-api-c&#34;&gt;DataFrame API (C#)&lt;/h2&gt;&#xA;&lt;p&gt;The DataFrame example is a bit odd - by creating a data frame with the first query we have the CTE that we can use:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Synapse Analytics and .NET for Apache Spark Example 2 - ROW_NUMBER()</title>
      <link>https://the.agilesql.club/2021/01/synapse-analytics-and-.net-for-apache-spark-example-2-row_number/</link>
      <pubDate>Mon, 18 Jan 2021 21:10:00 +0100</pubDate>
      <guid>https://the.agilesql.club/2021/01/synapse-analytics-and-.net-for-apache-spark-example-2-row_number/</guid>
      <description>&lt;p&gt;The next example is how to do a ROW_NUMBER(), my favourite window function.&lt;/p&gt;&#xA;&lt;h2 id=&#34;t-sql&#34;&gt;T-SQL&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;, ROW_NUMBER() OVER(&lt;span style=&#34;color:#66d9ef&#34;&gt;ORDER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;BY&lt;/span&gt; dateTime)  &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; RowNumber&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    chicago.safety_data&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;spark-sql&#34;&gt;Spark SQL&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;, ROW_NUMBER() OVER(&lt;span style=&#34;color:#66d9ef&#34;&gt;ORDER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;BY&lt;/span&gt; dateTime)  &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; RowNumber&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    chicago.safety_data&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;dataframe-api-c&#34;&gt;DataFrame API (C#)&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; dataFrame = spark.Read().Table(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;chicago.safety_data&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; window = Microsoft.Spark.Sql.Expressions.Window.OrderBy(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dateTime&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dataFrame = dataFrame.WithColumn(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;RowNumber&amp;#34;&lt;/span&gt;, Functions.RowNumber().Over(window));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dataFrame.Show();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To see this in action, please feel free to deploy this repo to your Synapse Analytics repo:&#xA;&lt;a href=&#34;https://github.com/GoEddie/SynapseSparkExamples&#34;&gt;https://github.com/GoEddie/SynapseSparkExamples&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Synapse Analytics and .NET for Apache Spark Example 1 - Group By</title>
      <link>https://the.agilesql.club/2021/01/synapse-analytics-and-.net-for-apache-spark-example-1-group-by/</link>
      <pubDate>Mon, 18 Jan 2021 20:10:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2021/01/synapse-analytics-and-.net-for-apache-spark-example-1-group-by/</guid>
      <description>&lt;p&gt;I have been playing around with the new Azure Synapse Analytics, and I realised that this is an excellent opportunity for people to move to Apache Spark. Synapse Analytics ships with .NET for Apache Spark C# support many people will surely try to convert T-SQL code or SSIS code into Apache Spark code. I thought it would be awesome if there were a set of examples of how to do something in T-SQL, then translated into how to do that same thing in Spark SQL and the Spark DataFrame API in C#.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to get data in a DataFrame via .NET for Apache Spark</title>
      <link>https://the.agilesql.club/2021/01/how-to-get-data-in-a-dataframe-via-.net-for-apache-spark/</link>
      <pubDate>Sun, 17 Jan 2021 20:10:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2021/01/how-to-get-data-in-a-dataframe-via-.net-for-apache-spark/</guid>
      <description>&lt;p&gt;When I first started working with Apache Spark, one of the things I struggled with was that I would have some variable or data in my code that I wanted to work on with Apache Spark. To get the data in a state that Apache Spark can process it involves putting the data into a DataFrame. How do you take some data and get it into a DataFrame?&lt;/p&gt;&#xA;&lt;p&gt;This post will cover all the ways to get data into a DataFrame in .NET for Apache Spark.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Git in 10 commands to do 99% of gitting and keeping out of trouble</title>
      <link>https://the.agilesql.club/2021/01/git-in-10-commands-to-do-99-of-gitting-and-keeping-out-of-trouble/</link>
      <pubDate>Tue, 12 Jan 2021 19:10:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2021/01/git-in-10-commands-to-do-99-of-gitting-and-keeping-out-of-trouble/</guid>
      <description>&lt;p&gt;Git is hard, probably harder than it needs to be but I have been using it for about 5 years and have a workflow that works for me. I use git from a command line and have learnt how to use these ten commands. If I need to deal with a merge conflict, I use VS Code and the gitlens extension. If I need to do anything else then I probably copy out the files I want to keep, reset my local repo or delete it and clone a new repo then paste back the files I want to include in the change.&lt;/p&gt;</description>
    </item>
    <item>
      <title>TF-IDF in .NET for Apache Spark Using Spark ML v2</title>
      <link>https://the.agilesql.club/2020/12/tf-idf-in-.net-for-apache-spark-using-spark-ml-v2/</link>
      <pubDate>Sat, 19 Dec 2020 17:10:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2020/12/tf-idf-in-.net-for-apache-spark-using-spark-ml-v2/</guid>
      <description>&lt;h1 id=&#34;spark-ml-in-net-for-apache-spark&#34;&gt;Spark ML in .NET for Apache Spark&lt;/h1&gt;&#xA;&lt;p&gt;Apache Spark has had a machine learning API for quite some time and this has been partially implemented in .NET for Apache Spark.&lt;/p&gt;&#xA;&lt;p&gt;In this post we will look at how we can use the Apache Spark ML API from .NET. This is the second version of this post, the first version was written before version 1 of .NET for Apache Spark and there was a vital piece of the implementation missing which meant although we could build the model in .NET, we couldn&amp;rsquo;t actually use it. The necessary functionality is now available and so I am updating the post. To see the previous version go to: &lt;a href=&#34;https://the.agilesql.club/2020/07/tf-idf-in-.net-for-apache-spark-using-spark-ml/&#34;&gt;https://the.agilesql.club/2020/07/tf-idf-in-.net-for-apache-spark-using-spark-ml/&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Blog .NET for Apache Spark UDFs Missing Shared State</title>
      <link>https://the.agilesql.club/2020/10/blog-.net-for-apache-spark-udfs-missing-shared-state/</link>
      <pubDate>Thu, 29 Oct 2020 19:10:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2020/10/blog-.net-for-apache-spark-udfs-missing-shared-state/</guid>
      <description>&lt;h2 id=&#34;the-problem&#34;&gt;The Problem&lt;/h2&gt;&#xA;&lt;p&gt;When you use a UDF in .NET for Apache Spark, something like this code:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Program&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; Main(&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;[] args)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; spark = SparkSession.Builder().GetOrCreate();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        _logging.AppendLine(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Starting Select&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; udf = Functions.Udf&amp;lt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;&amp;gt;(theUdf);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        spark.Range(&lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;).Select(udf(Functions.Col(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;))).Show();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        _logging.AppendLine(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ending Select&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Console.WriteLine(_logging.ToString());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;readonly&lt;/span&gt; StringBuilder _logging = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; StringBuilder();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; theUdf(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; val)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        _logging.AppendLine(&lt;span style=&#34;color:#e6db74&#34;&gt;$&amp;#34;udf passed: {val}&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;$&amp;#34;udf passed {val}&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Generally, knowing .NET we would expect the following output:&lt;/p&gt;</description>
    </item>
    <item>
      <title>TF-IDF in .NET for Apache Spark Using Spark ML</title>
      <link>https://the.agilesql.club/2020/07/tf-idf-in-.net-for-apache-spark-using-spark-ml/</link>
      <pubDate>Tue, 07 Jul 2020 17:10:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2020/07/tf-idf-in-.net-for-apache-spark-using-spark-ml/</guid>
      <description>&lt;p&gt;Last Updated: 2020-10-18&lt;/p&gt;&#xA;&lt;p&gt;NOTE: What you read here was before .NET for Apache Spark 1.0 which includes everything we need to do this purely in .NET - in this post you will see an example that is no longer necessary for TF-IDF, instead view: &lt;a href=&#34;https://the.agilesql.club/2020/12/spark-dotnet-tf-idf&#34;&gt;https://the.agilesql.club/2020/12/spark-dotnet-tf-idf&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h1 id=&#34;spark-ml-in-net-for-apache-spark&#34;&gt;Spark ML in .NET for Apache Spark&lt;/h1&gt;&#xA;&lt;p&gt;Spark is awesome, .NET is awesome, machine learning (ML) is awesome, so what could be better than using .NET to write ML code in Spark?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Approaches to running Databricks ETL code from Azure ADF</title>
      <link>https://the.agilesql.club/2020/06/approaches-to-running-databricks-etl-code-from-azure-adf/</link>
      <pubDate>Wed, 03 Jun 2020 20:29:20 +0000</pubDate>
      <guid>https://the.agilesql.club/2020/06/approaches-to-running-databricks-etl-code-from-azure-adf/</guid>
      <description>&lt;p&gt;Databricks is fantastic, but there is a small issue with how people use it. The problem is that Databricks is all things to all people. Data scientists and data analysts use Databricks to explore their data and write cool things. ML engineers use it to get their models to execute somewhere. Meanwhile, the cool kids (data engineers obviously) use it to run their ETL code. Some use cases favour instant access to &amp;ldquo;all the datas&amp;rdquo;, some favour rigorous engineering discipline so when we look at Databricks it is a case of one size does not fit all.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The four tenets of ETL testing</title>
      <link>https://the.agilesql.club/2020/03/the-four-tenets-of-etl-testing/</link>
      <pubDate>Fri, 06 Mar 2020 20:29:20 +0000</pubDate>
      <guid>https://the.agilesql.club/2020/03/the-four-tenets-of-etl-testing/</guid>
      <description>&lt;p&gt;Every ETL pipeline is only ever as reliable as the data that the upstream system provides. It is inevitable that assumptions you make about the data you are provided will be shattered and there is absolutely nothing you can do about it.&lt;/p&gt;&#xA;&lt;p&gt;So what can we do? Do we just accept that our pipelines will break and fix them when the CEO shouts that the figures are out or even worse if no one notices and the data is wrong for months or years? No, of course we don&amp;rsquo;t! What we do us use testing to help us.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Passing status messages and results back from Databricks to ADF</title>
      <link>https://the.agilesql.club/2020/02/passing-status-messages-and-results-back-from-databricks-to-adf/</link>
      <pubDate>Wed, 05 Feb 2020 20:45:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2020/02/passing-status-messages-and-results-back-from-databricks-to-adf/</guid>
      <description>&lt;p&gt;When we use ADF to call Databricks we can pass parameters, nice. When we finish running the Databricks notebook we often want to return something back to ADF so ADF can do something with it. Think that Databricks might create a file with 100 rows in (actually big data 1,000 rows) and we then might want to move that file or write a log entry to say that 1,000 rows have been written.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spark Delta Lake, Updates, Deletes and Time Travel</title>
      <link>https://the.agilesql.club/2020/01/spark-delta-lake-updates-deletes-and-time-travel/</link>
      <pubDate>Mon, 20 Jan 2020 20:45:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2020/01/spark-delta-lake-updates-deletes-and-time-travel/</guid>
      <description>&lt;p&gt;When you use delta lake there are a couple of interesting things to note based around the fact that the data is stored in parquet files which are read-only and delta lake includes the ability to delete and update data and view the state of a table at a specific point in time. Obviously read-only and updates and deletes don&amp;rsquo;t exactly sound like they work together, so how does it all work and what do we need to be aware of?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Validating upstream data quality in ETL processes, SQL edition</title>
      <link>https://the.agilesql.club/2019/10/validating-upstream-data-quality-in-etl-processes-sql-edition/</link>
      <pubDate>Mon, 28 Oct 2019 14:29:20 +0000</pubDate>
      <guid>https://the.agilesql.club/2019/10/validating-upstream-data-quality-in-etl-processes-sql-edition/</guid>
      <description>&lt;h2 id=&#34;it-is-a-non-null-constraint-not-a-non-ish-null-constraint&#34;&gt;It is a non-null constraint, not a non-ish-null constraint&lt;/h2&gt;&#xA;&lt;p&gt;You are writing an ETL process, part of this process you need to import a semi-structured file (think CSV, JSON, XM-bleurgh-L, etc.) when you import the data into an RDBMS you get all sorts of things that make schema designers excited like unique constraints and check constraints. The problem is that the file you are importing is from another system and all &amp;ldquo;other&amp;rdquo; systems in the world make mistakes and changes and send you duff data that won&amp;rsquo;t work with your lovely constraints. The problem we have is that RDBMS&amp;rsquo;s apply to entire column at one time. This columnar approach to constraints means that, although you might have nine hundred and ninety nine thousand rows that will pass the constraints, if you have even one, single solitary, row that fails then the whole constraint fails. It is a non-null constraint, not a non-ish-null constraint&lt;/p&gt;</description>
    </item>
    <item>
      <title>SQLCover 0.5 - Fixes, smaller features and an exciting surprise</title>
      <link>https://the.agilesql.club/2019/10/sqlcover-0.5-fixes-smaller-features-and-an-exciting-surprise/</link>
      <pubDate>Wed, 16 Oct 2019 19:21:20 +0000</pubDate>
      <guid>https://the.agilesql.club/2019/10/sqlcover-0.5-fixes-smaller-features-and-an-exciting-surprise/</guid>
      <description>&lt;p&gt;It has been a little while but I have updated SQLCover to include a number of fixes and small features, the majority of which are improvements to the html output:&lt;/p&gt;&#xA;&lt;p&gt;For full details and to download the latest version see:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/GoEddie/SQLCover/releases/tag/0.5.0&#34;&gt;https://github.com/GoEddie/SQLCover/releases/tag/0.5.0&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;or&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.nuget.org/packages/GOEddie.SQLCover/0.5.0&#34;&gt;https://www.nuget.org/packages/GOEddie.SQLCover/0.5.0&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you get any issues please comment below or raise an issue on github.&lt;/p&gt;&#xA;&lt;h2 id=&#34;highlights&#34;&gt;Highlights&lt;/h2&gt;&#xA;&lt;h3 id=&#34;cobertura&#34;&gt;Cobertura&lt;/h3&gt;&#xA;&lt;p&gt;Cobertura is a format for code coverage tools, Azure DevOps supports cobertura files to display code coverage results alongside the build so this is a really nice thing to be able to have, if you use SQLCover in your Azure DevOps builds (or any ci server that supports Cobertura files) then you can use the Cobertura output to generate this:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to test ETL Processes in production</title>
      <link>https://the.agilesql.club/2019/10/how-to-test-etl-processes-in-production/</link>
      <pubDate>Wed, 02 Oct 2019 03:29:20 +0000</pubDate>
      <guid>https://the.agilesql.club/2019/10/how-to-test-etl-processes-in-production/</guid>
      <description>&lt;p&gt;This is the final part in the four-part series into testing ETL pipelines, how exciting!&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Part 1 - Unit Testing &lt;a href=&#34;https://the.agilesql.club/2019/07/how-do-we-test-etl-pipelines-part-one-unit-tests/&#34;&gt;https://the.agilesql.club/2019/07/how-do-we-test-etl-pipelines-part-one-unit-tests/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Part 2 - Integration Testing &lt;a href=&#34;https://the.agilesql.club/2019/08/how-do-we-prove-our-etl-processes-are-correct-how-do-we-make-sure-upstream-changes-dont-break-our-processes-and-break-our-beautiful-data/&#34;&gt;https://the.agilesql.club/2019/08/how-do-we-prove-our-etl-processes-are-correct-how-do-we-make-sure-upstream-changes-dont-break-our-processes-and-break-our-beautiful-data/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Part 3 - Validating the upstream data &lt;a href=&#34;https://the.agilesql.club/2019/09/how-do-test-the-upstream-data-is-good-in-an-etl-process-etl-testing-part-3/&#34;&gt;https://the.agilesql.club/2019/09/how-do-test-the-upstream-data-is-good-in-an-etl-process-etl-testing-part-3/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;This final part is the last step, you have documented your business logic with unit tests, you have validated your pipeline with sample data (good and bad data), you have a step in your pipeline to ensure the upstream data meets your expectations and you have deployed the code to production where, AND ONLY where, you can be confident the code works. Now you have code in production you need to do the final type of testing, &amp;ldquo;testing in production&amp;rdquo;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to connect spark to ms sql server without &#39;[Error] [JvmBridge] java.sql.SQLException: No suitable driver&#39;?</title>
      <link>https://the.agilesql.club/2019/10/how-to-connect-spark-to-ms-sql-server-without-error-jvmbridge-java.sql.sqlexception-no-suitable-driver/</link>
      <pubDate>Tue, 01 Oct 2019 03:29:20 +0000</pubDate>
      <guid>https://the.agilesql.club/2019/10/how-to-connect-spark-to-ms-sql-server-without-error-jvmbridge-java.sql.sqlexception-no-suitable-driver/</guid>
      <description>&lt;p&gt;&amp;ldquo;[Error] [JvmBridge] java.sql.SQLException: No suitable driver&amp;rdquo; - unable to connect spark to Microsoft SQL Server.&lt;/p&gt;&#xA;&lt;p&gt;In spark when you want to connect to a database you use &lt;code&gt;Read()&lt;/code&gt; passing in the format &amp;ldquo;jdbc&amp;rdquo; and include the options of url, driver and either dbtable or query.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DataFrame dataFrame = spark.Read()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.Format(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;jdbc&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.Option(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;jdbc:sqlserver://localhost;databaseName=dName;&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.Option(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;user_name&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.Option(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;password&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;password or secret&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.Option(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;driver&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;com.microsoft.sqlserver.jdbc.SQLServerDriver&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.Option(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dbtable&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;schema.table_name&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.Load();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The url tells jdbc that we want to connect to sqlserver (jdbc:sqlserver) and then the details of the server to connect to. For spark to be able to find a driver for &amp;ldquo;sqlserver&amp;rdquo; you need to do two things, firstly you need to pass the jar to the driver to spark and secondly pass in the name of the driver that can implement a connection to &amp;ldquo;sqlserver&amp;rdquo;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How do test the upstream data is good in an etl process (etl testing part 3)?</title>
      <link>https://the.agilesql.club/2019/09/how-do-test-the-upstream-data-is-good-in-an-etl-process-etl-testing-part-3/</link>
      <pubDate>Mon, 30 Sep 2019 15:21:20 +0000</pubDate>
      <guid>https://the.agilesql.club/2019/09/how-do-test-the-upstream-data-is-good-in-an-etl-process-etl-testing-part-3/</guid>
      <description>&lt;p&gt;In the first two parts of this series (&lt;a href=&#34;https://the.agilesql.club/2019/07/how-do-we-test-etl-pipelines-part-one-unit-tests/&#34;&gt;https://the.agilesql.club/2019/07/how-do-we-test-etl-pipelines-part-one-unit-tests/&lt;/a&gt; and &lt;a href=&#34;https://the.agilesql.club/2019/08/how-do-we-prove-our-etl-processes-are-correct-how-do-we-make-sure-upstream-changes-dont-break-our-processes-and-break-our-beautiful-data/)&#34;&gt;https://the.agilesql.club/2019/08/how-do-we-prove-our-etl-processes-are-correct-how-do-we-make-sure-upstream-changes-dont-break-our-processes-and-break-our-beautiful-data/)&lt;/a&gt;, I talked about how to unit test your business logic and integration test your ETL infrastructure code. Having these tests ensures that your code is in order, it means you have documented, and future-proofed your code which is a fantastic thing to have. What testing our code doesn&amp;rsquo;t give us is a way to validate the data we receive is correct.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Visual Studio tSQLt Test Adapter</title>
      <link>https://the.agilesql.club/2019/09/visual-studio-tsqlt-test-adapter/</link>
      <pubDate>Mon, 02 Sep 2019 06:29:20 +0000</pubDate>
      <guid>https://the.agilesql.club/2019/09/visual-studio-tsqlt-test-adapter/</guid>
      <description>&lt;p&gt;I finally got around to updating the tSQLt test adapter for visual studio, you can download it from:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=vs-publisher-263684.GoEddietSQLt2019&#34;&gt;https://marketplace.visualstudio.com/items?itemName=vs-publisher-263684.GoEddietSQLt2019&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;or the search in visual studio extensions thingy finds it as well.&lt;/p&gt;&#xA;&lt;p&gt;For details on what this is and how it works see the original post:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/2016/08/tsqlt-visual-studio-test-adapter/&#34;&gt;https://the.agilesql.club/2016/08/tsqlt-visual-studio-test-adapter/&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Help! My Apache Spark configuration on windows isn&#39;t working (I think)</title>
      <link>https://the.agilesql.club/2019/08/help-my-apache-spark-configuration-on-windows-isnt-working-i-think/</link>
      <pubDate>Thu, 29 Aug 2019 05:45:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2019/08/help-my-apache-spark-configuration-on-windows-isnt-working-i-think/</guid>
      <description>&lt;h2 id=&#34;steps-needed&#34;&gt;Steps needed&lt;/h2&gt;&#xA;&lt;p&gt;Getting Apache Spark running on windows involves:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Installing a JRE 8 (Java 1.8/OpenJDK 8)&lt;/li&gt;&#xA;&lt;li&gt;Downloading and extracting SPARK and setting SPARK_HOME&lt;/li&gt;&#xA;&lt;li&gt;Downloading winutils.exe and setting HADOOP_HOME&lt;/li&gt;&#xA;&lt;li&gt;If using the dotnet driver also downloading the Microsoft.Spark.Worker and setting DOTNET_WORKER_DIR if you are going to use UDF&amp;rsquo;s&lt;/li&gt;&#xA;&lt;li&gt;Making sure java and %SPARK_HOME%\bin are on your path&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;There are some pretty common mistakes people make (myself included!), most common I have seen recently have been having a semi-colon in JAVA_HOME/SPARK_HOME/HADOOP_HOME or having HADOOP_HOME not point to a directory with a bin folder which contains winutils.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How do you debug your spark-dotnet app in visual studio?</title>
      <link>https://the.agilesql.club/2019/08/how-do-you-debug-your-spark-dotnet-app-in-visual-studio/</link>
      <pubDate>Tue, 20 Aug 2019 14:29:20 +0000</pubDate>
      <guid>https://the.agilesql.club/2019/08/how-do-you-debug-your-spark-dotnet-app-in-visual-studio/</guid>
      <description>&lt;p&gt;When you run an application using spark-dotnet, to launch the application you need to use &lt;code&gt;spark-submit&lt;/code&gt; to start a java virtual machine which starts the spark-dotnet driver which then runs your program so that leaves us a problem, how to write our programs in visual studio and press f5 to debug?&lt;/p&gt;&#xA;&lt;p&gt;There are two approaches, one I have used for years with dotnet when I want to debug something that is challenging to get a debugger attached - think apps which spawn other processes and they fail in the startup routine. You can add a &lt;code&gt;Debugger.Launch()&lt;/code&gt; to your program then when spark executes it, a prompt will be displayed and you can attach Visual Studio to your program. (as an aside I used to do this manually a lot by writing an &lt;code&gt;__asm int 3&lt;/code&gt;  into an app to get it to break at an appropriate point, great memories but we don&amp;rsquo;t need to do that anymore luckily :).&lt;/p&gt;</description>
    </item>
    <item>
      <title>How do we prove our ETL processes are correct? How do we make sure upstream changes don&#39;t break our processes and break our beautiful data?</title>
      <link>https://the.agilesql.club/2019/08/how-do-we-prove-our-etl-processes-are-correct-how-do-we-make-sure-upstream-changes-dont-break-our-processes-and-break-our-beautiful-data/</link>
      <pubDate>Tue, 13 Aug 2019 05:45:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2019/08/how-do-we-prove-our-etl-processes-are-correct-how-do-we-make-sure-upstream-changes-dont-break-our-processes-and-break-our-beautiful-data/</guid>
      <description>&lt;p&gt;ETL Testing Part 2 - Operational Data Testing&lt;/p&gt;&#xA;&lt;p&gt;This is the second part of a series on ETL testing, the first part explained about unit testing, and in this part, we will talk about how we can prove the correctness of the actual data, both today and in the future after every ETL run.&lt;/p&gt;&#xA;&lt;p&gt;Testing ETL processes is a multi-layered beast, we need to understand the different types of test, what they do for us, and how to actually implement them. The tests we are talking about here are data tests or operational testing, we are going to actually look at the real data that was produced by an ETL run and see whether the data is as we expect it to be.&lt;/p&gt;</description>
    </item>
    <item>
      <title>spark-dotnet how to manually break a file into rows and columns</title>
      <link>https://the.agilesql.club/2019/08/spark-dotnet-how-to-manually-break-a-file-into-rows-and-columns/</link>
      <pubDate>Tue, 06 Aug 2019 05:45:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2019/08/spark-dotnet-how-to-manually-break-a-file-into-rows-and-columns/</guid>
      <description>&lt;p&gt;I found this question on stack overflow that went something like this:&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;I have a file that includes line endings in the wrong place and I need to parse the text manually into rows&amp;rdquo; (&lt;a href=&#34;https://stackoverflow.com/questions/57294619/read-a-textfile-of-fixed-length-with-newline-as-one-of-attribute-value-into-a-ja/57317527)&#34;&gt;https://stackoverflow.com/questions/57294619/read-a-textfile-of-fixed-length-with-newline-as-one-of-attribute-value-into-a-ja/57317527)&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I thought it would be interesting to implement this with what we have available today in spark-dotnet. The thing is though that even though this is possible in spark-dotnet or the other versions of spark, I would pre-process the file in something else and by the time spark reads the file have it already in a suitable format. On that note, lets look at the problem.&lt;/p&gt;</description>
    </item>
    <item>
      <title>java.lang.ClassNotFoundException: org.apache.spark.deploy.DotnetRunner with 0.4.0 of spark-dotnet</title>
      <link>https://the.agilesql.club/2019/08/java.lang.classnotfoundexception-org.apache.spark.deploy.dotnetrunner-with-0.4.0-of-spark-dotnet/</link>
      <pubDate>Fri, 02 Aug 2019 05:45:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2019/08/java.lang.classnotfoundexception-org.apache.spark.deploy.dotnetrunner-with-0.4.0-of-spark-dotnet/</guid>
      <description>&lt;p&gt;There was a breaking change with version 0.4.0 that changed the name of the class that is used to load the dotnet driver in Apache Spark.&lt;/p&gt;&#xA;&lt;p&gt;To fix the issue you need to use the new package name which adds an extra dotnet near the end, change:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;spark-submit --class org.apache.spark.deploy.DotnetRunner&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;into:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;spark-submit --class org.apache.spark.deploy.dotnet.DotnetRunner&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;what-if-i-have-this-error-but-that-doesnt-fix-it&#34;&gt;What if I have this error but that doesn&amp;rsquo;t fix it?&lt;/h2&gt;&#xA;&lt;p&gt;When you run a spark app using spark-submit and you get a ClassNotFoundException for the driver then it boils down to either making a typo or something on your system blocking the jar from being loaded (anti-virus?).&lt;/p&gt;</description>
    </item>
    <item>
      <title>How do we test ETL pipelines? Part one unit tests</title>
      <link>https://the.agilesql.club/2019/07/how-do-we-test-etl-pipelines-part-one-unit-tests/</link>
      <pubDate>Thu, 25 Jul 2019 04:45:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2019/07/how-do-we-test-etl-pipelines-part-one-unit-tests/</guid>
      <description>&lt;h2 id=&#34;why-do-we-bother-testing&#34;&gt;Why do we bother testing?&lt;/h2&gt;&#xA;&lt;p&gt;Testing isn’t an easy thing to define, we all know we should do it, when something goes wrong in production people shout and ask where the tests were, hell even auditors like to see evidence of tests (whether or not they are good isn&amp;rsquo;t generally part of an audit)&#xA;. What do we test, how and why do we even write tests? It is all well and good saying “write unit tests and integration tests” but what do we test? We are writing ETL pipelines, the people who run the source system can’t even tell us if the files are in CSV, JSON, or double-dutch – they certainly don’t have a schema that persists more than ten minutes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>spark-dotnet examples - reading and writing csv files</title>
      <link>https://the.agilesql.club/2019/07/spark-dotnet-examples-reading-and-writing-csv-files/</link>
      <pubDate>Mon, 15 Jul 2019 04:45:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2019/07/spark-dotnet-examples-reading-and-writing-csv-files/</guid>
      <description>&lt;p&gt;How do you read and write CSV files using the dotnet driver for Apache Spark?&lt;/p&gt;&#xA;&lt;p&gt;I have a runnable example here:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/GoEddie/dotnet-spark-examples&#34;&gt;https://github.com/GoEddie/dotnet-spark-examples&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Specifcally:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/GoEddie/dotnet-spark-examples/tree/master/examples/split-csv&#34;&gt;https://github.com/GoEddie/dotnet-spark-examples/tree/master/examples/split-csv&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s take a walkthrough of the demo:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Console.WriteLine(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hello Spark!&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; spark = SparkSession&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .Builder()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .GetOrCreate();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We start with the obligatory &amp;ldquo;Hello World!&amp;rdquo;, then we create a new SparkSession.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;//Read a single CSV file&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; source = spark&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            .Read()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            .Option(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;header&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            .Option(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;inferShchema&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            .Option(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ignoreLeadingWhiteSpace&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            .Option(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ignoreTrailingWhiteSpace&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            .Csv(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;./source.csv&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here we read a csv file, the first line of the file contains the column names so we set the option “header” to true. We want to take a guess at the schema so use the option inferSchema. Because the csv has been written with lots of whitespace like &amp;ldquo;col1, col2&amp;rdquo; - if we didn&amp;rsquo;t ignore leading whitespace our second column would be called &amp;quot; col2&amp;quot; which isn&amp;rsquo;t ideal.&lt;/p&gt;</description>
    </item>
    <item>
      <title>spark-dotnet how does user .net code run spark code in a java vm</title>
      <link>https://the.agilesql.club/2019/07/spark-dotnet-how-does-user-.net-code-run-spark-code-in-a-java-vm/</link>
      <pubDate>Sun, 14 Jul 2019 04:45:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2019/07/spark-dotnet-how-does-user-.net-code-run-spark-code-in-a-java-vm/</guid>
      <description>&lt;p&gt;Apache Spark is written in scala, scala compiles to Java and runs inside a Java virtual machine. The spark-dotnet driver runs dotnet code and calls spark functionality, so how does that work?&lt;/p&gt;&#xA;&lt;p&gt;There are two paths to run dotnet code with spark, the first is the general case which I will describe here, the second is UDF&amp;rsquo;s which I will explain in a later post as it is slightly more involved.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spark and dotnet in a single docker container</title>
      <link>https://the.agilesql.club/2019/07/spark-and-dotnet-in-a-single-docker-container/</link>
      <pubDate>Thu, 11 Jul 2019 04:45:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2019/07/spark-and-dotnet-in-a-single-docker-container/</guid>
      <description>&lt;p&gt;I really like the new dotnet driver for Spark because I think it makes spark more accesable to devs who might not know pythpn or scala.&lt;/p&gt;&#xA;&lt;p&gt;If you want to be able to build and run a dotnet application using the dotnet driver to run locally you will need:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;jre&lt;/li&gt;&#xA;&lt;li&gt;Spark&lt;/li&gt;&#xA;&lt;li&gt;dotnet sdk&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Now the JRE has some docker images and so does the dotnet sdk, but what if you want both in a single container? The simplest way to get this setup is to use both dotnet core image and jre images and create a multi-stage dockerfile. For a working example see:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Where do you do your database development? Hopefully not production</title>
      <link>https://the.agilesql.club/2019/07/where-do-you-do-your-database-development-hopefully-not-production/</link>
      <pubDate>Fri, 05 Jul 2019 05:45:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2019/07/where-do-you-do-your-database-development-hopefully-not-production/</guid>
      <description>&lt;p&gt;Here are three scenarios, if you work with SQL Server either as a provider of database environments (DBA) or a consumer of database environments for your application (developer) then you will likely see yourself in one of these descriptions. If you don&amp;rsquo;t please 100% find some way to tell me (email, comment below etc.)&lt;/p&gt;&#xA;&lt;p&gt;Prod FTW&amp;rsquo;ers – There is only one place where the developers can develop. DBA&amp;rsquo;s (if you have one) complain every so often about someone using &amp;ldquo;sa&amp;rdquo; on production, whoever is using the &amp;ldquo;sa&amp;rdquo; account, keeps leaving open transactions in SSMS blocking all the users. Sometimes developers delete the wrong thing, it happens less now that they generally use a tool that warns if the where clause is missing from an update or a delete. Hopefully, not too many identify with this scenario today (past sins have already been forgiven).&lt;/p&gt;</description>
    </item>
    <item>
      <title>As a DBA, how do I offload some of my work?</title>
      <link>https://the.agilesql.club/2019/06/as-a-dba-how-do-i-offload-some-of-my-work/</link>
      <pubDate>Thu, 13 Jun 2019 05:45:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2019/06/as-a-dba-how-do-i-offload-some-of-my-work/</guid>
      <description>&lt;h2 id=&#34;i-dont-have-time-for-this&#34;&gt;I don&amp;rsquo;t have time for this&lt;/h2&gt;&#xA;&lt;p&gt;&amp;ldquo;I am a DBA, I am busy, too busy. Developers keep pushing changes to production without me reviewing the code, and now I am stuck again, over the weekend fixing performance issues while the developers are on the beach with a pina colada and a cigar&amp;rdquo; Sound familiar? Maybe the developers aren&amp;rsquo;t on the beach drinking and smoking, but the sentiment is the same:&lt;/p&gt;</description>
    </item>
    <item>
      <title>What is the key to automated database deployments?</title>
      <link>https://the.agilesql.club/2019/06/what-is-the-key-to-automated-database-deployments/</link>
      <pubDate>Tue, 11 Jun 2019 06:45:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2019/06/what-is-the-key-to-automated-database-deployments/</guid>
      <description>&lt;p&gt;In my blog post here &lt;a href=&#34;https://the.agilesql.club/2019/06/what-steps-are-there-to-move-to-safe-automated-database-deployments/&#34;&gt;https://the.agilesql.club/2019/06/what-steps-are-there-to-move-to-safe-automated-database-deployments/&lt;/a&gt; I described the steps you need to go through so you can build up your confidence that you are capable of deploying databases using automation. I mean, afterall, knowing that it is possible to automate your deployments and having confidence that they will succeed are two very different things.&lt;/p&gt;&#xA;&lt;p&gt;Even with the best tooling in the world, automated database deployments are still a struggle and there is one key thing that you can do, no matter what tools you choose and that is to make the deployments re-runnable. (Insert discussion here on the word idempotent and how it means re-runnable but sounds far cooler and intellectual). If you make your deployments re-runnable then you can, by their very definiton, re-run them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What steps are there to move to safe automated database deployments?</title>
      <link>https://the.agilesql.club/2019/06/what-steps-are-there-to-move-to-safe-automated-database-deployments/</link>
      <pubDate>Mon, 10 Jun 2019 06:45:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2019/06/what-steps-are-there-to-move-to-safe-automated-database-deployments/</guid>
      <description>&lt;p&gt;Database deployments are scary, you have all this data and if you drop the wrong table, run the wrong delete statement or have an error in a stored procedure that forgets to write that critical piece of data then you may never truly recover from that. You may well have backups but what if your backup is corrupt? What if your stored procedure hasn’t been writing the right data for a week? Will you be able to recover that data?&lt;/p&gt;</description>
    </item>
    <item>
      <title>How do you choose which columns to include in your SQL Server clustered index?</title>
      <link>https://the.agilesql.club/2019/06/how-do-you-choose-which-columns-to-include-in-your-sql-server-clustered-index/</link>
      <pubDate>Mon, 03 Jun 2019 05:45:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2019/06/how-do-you-choose-which-columns-to-include-in-your-sql-server-clustered-index/</guid>
      <description>&lt;h1 id=&#34;database-engineering-database-modelling-do-i-need-to-have-an-incrementing-identity-intbigint-as-my-clustered-index-in-a-sql-server-database&#34;&gt;Database Engineering: Database Modelling: Do I need to have an incrementing identity int/bigint as my clustered index in a SQL Server database?&lt;/h1&gt;&#xA;&lt;p&gt;When you want to produce a professional table design that will scale in the future and stop you being called at 4 AM to fix a performance issue, will you regret that decision to not add an incrementing “id” column to that core table?&lt;/p&gt;&#xA;&lt;p&gt;When you look in forums, do you see people fiercely guarding their opinion that you should/should not include an id column?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why is my pivot query not returning any data? How to debug a PIVOT query</title>
      <link>https://the.agilesql.club/2019/05/why-is-my-pivot-query-not-returning-any-data-how-to-debug-a-pivot-query/</link>
      <pubDate>Tue, 21 May 2019 21:45:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2019/05/why-is-my-pivot-query-not-returning-any-data-how-to-debug-a-pivot-query/</guid>
      <description>&lt;p&gt;If you have a PIVOT query and it isn&amp;rsquo;t returning the data you expect, what can you do to troubleshoot it? The thing to do is to break it down into the constituent parts. First, lets take a look at a query and see what we can do to help.&lt;/p&gt;&#xA;&lt;p&gt;If you have this query:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; Student1, [&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; Student2, coalesce([&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;], &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; Student3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; student_id, amount &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; [a]) &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;source&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    PIVOT (&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;SUM&lt;/span&gt;(amount) &lt;span style=&#34;color:#66d9ef&#34;&gt;FOR&lt;/span&gt; student_id &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; ([&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;],[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;],[&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ) &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; pv&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;step-1---do-you-have-any-actual-data&#34;&gt;Step 1 - Do you have any actual data?&lt;/h2&gt;&#xA;&lt;p&gt;If we break this down, the first thing is we select the original data from the table here:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to delete a lot of data from a SQL Server database</title>
      <link>https://the.agilesql.club/2019/05/how-to-delete-a-lot-of-data-from-a-sql-server-database/</link>
      <pubDate>Wed, 15 May 2019 07:45:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2019/05/how-to-delete-a-lot-of-data-from-a-sql-server-database/</guid>
      <description>&lt;h1 id=&#34;how-to-delete-data-efficiently&#34;&gt;How to delete data efficiently&lt;/h1&gt;&#xA;&lt;p&gt;When we delete data from a table in SQL Server, we can often find that the delete is slower than even the original insert, especially if the insert was made using the bulk insert API.&#xA;Often when people find that they have a delete that is taking longer than it should and blocking other users, they kill the delete, but the rollback takes just as long if not longer than the delete up until that point. They can sometimes panic and restart SQL Server, but when the server starts back up again, it puts the database into recovery mode and continues rolling back that data.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to load test a SQL database</title>
      <link>https://the.agilesql.club/2019/05/how-to-load-test-a-sql-database/</link>
      <pubDate>Wed, 08 May 2019 21:45:20 +0100</pubDate>
      <guid>https://the.agilesql.club/2019/05/how-to-load-test-a-sql-database/</guid>
      <description>&lt;p&gt;How do you know whether a database code change is going to be great, okay or awful? If you want to test a new version of SQL Server how do you know whether to leave on or disable the legacy cardinality estimator? Will the latest cumulative update destroy the performance of your application?&lt;/p&gt;&#xA;&lt;p&gt;You don&amp;rsquo;t have to wait until production to know if the change you are going to do works or not and building a system to test the performance of your database is probably more straightforward than you realize.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Should I pluralize table names, is it Person, Persons, People or People?</title>
      <link>https://the.agilesql.club/2019/05/should-i-pluralize-table-names-is-it-person-persons-people-or-people/</link>
      <pubDate>Thu, 02 May 2019 04:20:15 +0000</pubDate>
      <guid>https://the.agilesql.club/2019/05/should-i-pluralize-table-names-is-it-person-persons-people-or-people/</guid>
      <description>&lt;p&gt;Reading Time: 5 minutes (just do it!)&lt;/p&gt;&#xA;&lt;p&gt;There is a lot of confusion when it comes to designing tables in SQL Server around whether to pluralize names or not. How do you choose whether to pluralize or not?&lt;/p&gt;&#xA;&lt;p&gt;If we want to store a list of people and their details do we use &amp;ldquo;Person&amp;rdquo;, &amp;ldquo;Persons&amp;rdquo;, &amp;ldquo;People&amp;rdquo; or &amp;ldquo;Peoples&amp;rdquo;? Some people will use &amp;ldquo;People&amp;rdquo; and some will use &amp;ldquo;Person&amp;rdquo;, other persons or people would go for &amp;ldquo;Peoples&amp;rdquo; or &amp;ldquo;Persons&amp;rdquo;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>DacFx how to get the data type from a column a discussion of properties, relationships and the TSqlModel</title>
      <link>https://the.agilesql.club/2019/04/dacfx-how-to-get-the-data-type-from-a-column-a-discussion-of-properties-relationships-and-the-tsqlmodel/</link>
      <pubDate>Wed, 17 Apr 2019 21:20:15 +0000</pubDate>
      <guid>https://the.agilesql.club/2019/04/dacfx-how-to-get-the-data-type-from-a-column-a-discussion-of-properties-relationships-and-the-tsqlmodel/</guid>
      <description>&lt;p&gt;Reading Time: 15 minutes (it is quite hard going, but you need to know this if you need to work with the DacFx)&lt;/p&gt;&#xA;&lt;h2 id=&#34;dacfx---getting-the-data-type-of-a-column-on-a-table-a-rehash-of-an-old-blog-post&#34;&gt;DacFx - Getting the data type of a column on a table, a rehash of an old blog post&lt;/h2&gt;&#xA;&lt;p&gt;This post has been years in the making, I did a version of it years ago here: &lt;a href=&#34;https://sqlserverfunctions.wordpress.com/2014/09/27/querying-the-dacfx-api-getting-column-type-information&#34;&gt;https://sqlserverfunctions.wordpress.com/2014/09/27/querying-the-dacfx-api-getting-column-type-information&lt;/a&gt; - well fast forward 5 years to now and I can now understand how it works and whereas before I basically sat in a debugger trying to figure out what method to use. I am now pretty confident I can get to any property I need using excel rather than using a debugger and reflection, this makes me happy :)&lt;/p&gt;</description>
    </item>
    <item>
      <title>How can we merge multiple dacpacs into one</title>
      <link>https://the.agilesql.club/2019/03/how-can-we-merge-multiple-dacpacs-into-one/</link>
      <pubDate>Tue, 05 Mar 2019 19:20:15 +0000</pubDate>
      <guid>https://the.agilesql.club/2019/03/how-can-we-merge-multiple-dacpacs-into-one/</guid>
      <description>&lt;p&gt;Reading Time: 4 minutes (not a minute longer)&lt;/p&gt;&#xA;&lt;h2 id=&#34;tldr&#34;&gt;TLDR;&lt;/h2&gt;&#xA;&lt;p&gt;You probably don&amp;rsquo;t want to actually merge dacpac&amp;rsquo;s you probably want to deploy multiple and use /p:IncludeCompositeObjects=true.&lt;/p&gt;&#xA;&lt;p&gt;If you do really want to merge dacpacs you can start with this sample: &lt;a href=&#34;https://github.com/GoEddie/DacpacMerge&#34;&gt;https://github.com/GoEddie/DacpacMerge&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;why&#34;&gt;Why?&lt;/h2&gt;&#xA;&lt;p&gt;I was reading the dacfx issues on the dacextensions sample&amp;rsquo;s github site: &lt;a href=&#34;https://github.com/Microsoft/DACExtensions/issues&#34;&gt;https://github.com/Microsoft/DACExtensions/issues&lt;/a&gt; and one of the issues &lt;a href=&#34;https://github.com/Microsoft/DACExtensions/issues/23&#34;&gt;https://github.com/Microsoft/DACExtensions/issues/23&lt;/a&gt; asked about how to merge dacpac&amp;rsquo;s and I have been asked a few times how to do this and I thought there was a sample but I couldn&amp;rsquo;t find it so I knocked a quick one up.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSDT: Build in VSCode</title>
      <link>https://the.agilesql.club/2019/01/ssdt-build-in-vscode/</link>
      <pubDate>Tue, 29 Jan 2019 00:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2019/01/ssdt-build-in-vscode/</guid>
      <description>&lt;p&gt;Over the last couple of years I have been using VSCode more and more and Visual Studio less and less, this is great but there isn&amp;rsquo;t first class support for SSDT in VSCode, it would be great if there was but there isn&amp;rsquo;t today. This means I need to use Visual Studio to work with SSDT but often I find I just need to change a stored procedure or table and I don&amp;rsquo;t actually need the full SSDT experience, just a subset - can I change something and does it build, and can I deploy that build and run the tests?&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSDT: /p:AllowIncompatiblePlatform, what platforms are compatible?</title>
      <link>https://the.agilesql.club/2019/01/ssdt-/pallowincompatibleplatform-what-platforms-are-compatible/</link>
      <pubDate>Fri, 25 Jan 2019 00:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2019/01/ssdt-/pallowincompatibleplatform-what-platforms-are-compatible/</guid>
      <description>&lt;p&gt;Sometimes you don&amp;rsquo;t have the perfect development environment for SQL Server, sometimes you deploy to things like SQL Azure and want to test locally, for various reasons it is possible that you want to deploy to one version of SQL Server but set the project properties to a different version of SQL Server. If you find yourself in this situation you might need to use the parameter &lt;em&gt;AllowIncompatiblePlatform&lt;/em&gt; which essentially says &amp;ldquo;I know I said the project is for SQL 2017 but I am deploying to SQL 2014&amp;rdquo;, anytime you say this you also sign the contract that says &amp;ldquo;If I am deploying to a lower version then I have made sure I haven&amp;rsquo;t used any keywords or object types that didn&amp;rsquo;t exist in that version and also if everything fails then so be it, I live with my choices every day&amp;rdquo;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>minikibe on windows, getting stuck on networking issues like cant connect messages?</title>
      <link>https://the.agilesql.club/2018-10-09/minikube-on-windows-getting-stuck-on-networking-issues-like-cant-connect/</link>
      <pubDate>Tue, 09 Oct 2018 23:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2018-10-09/minikube-on-windows-getting-stuck-on-networking-issues-like-cant-connect/</guid>
      <description>&lt;p&gt;Reading Time 1 Minute&lt;/p&gt;&#xA;&lt;p&gt;I have been getting kubernetes setup on my laptop via minikube and I followed all the examples to the T, especially the part about creating a new external network and referencing that when you create the minikube (go search for a tutorial on setting up minikube on windows and they all say &amp;ldquo;create an external networkin hyper-v and reference that).&lt;/p&gt;&#xA;&lt;p&gt;The problem is, if you already have a default external network (or another external network) that also uses the same physical network card then when the minikube virtual machine starts up, hyper-v behaves &amp;ldquo;erratically&amp;rdquo;. I setup a ping to my local router and started minikube and the network kept dropping out and generally being a bit rubbish.&lt;/p&gt;</description>
    </item>
    <item>
      <title>TDD for SQL Server using tSQLt course certificates now available </title>
      <link>https://the.agilesql.club/2018/07/tdd-for-sql-server-using-tsqlt-course-certificates-now-available/</link>
      <pubDate>Wed, 18 Jul 2018 20:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2018/07/tdd-for-sql-server-using-tsqlt-course-certificates-now-available/</guid>
      <description>&lt;p&gt;I have been asked a few times now for course completion certificates so I have decided to give out certificates to anyone who pays for a plan and sends me a screen shot of a unit test they have written and answer a question on unit testing.&lt;/p&gt;&#xA;&lt;p&gt;I will generate the certificates by hand so i&amp;rsquo;m not doing them for everyone otherwise I would have hundreds to do (over 300 people have now taken the online self-paced course).&lt;/p&gt;</description>
    </item>
    <item>
      <title>mentor or mentee be, be both, be neither, be happy</title>
      <link>https://the.agilesql.club/2018/07/mentor-or-mentee-be-be-both-be-neither-be-happy/</link>
      <pubDate>Fri, 06 Jul 2018 06:10:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2018/07/mentor-or-mentee-be-be-both-be-neither-be-happy/</guid>
      <description>&lt;p&gt;TLDR: There is a new exciting community slack channel where you can find a mentor, a mentee or both if that floats your boat. The great Chrissy LeMaire (&lt;a href=&#34;https://twitter.com/cl&#34;&gt;https://twitter.com/cl&lt;/a&gt;) from dba tools and sqlcommunity.slack.com fame and general Powershell and SQL legend has started a new mentor&amp;rsquo;s slack channel.&lt;/p&gt;&#xA;&lt;p&gt;Come and join the fun, it is a community-driven informal process. I have put up a google docs sheet with a list that people can add themselves to or use to contact other people who might be a good fit for them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deploying to Azure Without Writing JSON Arm Templates</title>
      <link>https://the.agilesql.club/azureazureazure/2018-06-19/arm/deploying-to-azure-without-writing-json-arm-templates/</link>
      <pubDate>Tue, 19 Jun 2018 22:47:00 +0000</pubDate>
      <guid>https://the.agilesql.club/azureazureazure/2018-06-19/arm/deploying-to-azure-without-writing-json-arm-templates/</guid>
      <description>&lt;p&gt;Reading Time: 6 minutes (not a minute longer)&lt;/p&gt;&#xA;&lt;h2 id=&#34;tldr&#34;&gt;TLDR;&lt;/h2&gt;&#xA;&lt;p&gt;ARM templates are a  great way to deploy to Azure, setting up a template that can deploy an entire environment from databases to web servers and load balancers to firewalls (damn you azure, ok, I&amp;rsquo;ll call it an nsg) is satisfying but writing and managing blobs of JSON is less satisfying. In this post, we look at what are the alternatives to writing ARM templates in JSON.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Running MySQL on a VSTS build agent</title>
      <link>https://the.agilesql.club/2018/05/running-mysql-on-a-vsts-build-agent/</link>
      <pubDate>Tue, 08 May 2018 22:28:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2018/05/running-mysql-on-a-vsts-build-agent/</guid>
      <description>&lt;p&gt;I had a requirement to run MySQL on a VSTS hosted build agent and then to be able to run commands from outside of the container and this gave me the chance to have a play around with VSTS support for containers and builds as YAML (YAML builds / builds as YAML??).&lt;/p&gt;&#xA;&lt;p&gt;I struggled getting started with this for a little bit longer than I would have hoped, if you have a container and want to run commands inside the container then the process is pretty straight forward, although on vsts you don&amp;rsquo;t get a TTY so need to do &amp;ldquo;docker exec -i&amp;rdquo; rather than &amp;ldquo;docker exec -it&amp;rdquo; as all the examples show. For this, I specifically wanted to run a command on the host and have MySQL exposed externally to the container which is the bit I struggled with the longest.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Database testing and ETL processes</title>
      <link>https://the.agilesql.club/2018/05/database-testing-and-etl-processes/</link>
      <pubDate>Tue, 01 May 2018 20:07:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2018/05/database-testing-and-etl-processes/</guid>
      <description>&lt;p&gt;Unit testing using tSQLt is really great, you call FakeTable on any tables your code touches and then insert the columns and rows your test actually need, nothing more, nothing less but what happens when you have more complicated processes like an ETL process?&lt;/p&gt;&#xA;&lt;p&gt;TLDR: the same as unit testing, just you probably don’t use tSQLt to mock the tables.&lt;/p&gt;&#xA;&lt;h1 id=&#34;what-types-of-test-are-there&#34;&gt;What types of test are there?&lt;/h1&gt;&#xA;&lt;p&gt;Tests get larger and more complicated the further away from the code, so first off we have unit tests which are very close to the code. A unit tests typically understands how one single unit of code works and so setting up data is the simplest, we just have the rows and columns we need for that test (I know i’ve repeated it, I repeat to to myself over and over and over again).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Interesting Azure ARM &#34;Make it So&#34; behaviour</title>
      <link>https://the.agilesql.club/2018/04/interesting-azure-arm-make-it-so-behaviour/</link>
      <pubDate>Thu, 05 Apr 2018 06:04:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2018/04/interesting-azure-arm-make-it-so-behaviour/</guid>
      <description>&lt;p&gt;I had a template that deployed a premium managed disk and a virtual machine. I defined the disk like:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt; &#xD; {  &#xD; &amp;quot;comments&amp;quot;: &amp;quot;Managed Disk.&amp;quot;,  &#xD; &amp;quot;type&amp;quot;: &amp;quot;Microsoft.Compute/disks&amp;quot;,  &#xD; &amp;quot;name&amp;quot;: &amp;quot;[variables(&#39;diskName&#39;)]&amp;quot;,  &#xD; &amp;quot;apiVersion&amp;quot;: &amp;quot;2016-04-30-preview&amp;quot;,  &#xD; &amp;quot;location&amp;quot;: &amp;quot;[parameters(&#39;location&#39;)]&amp;quot;,  &#xD; &amp;quot;tags&amp;quot;: {  &#xD; &amp;quot;displayName&amp;quot;: &amp;quot;Data Disk 1 - Presented as LUN 0&amp;quot;  &#xD; },  &#xD; &amp;quot;properties&amp;quot;: {  &#xD; &amp;quot;accountType&amp;quot;: &amp;quot;Premium_LRS&amp;quot;,  &#xD; &amp;quot;creationData&amp;quot;: {  &#xD; &amp;quot;createOption&amp;quot;: &amp;quot;Empty&amp;quot;  &#xD; },  &#xD; &amp;quot;diskSizeGB&amp;quot;: 1024  &#xD; },  &#xD; &amp;quot;dependsOn&amp;quot;: []  &#xD; },  &#xD;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Then in the same template, I had a virtual machine with the storage section that looked like:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why didnt my Azure ARM deploy work?</title>
      <link>https://the.agilesql.club/2018/04/why-didnt-my-azure-arm-deploy-work/</link>
      <pubDate>Wed, 04 Apr 2018 18:04:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2018/04/why-didnt-my-azure-arm-deploy-work/</guid>
      <description>&lt;p&gt;I have been using Octopus to deploy ARM templates for a while now and the default task that comes with Octopus to deploy doesn&amp;rsquo;t have any debugging information enabled and when you run this powershell:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;New-AzureRMResourceGroupDeployment&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;If you don&amp;rsquo;t have debugging information enabled, the output of a failed deployment is basically &amp;ldquo;Deployment Failed, suck it up dude&amp;rdquo; or something along those lines.&lt;/p&gt;&#xA;&lt;p&gt;If you want to find out why your deployment failed, the best thing to do is grab your template and parameter file and run:&lt;/p&gt;</description>
    </item>
    <item>
      <title>VSTS extensions, mixing VSS.require and import ... require</title>
      <link>https://the.agilesql.club/2018/03/vsts-extensions-mixing-vss.require-and-import-...-require/</link>
      <pubDate>Mon, 05 Mar 2018 21:05:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2018/03/vsts-extensions-mixing-vss.require-and-import-...-require/</guid>
      <description>&lt;p&gt;I have been starting to write more and more typescript lately and quite enjoying it. I have also been writing a few vsts extensions and using typescript to write vsts extensions seems to be working quite nicely. One of the best things, for me, about typescript is to use type information which gives compile time verification and intellisense.&lt;/p&gt;&#xA;&lt;p&gt;This is good but when it comes to VSTS extensions, almost every sample I have seen follows this pattern:&lt;/p&gt;</description>
    </item>
    <item>
      <title>gdpr - panic part 4</title>
      <link>https://the.agilesql.club/2018/02/gdpr-panic-part-4/</link>
      <pubDate>Thu, 08 Feb 2018 17:22:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2018/02/gdpr-panic-part-4/</guid>
      <description>&lt;p&gt;In the first part of this series, we looked at where to find out more information about GDPR in the UK (hint: The ICO.gov website has everything you need). In the second part, we looked at some historical enforcement action by the ICO against companies who had made a mistake with their security and data that they were responsible for. In the third part, we again looked at some different angles of opsec which have caused issues such as physical access to a server room not monitored by CCTV and how it led the RSA to a £150,000 fine. Finally, in part 3 we looked at Keurboom Communications Ltd who deliberately used the data they had to make almost 100 million phone calls to sell PPI or accident handling – I am sure anyone who has a UK number would have received some of these, I know I certainly did and ended up getting so many at one point I changed my phone number.&lt;/p&gt;</description>
    </item>
    <item>
      <title>tSQLt Course</title>
      <link>https://the.agilesql.club/2018/02/tsqlt-course/</link>
      <pubDate>Tue, 06 Feb 2018 17:43:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2018/02/tsqlt-course/</guid>
      <description>&lt;p&gt;In the last half of 2017, I decided to run a tSQLt course and went down the route of putting together a free 12-week email course. The intention was that every week students would get a bit of a description about how unit testing T-SQL using tSQLt works and a little bit of homework to ease them into writing tests both in terms of how to technically get tSQLt running but also the art of writing effective unit tests.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Re-Imagining an SSIS IDE</title>
      <link>https://the.agilesql.club/2018/02/re-imagining-an-ssis-ide/</link>
      <pubDate>Sun, 04 Feb 2018 22:37:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2018/02/re-imagining-an-ssis-ide/</guid>
      <description>&lt;p&gt;Re-Imagining the SSIS development environment.&lt;/p&gt;&#xA;&lt;h2 id=&#34;oooh&#34;&gt;oooh:&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/assets/images/kssised/script.png&#34;&gt;&lt;img src=&#34;https://the.agilesql.club/assets/images/kssised/script.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;ahhh&#34;&gt;ahhh:&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/assets/images/kssised/connection.png&#34;&gt;&lt;img src=&#34;https://the.agilesql.club/assets/images/kssised/connection.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;br&gt;&#xA;SSIS is a powerful and versatile tool for extracting, transforming and loading data into or out of SQL Server. The development environment, BIDS and now SSDT allow developers to create, edit and debug SSIS package. I struggle with the actual IDE. The thing that I find is that the IDE is designed around a series of dialog boxes, tabs and a graphical map of the package as a whole. SSIS packages let you embed either c# or vb.net scripts and to open one of these scripts a whole separate instance of visual studio is started and I have worked on projects where opening scripts can literally take 5 minutes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>gdpr - panic part 3</title>
      <link>https://the.agilesql.club/2018/02/gdpr-panic-part-3/</link>
      <pubDate>Thu, 01 Feb 2018 23:49:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2018/02/gdpr-panic-part-3/</guid>
      <description>&lt;p&gt;In part three of this short series&lt;/p&gt;&#xA;&lt;p&gt;Part one is: &lt;a href=&#34;https://the.agilesql.club/blogs/Ed-Elliott/2018-02-01/GDPR-Panic-Part-1&#34;&gt;https://the.agilesql.club/blogs/Ed-Elliott/2018-02-01/GDPR-Panic-Part-1&lt;/a&gt;&lt;br&gt;&#xA;Part two is: &lt;a href=&#34;https://the.agilesql.club/blogs/Ed-Elliott/2018-02-01/GDPR-Panic-Part-2&#34;&gt;https://the.agilesql.club/blogs/Ed-Elliott/2018-02-01/GDPR-Panic-Part-2&lt;/a&gt;&lt;br&gt;&#xA;This is part three: &lt;a href=&#34;https://the.agilesql.club/blogs/Ed-Elliott/2018-02-01/gdpr-panic-part-3&#34;&gt;https://the.agilesql.club/blogs/Ed-Elliott/2018-02-01/gdpr-panic-part-3&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;In part two I started looking at previous enforcement action taken by the ICO, Talk Talk (3!!! times) and the historical society:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/blogs/Ed-Elliott/2018-02-01/GDPR-Panic-Part-2&#34;&gt;https://the.agilesql.club/blogs/Ed-Elliott/2018-02-01/GDPR-Panic-Part-2&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;In this part, we will start by looking at the Royal &amp;amp; Sun Alliance Insurance PLC from January 2017:&lt;/p&gt;&#xA;&lt;h2 id=&#34;royal--sun-alliance&#34;&gt;Royal &amp;amp; Sun Alliance&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://ico.org.uk/media/action-weve-taken/mpns/1625635/mpn-royal-sun-alliance-20170110.pdf&#34;&gt;https://ico.org.uk/media/action-weve-taken/mpns/1625635/mpn-royal-sun-al&amp;hellip;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;The RSA has a data centre in Horsham, West Sussex - I only mention this as I live nearby.&lt;/p&gt;</description>
    </item>
    <item>
      <title>gdpr - panic part 2</title>
      <link>https://the.agilesql.club/2018/02/gdpr-panic-part-2/</link>
      <pubDate>Thu, 01 Feb 2018 20:17:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2018/02/gdpr-panic-part-2/</guid>
      <description>&lt;p&gt;Welcome GDPR friends :)&lt;/p&gt;&#xA;&lt;p&gt;Part one is: &lt;a href=&#34;https://the.agilesql.club/blogs/Ed-Elliott/2018-02-01/GDPR-Panic-Part-1&#34;&gt;https://the.agilesql.club/blogs/Ed-Elliott/2018-02-01/GDPR-Panic-Part-1&lt;/a&gt;&lt;br&gt;&#xA;This is part two: &lt;a href=&#34;https://the.agilesql.club/blogs/Ed-Elliott/2018-02-01/GDPR-Panic-Part-2&#34;&gt;https://the.agilesql.club/blogs/Ed-Elliott/2018-02-01/GDPR-Panic-Part-2&lt;/a&gt;&lt;br&gt;&#xA;Part three is: &lt;a href=&#34;https://the.agilesql.club/blogs/Ed-Elliott/2018-02-01/gdpr-panic-part-3&#34;&gt;https://the.agilesql.club/blogs/Ed-Elliott/2018-02-01/gdpr-panic-part-3&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;In this part, I am going to have a look at previous action the ICO has taken to give some context to the scary sounding 4% turnover or millions of pounds you will receive if you do something wrong. We obviously can&amp;rsquo;t predict exactly how an enforcement action will go, but we can think about the sort of things we should be doing, before during and after a breach.&lt;/p&gt;</description>
    </item>
    <item>
      <title>gdpr - panic part 1</title>
      <link>https://the.agilesql.club/2018/02/gdpr-panic-part-1/</link>
      <pubDate>Thu, 01 Feb 2018 13:57:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2018/02/gdpr-panic-part-1/</guid>
      <description>&lt;p&gt;GDPR is coming (or if you are reading this in a few weeks then gdpr is here, what do you need to know and where do you start?&lt;/p&gt;&#xA;&lt;p&gt;This post is based on how gdpr will apply to the UK. I have nothing against the EU, but in the UK it is the ICO which governs GDPR. Each country is allowed to add specific requirements, and each country does so if you are looking for how GDPR applies to another country the ICO can&amp;rsquo;t help you sorry.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Azure ARM template function internals</title>
      <link>https://the.agilesql.club/2017/12/azure-arm-template-function-internals/</link>
      <pubDate>Mon, 18 Dec 2017 19:24:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/12/azure-arm-template-function-internals/</guid>
      <description>&lt;p&gt;I have been working with azure arm functions for quite a while and they are exceptionally useful but also quite a pain to work with, visualizing what it is that the functions will resolve to is often hard.&lt;/p&gt;&#xA;&lt;p&gt;If you haven&amp;rsquo;t used an ARM template, ARM templates are JSON documents which are effectively a whole load of properties made up of a name and a value. The value can either just be a value or it can include arm template functions. If we look at this example:&lt;/p&gt;</description>
    </item>
    <item>
      <title>xSQLServer is dead long live SqlServerDsc</title>
      <link>https://the.agilesql.club/2017/12/xsqlserver-is-dead-long-live-sqlserverdsc/</link>
      <pubDate>Fri, 15 Dec 2017 12:45:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/12/xsqlserver-is-dead-long-live-sqlserverdsc/</guid>
      <description>&lt;p&gt;I have had a problem with DSC in Azure Automation for a few months now, there was a change made to the xSqlServer DSC resource which meant that the paths internally were too long to be compiled on Azure Automation, I don&amp;rsquo;t even really want to think why because the fact that path lengths are an issue in 2017 (almost 2018!) makes me want to cry, so if you want to know more look at:&lt;/p&gt;</description>
    </item>
    <item>
      <title>What The Tool? Multiple choice quiz to help you choose a tool for SQL Server</title>
      <link>https://the.agilesql.club/2017/12/what-the-tool-multiple-choice-quiz-to-help-you-choose-a-tool-for-sql-server/</link>
      <pubDate>Thu, 14 Dec 2017 22:52:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/12/what-the-tool-multiple-choice-quiz-to-help-you-choose-a-tool-for-sql-server/</guid>
      <description>&lt;p&gt;There are a few different choices for tools to use when it comes to SQL Server, while the &amp;ldquo;experienced&amp;rdquo; amongst us have used query analyzer, enterprise manager and probably ssms it isn&amp;rsquo;t always clear what tool you should use. If you consider sql operations studio and vscode it is a literal minefield of possible options.&lt;/p&gt;&#xA;&lt;p&gt;I was quite pleased with how my &lt;a href=&#34;https://the.agilesql.club/WhatTheIO/&#34;&gt;https://the.agilesql.club/WhatTheIO/&lt;/a&gt; tool worked out and so I thought I would build a simple multiple choice quiz to help people decide between SSMS, SSDT, SOS, VSCode + mssql add-in:&lt;/p&gt;</description>
    </item>
    <item>
      <title>My Azure ARM template development workflow</title>
      <link>https://the.agilesql.club/2017/12/my-azure-arm-template-development-workflow/</link>
      <pubDate>Wed, 13 Dec 2017 22:29:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/12/my-azure-arm-template-development-workflow/</guid>
      <description>&lt;p&gt;Writing infrastructure as code is pretty nice and I enjoy the declarative approach of defining what you want and letting the tooling take care of the how. I guess this is because of my background as a SQL developer.&lt;/p&gt;&#xA;&lt;p&gt;What I don&amp;rsquo;t like so much is the development experience and if you don&amp;rsquo;t get this part right it can be a right pain.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-are-the-challenges&#34;&gt;What are the challenges?&lt;/h2&gt;&#xA;&lt;p&gt;The first real challenge is writing the correct json for each thing you want to create. For example, to create a virtual machine you need to know what the api version is that you should use and which properties are needed and which properties are required vs optional properties. Once you have that for a virtual machine you need to know the same details for a nic, nsg, storage account for vm diagnostics and any vm extensions you might want to include (and what properties they have).&lt;/p&gt;</description>
    </item>
    <item>
      <title>ARMED - Where is the source?</title>
      <link>https://the.agilesql.club/2017/12/armed-where-is-the-source/</link>
      <pubDate>Sat, 09 Dec 2017 10:45:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/12/armed-where-is-the-source/</guid>
      <description>&lt;p&gt;ARMED, where is the source?&lt;/p&gt;&#xA;&lt;p&gt;For quite a few years I’ve been putting everything I wrote on github and made most of it open source with a permissive license like MIT or Apache2. If anyone asked then I would be happy to change any licenses, whatever they wanted but with this new extension I haven’t put it on github.&lt;/p&gt;&#xA;&lt;p&gt;Basically it is freeware, I wrote it in TypeScript which compiles to JavaScript so if you want the JavaScript you can just read it, I prefer reading and debugging TypeScript but as it isn’t compiled to machine code the extension effectively ships with the source.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ARMED - ARM resource dependency graph inside VSCode</title>
      <link>https://the.agilesql.club/2017/12/armed-arm-resource-dependency-graph-inside-vscode/</link>
      <pubDate>Fri, 08 Dec 2017 23:07:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/12/armed-arm-resource-dependency-graph-inside-vscode/</guid>
      <description>&lt;p&gt;I think the title sums it up, I have published a new version of ARMED the arm helper extension for VSCode.&lt;/p&gt;&#xA;&lt;p&gt;This version includes the ability to see a graph of the resources and how they relate to each other:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/assets/images/srmedgraph.png&#34;&gt;&lt;img src=&#34;https://the.agilesql.club/assets/images/srmedgraph.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;There are a couple of limitations at the moment this knows about child resources and also resources referenced via dependOn, if you have an implicit reference using &amp;ldquo;resourceId&amp;rdquo; then I don&amp;rsquo;t pick it up (yet).&lt;/p&gt;</description>
    </item>
    <item>
      <title>ARMED - Azure ARM VS Code extension</title>
      <link>https://the.agilesql.club/2017/12/armed-azure-arm-vs-code-extension/</link>
      <pubDate>Wed, 06 Dec 2017 22:34:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/12/armed-azure-arm-vs-code-extension/</guid>
      <description>&lt;p&gt;I have been working with ARM templates for a little while and have found it really annoying to test functions inside the templates, you see if you have an ARM template it is a JSON document made up of lots of key/values like:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;{&amp;quot;name&amp;quot;: &amp;quot;a_name&amp;quot;}&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;but it is slightly more complicated because there is a set of functions in a javascript like language you can use in the values so you might have:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Azure Virtual Machine &#43; Premium Disk Throughput Calculator</title>
      <link>https://the.agilesql.club/2017/12/azure-virtual-machine--premium-disk-throughput-calculator/</link>
      <pubDate>Sat, 02 Dec 2017 19:55:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/12/azure-virtual-machine--premium-disk-throughput-calculator/</guid>
      <description>&lt;p&gt;UPDATE: I haven&amp;rsquo;t been keeping it up to date so deprecated it - if you find something like this useful moan at microsoft and get them to implement it!&lt;/p&gt;&#xA;&lt;p&gt;I keep having to refer to the virtual machine size page and the disks pricing page to work out how best to stripe disks for whichever type of virtual maching in Azure to work out what sort of throughput we can get so I thought I would save myself some ink and automate it, hopefully someone else finds this useful.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fixing SQL AG Routing &#34;Cannot find host&#34; using packet analysis (and a spell checker)</title>
      <link>https://the.agilesql.club/2017/11/fixing-sql-ag-routing-cannot-find-host-using-packet-analysis-and-a-spell-checker/</link>
      <pubDate>Thu, 30 Nov 2017 13:09:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/11/fixing-sql-ag-routing-cannot-find-host-using-packet-analysis-and-a-spell-checker/</guid>
      <description>&lt;p&gt;I was setting up an availability group listener recently and when I tried to connect to the listener I got an error message to say &amp;ldquo;The host cannot be found&amp;rdquo; after the usual 15 seconds connection delay.&lt;/p&gt;&#xA;&lt;p&gt;I checked the usual thing like TCP was enabled on the replicas and that routing was configured, but every time I tried I kept getting the &amp;ldquo;The host cannot be found&amp;rdquo; error. Now, I don&amp;rsquo;t know about you, but I find error messages like this completely infuriating especially when I knew the hostname of the listener resolved because I could ping the damn thing (and then connect straight to the IP address.&lt;/p&gt;</description>
    </item>
    <item>
      <title>&#34;the input device is not a TTY&#34; error running docker on VSTS build agent</title>
      <link>https://the.agilesql.club/2017/11/the-input-device-is-not-a-tty-error-running-docker-on-vsts-build-agent/</link>
      <pubDate>Wed, 22 Nov 2017 05:40:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/11/the-input-device-is-not-a-tty-error-running-docker-on-vsts-build-agent/</guid>
      <description>&lt;p&gt;I have been playing around with including all my build dependencies in docker for windows lately and had a build that kept giving me this error in the build log:&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;the input device is not a TTY. If you are using mintty, try prefixing the command with &amp;lsquo;winpty&amp;rsquo;&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;The command I had been running was along the lines of:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;docker exec -it powershell.exe ./some/script.ps1&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;The problem was that I was using &lt;code&gt;-it&lt;/code&gt; which means &amp;ldquo;interactive&amp;rdquo; and &amp;ldquo;create a virtual TTY&amp;rdquo;, to run my script I needed neither of those so took them off. The command then failed and I could see the actual error message which allowed me to find the real problem, instead of seeing a message about the TTY because the &lt;code&gt;docker exec&lt;/code&gt; command failed for some other reason (container not running, powershellexe instead of powershell.exe lol).&lt;/p&gt;</description>
    </item>
    <item>
      <title>How do I use VSTS variables in YAML CI Build definitions?</title>
      <link>https://the.agilesql.club/2017/11/how-do-i-use-vsts-variables-in-yaml-ci-build-definitions/</link>
      <pubDate>Tue, 21 Nov 2017 21:22:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/11/how-do-i-use-vsts-variables-in-yaml-ci-build-definitions/</guid>
      <description>&lt;p&gt;Hey, VSTS YAML builds are my new favorite thing, by like a million miles.&lt;/p&gt;&#xA;&lt;p&gt;If you have a yaml build definition ( .vsts-ci.yml ) and you want to use one of the build variables then it isn&amp;rsquo;t totally clear how to include them in a definition (it hasn&amp;rsquo;t been out long so I expect more docs to come soon), while we wait for the docs if you want to use one of the variables from &lt;a href=&#34;https://docs.microsoft.com/en-us/vsts/build-release/concepts/definitions/build/variables?tabs=batch&#34;&gt;https://docs.microsoft.com/en-us/vsts/build-release/concepts/definitions&amp;hellip;&lt;/a&gt; use this format:&lt;/p&gt;</description>
    </item>
    <item>
      <title>You have your database in source control now what?</title>
      <link>https://the.agilesql.club/2017/11/you-have-your-database-in-source-control-now-what/</link>
      <pubDate>Thu, 16 Nov 2017 08:02:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/11/you-have-your-database-in-source-control-now-what/</guid>
      <description>&lt;p&gt;This post is for a specific type of person if you are:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;New to source control&lt;/li&gt;&#xA;&lt;li&gt;Are getting started on your path to the continuous delivery nirvana&lt;/li&gt;&#xA;&lt;li&gt;Have been able to get your database into some sort of source control system&lt;/li&gt;&#xA;&lt;li&gt;Have more than one person checking in code to the database source&lt;/li&gt;&#xA;&lt;li&gt;You are unsure what yo do next&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Then this post is for you!&lt;/p&gt;&#xA;&lt;p&gt;Choosing a source control system and tools to manage your database code is a great hurdle to have got past, well done!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Running any AzureRM powershell command tells you to &#34;Run Login-AzureRmAccount to login.&#34; even though you are logged in!</title>
      <link>https://the.agilesql.club/2017/11/running-any-azurerm-powershell-command-tells-you-to-run-login-azurermaccount-to-login.-even-though-you-are-logged-in/</link>
      <pubDate>Wed, 15 Nov 2017 12:40:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/11/running-any-azurerm-powershell-command-tells-you-to-run-login-azurermaccount-to-login.-even-though-you-are-logged-in/</guid>
      <description>&lt;p&gt;Every AzureRM command I was running I would get an error message telling me to login, I then did a login, checked that I had the right subscription and I was still getting the error message - after logging in 7 times I figured that maybe there was something else wrong :)&lt;/p&gt;&#xA;&lt;p&gt;It turns out that I had originally installed the Azure RM cmdlets via the Azure SDK and had somehow also managed to install the AzureRM.profile module from the powershell gallery. Having different versions of the AzureRM.profile and the rest of the cmdlets caused hilarity (well not exactly hilarity but hey ho).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Watching for powershell changes and running Invoke-Pester</title>
      <link>https://the.agilesql.club/2017/11/watching-for-powershell-changes-and-running-invoke-pester/</link>
      <pubDate>Tue, 14 Nov 2017 22:16:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/11/watching-for-powershell-changes-and-running-invoke-pester/</guid>
      <description>&lt;p&gt;It seems like more and more recently I have been writing powershell and typescript rather than c# and t-sql and there are quite a few things to like about the tools for both of these (typescript and powershell). One thing I really like with typescript and javascript in general is that it seems everything has a file system watcher so you can have your code ide, a couple of terminals and all your tests run etc in the background.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSDT How To Fix Error SQL17502</title>
      <link>https://the.agilesql.club/2017/11/ssdt-how-to-fix-error-sql17502/</link>
      <pubDate>Mon, 06 Nov 2017 06:51:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/11/ssdt-how-to-fix-error-sql17502/</guid>
      <description>&lt;h2 id=&#34;tldr&#34;&gt;TLDR:&lt;/h2&gt;&#xA;&lt;p&gt;If you build an SSDT project you can get an error which says:&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;SQL71502: Function: [XXX].[XXX] has an unresolved reference to object [XXX].[XXX].&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;If the code that is failing is trying to use something in the &amp;ldquo;sys&amp;rdquo; schema or the &amp;ldquo;INFORMATION_SCHEMA&amp;rdquo; schema then you need to add a database reference to the master dacpac:&lt;/p&gt;&#xA;&lt;p&gt;Add a database reference to master:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Under the project, right-click References.&lt;/li&gt;&#xA;&lt;li&gt;Select Add database reference&amp;hellip;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://the.agilesql.club/assets/images/4-SQL21502-Add-Database-Reference.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>A virtualized CPU forced me to eat my lunch early, every day, for weeks</title>
      <link>https://the.agilesql.club/2017/10/a-virtualized-cpu-forced-me-to-eat-my-lunch-early-every-day-for-weeks/</link>
      <pubDate>Sat, 21 Oct 2017 20:59:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/10/a-virtualized-cpu-forced-me-to-eat-my-lunch-early-every-day-for-weeks/</guid>
      <description>&lt;p&gt;I worked one particular contract where I was forced to take my lunch at 11:35 every day, and it was all virtualisations fault!&lt;/p&gt;&#xA;&lt;p&gt;To set the scene it was a company who wasn&amp;rsquo;t really used to having developers, they had a load of SQL analysts and some mainframe developers but SQL developers writing T-SQL, C# and SSIS code was new to them. The IT management had decided that buying actual computers wasn&amp;rsquo;t necessary for development. We could use the standard PC&amp;rsquo;s and RDP onto a Windows 2008 R2 server with Visual Studio installed and work on that.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Where do you install tSQLt?</title>
      <link>https://the.agilesql.club/2017/10/where-do-you-install-tsqlt/</link>
      <pubDate>Thu, 19 Oct 2017 18:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/10/where-do-you-install-tsqlt/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/assets/images/Lost.png&#34;&gt;&lt;img src=&#34;https://the.agilesql.club/assets/images/Lost.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;The question of where to install tSQLt is probably the most common question I get when I talk about unit testing T-SQL, so much so that I thought that it would be a good topic for a blog. I mention tSQLt in the title, but this covers all unit test code for T-SQL.&lt;/p&gt;&#xA;&lt;p&gt;So to be more specific:&lt;/p&gt;&#xA;&lt;p&gt;Where do you install unit tests and unit tests frameworks for SQL Server, which databases should have that code in them?&lt;/p&gt;</description>
    </item>
    <item>
      <title>tSQLt Test Adapter for Visual Studio 2017</title>
      <link>https://the.agilesql.club/2017/10/tsqlt-test-adapter-for-visual-studio-2017/</link>
      <pubDate>Tue, 03 Oct 2017 19:08:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/10/tsqlt-test-adapter-for-visual-studio-2017/</guid>
      <description>&lt;p&gt;So Visual Studio 2017 has been released a while and I had created a version of the test adapter (which lets you run tSQLt tests from within Visual Studio with SSDT, ReadyRoll or just plan sql scripts using the test window but I held off on pushing it to the marketplace as it didn&amp;rsquo;t work with Visual Studio 2015.&lt;/p&gt;&#xA;&lt;p&gt;I spent quite a lot of time trying to work out how to build a single vsix that worked with VS 2015 and 2017 and in the end gave up and now there are two versions, one for 2015 and one for 2017 - I am not putting any fixes into the 2015 version so I would upgrade to 2017 if you want any updates.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Learn how to unit test SQL Server T-SQL code</title>
      <link>https://the.agilesql.club/2017/09/learn-how-to-unit-test-sql-server-t-sql-code/</link>
      <pubDate>Tue, 05 Sep 2017 05:37:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/09/learn-how-to-unit-test-sql-server-t-sql-code/</guid>
      <description>&lt;h3 id=&#34;a-free-email-course-on-how-to-use-tsqlt-including-the-technical-aspects-of-writing-unit-tests-and-the-art-of-writing-repeatable-using-unit-tests-for-even-the-most-complicated-t-sql-code&#34;&gt;A free email course on how to use tSQLt including the technical aspects of writing unit tests AND the art of writing repeatable, using unit tests for even the most complicated T-SQL code&lt;/h3&gt;&#xA;&lt;h3 id=&#34;update-i-thought-that-if-i-got-a-certain-number-by-october-1st-i-would-run-the-course-but-in-two-days-i-had-three-times-the-number-of-people-subscribe-than-my-initial-target-so-i-have-closed-the-first-course-sign-up-if-you-want-to-join-the-waitlist-or-the-next-course&#34;&gt;UPDATE: I thought that if I got a certain number by October 1st I would run the course but in two days I had three times the number of people subscribe than my initial target so I have closed the first course, sign up if you want to join the waitlist or the next course!&lt;/h3&gt;&#xA;&lt;h3 id=&#34;new-update-enroll-in-the-course-here-httpscoursesagilesqlclubpunit-testing-sql-server-code-using-tsqlt&#34;&gt;NEW UPDATE: Enroll in the course here: &lt;a href=&#34;https://courses.agilesql.club/p/unit-testing-sql-server-code-using-tsqlt&#34;&gt;https://courses.agilesql.club/p/unit-testing-sql-server-code-using-tsqlt&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Unit testing helps us to write better code, make rapid changes to our code and has been generally seen as a good idea for about 10 years. Writing tests for T-SQL code is made much easier by using tSQLt but there is quite a high barrier to entry both in terms of the technical skills in getting tSQLt running and also how to approach large code bases of, sometimes, unfriendly T-SQL code and taming the code with unit tests.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSIS ForEach Enumerator File Order</title>
      <link>https://the.agilesql.club/2017/09/ssis-foreach-enumerator-file-order/</link>
      <pubDate>Mon, 04 Sep 2017 20:46:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/09/ssis-foreach-enumerator-file-order/</guid>
      <description>&lt;p&gt;I saw on slack recently a question about how the ssis file enumeraror orders (or more specifically doesn&amp;rsquo;t order) files. I have been thinking about ssis quite a lot lately and whil I am in no hurry to start using it day to day it is quite an interesting tool.&lt;/p&gt;&#xA;&lt;p&gt;So anyway, I saw this question that went like:&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;does anyone know in what order files are processed in &amp;lsquo;Foreach File Enumerator&amp;rsquo;?&lt;br&gt;&#xA;I used to think it was alphabetically but after some testing this is not always the case?&lt;br&gt;&#xA;Second part is there anyway to specify the order by say size or date?&amp;rdquo;&lt;/p&gt;</description>
    </item>
    <item>
      <title>K-SSIS-ed</title>
      <link>https://the.agilesql.club/2017/08/k-ssis-ed/</link>
      <pubDate>Thu, 17 Aug 2017 16:32:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/08/k-ssis-ed/</guid>
      <description>&lt;h1 id=&#34;k-ssis-ed---view-any-property-or-script-in-ssis-with-a-single-click&#34;&gt;K-SSIS-ed - View any property or script in SSIS with a single click&lt;/h1&gt;&#xA;&lt;p&gt;A cross platform re-imagined IDE and SSIS package viewer with one goal to allow a developer to get to any property, including a c# or vb.net script within a single click and one second.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/assets/images/kssised/script.png&#34;&gt;&lt;img src=&#34;https://the.agilesql.club/assets/images/kssised/script.png&#34; alt=&#34;tSQLt tests are shown in the Visual Studio SSDT project&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;For support, please raise an issue: &lt;a href=&#34;https://github.com/GoEddie/K-SSIS-ed-docs&#34;&gt;https://github.com/GoEddie/K-SSIS-ed-docs&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Releases: &lt;a href=&#34;https://github.com/GoEddie/K-SSIS-ed-docs/releases&#34;&gt;https://github.com/GoEddie/K-SSIS-ed-docs/releases&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>SQLCover</title>
      <link>https://the.agilesql.club/2017/08/sqlcover/</link>
      <pubDate>Thu, 17 Aug 2017 16:32:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/08/sqlcover/</guid>
      <description>&lt;p&gt;SQL Cover is a tool to measure code coverage in T-SQL. This will tell you how much of your database code your unit tests are exercising.&lt;/p&gt;&#xA;&lt;p&gt;You can read more about it:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/blogs/Ed-Elliott/2016-04-08/SQLCover-Code-Coverage-For-SQL-Server-T-SQL&#34;&gt;https://the.agilesql.club/blogs/Ed-Elliott/2016-04-08/SQLCover-Code-Coverage-For-SQL-Server-T-SQL&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;You can get the source code from:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/GoEddie/SQLCover&#34;&gt;https://github.com/GoEddie/SQLCover&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;You can download it from:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/GoEddie/SQLCover/releases/&#34;&gt;https://github.com/GoEddie/SQLCover/releases/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;For help feel free to ping me.&lt;/p&gt;&#xA;&lt;h2 id=&#34;articles--posts-about-sql-cover&#34;&gt;Articles / Posts about SQL Cover:&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.red-gate.com/blog/building/sql-cover&#34;&gt;https://www.red-gate.com/blog/building/sql-cover&lt;/a&gt;&#xA;&lt;a href=&#34;https://documentation.red-gate.com/display/SR1/Using+SQL+Cover+with+SQL+Release+PowerShell+cmdlets&#34;&gt;https://documentation.red-gate.com/display/SR1/Using+SQL+Cover+with+SQL+Release+PowerShell+cmdlets&lt;/a&gt;&#xA;&lt;a href=&#34;http://www.jankowskimichal.pl/en/2016/09/sql-unit-tests-coverage-report/?utm_campaign=shareaholic&amp;amp;utm_medium=twitter&amp;amp;utm_source=socialnetwork&#34;&gt;http://www.jankowskimichal.pl/en/2016/09/sql-unit-tests-coverage-report/?utm_campaign=shareaholic&amp;amp;utm_medium=twitter&amp;amp;utm_source=socialnetwork&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;redgate&#34;&gt;Redgate:&lt;/h2&gt;&#xA;&lt;p&gt;Redgate kindly sponsored the initial version of SQLCover and I am most greatful to David Atkinson who really helped to shape what we have ended up with.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSDT-Dev-Pack</title>
      <link>https://the.agilesql.club/2017/08/ssdt-dev-pack/</link>
      <pubDate>Thu, 17 Aug 2017 16:32:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/08/ssdt-dev-pack/</guid>
      <description>&lt;h1 id=&#34;what-is-the-ssdt-dev-pack&#34;&gt;What is the SSDT Dev Pack&lt;/h1&gt;&#xA;&lt;p&gt;It is basically a collection of tools that I find make developing in for SQL Server in SSDT better or easier. I will never have the time on my own to do as much for t-sql that resharper does for t-sql but this is a start and maybe someone will invest in tools for t-sql developers at some point :)&lt;/p&gt;&#xA;&lt;p&gt;The general idea is that if I want to do something and can make it re-usable then I will add it here. If anyone has any ideas for a tool that they would find useful please feel free to fork it on github and add it, or send me the details and if I have time and I think it is useful I will add it in myself.&lt;/p&gt;</description>
    </item>
    <item>
      <title>TSQL Tuesday - Databases and DevOps</title>
      <link>https://the.agilesql.club/2017/06/tsql-tuesday-databases-and-devops/</link>
      <pubDate>Tue, 13 Jun 2017 16:16:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/06/tsql-tuesday-databases-and-devops/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.scarydba.com/2017/06/06/t-sql-tuesday-091-databases-devops/&#34;&gt;&lt;img src=&#34;https://the.agilesql.club/assets/images/tuesday.jpg&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;DevOps isn&amp;rsquo;t running SQL Server in a container and pushing code to it from Jenkins&lt;/p&gt;&#xA;&lt;p&gt;When we talk about DevOps we envision that we have the ability to check-in code, spin up a new environment, deploy, test and push that code to production and be in the pub at 4.&lt;/p&gt;&#xA;&lt;p&gt;We know that by having the right tooling in place we can make releases more reliable and more frequent enabling us to deploy the changes that the business want when they want them rather than every x days/weeks/months/years/decades. This outcome is best for everyone, no one loses and the path to fun and profit is that, fun and profitable.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSDT: Unable to connect to master or target server.</title>
      <link>https://the.agilesql.club/2017/06/ssdt-unable-to-connect-to-master-or-target-server./</link>
      <pubDate>Mon, 12 Jun 2017 16:27:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/06/ssdt-unable-to-connect-to-master-or-target-server./</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/assets/images/publish_error.png&#34;&gt;&lt;img src=&#34;https://the.agilesql.club/assets/images/publish_error.png&#34; alt=&#34;error in sssdt: Unable to connect to master or target server. the server displayed isn&amp;rsquo;t the server but the database&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Every now and then I come across this error in SSDT, normally when trying to publish and the odd thing is that the description never matches the actual cause (if you desperate for the cause it is because you can&amp;rsquo;t connect). The thing I like about the description is the way it tries to tell you what is wrong and what server you are connecting to but it fails at both and instead tells you about an unrelated error and a database name instead of a server name.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSDT DevPack &#43; Visual Studio 2017 </title>
      <link>https://the.agilesql.club/2017/05/ssdt-devpack--visual-studio-2017/</link>
      <pubDate>Mon, 08 May 2017 17:48:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/05/ssdt-devpack--visual-studio-2017/</guid>
      <description>&lt;p&gt;I have upgraded the ssdt dev pack to support visual studio 2017 and fixed a couple of minor annoyances and have started to think about how to improve it going forward.&lt;/p&gt;&#xA;&lt;p&gt;The first feature of sorts is the ability to clear the connection used by the quick deployer without having to restart visual studio.&lt;/p&gt;&#xA;&lt;p&gt;Secondly I am pretty convinced that the main thing people use it for is the quick deploy, the tSQLt test builder and I use the keyword formatters so I have moved everything else to underneath a menu item saying &amp;ldquo;deprecated&amp;rdquo; - if anyone really wants one of those features then let me know and I will keep it but I will likely remove them at some point.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSDT Dev in Visual Studio Code</title>
      <link>https://the.agilesql.club/2017/04/ssdt-dev-in-visual-studio-code/</link>
      <pubDate>Thu, 27 Apr 2017 21:39:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/04/ssdt-dev-in-visual-studio-code/</guid>
      <description>&lt;p&gt;I have been quite interested by vs code and have been using it more and more recently. I use it for all my GO (#golang FTW) work and also powershell and I have been toying with the sql tools team&amp;rsquo;s sql extension which is great. For a long time I have thought about bringing the SSDT experience to other IDE&amp;rsquo;s like Jetbrains IntelliJ but because I have been using vscode quite a lot recently and separately I have been doing more and more javascript and typescript I thought it would be interesting to see how hard it would be to write a vscode extension that lets me build dacpac&amp;rsquo;s.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Updating TSqlModels (DacFx)</title>
      <link>https://the.agilesql.club/2017/04/updating-tsqlmodels-dacfx/</link>
      <pubDate>Wed, 26 Apr 2017 06:41:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/04/updating-tsqlmodels-dacfx/</guid>
      <description>&lt;p&gt;This one is for the DacFx nuts out there, it can&amp;rsquo;t be a very big club but judging from the occasional emails I get about it, the quality is very high ha ha.&lt;/p&gt;&#xA;&lt;p&gt;If you have a TSqlModel and you want to make a change to it, you have a couple of choices:&lt;/p&gt;&#xA;&lt;p&gt;- Create a new model and copy over everything&lt;br&gt;&#xA;- Use AddOrUpdateScript&lt;/p&gt;&#xA;&lt;p&gt;AddOrUpdate can only update scripts that you add (i.e. Know the name of) so if you get the model from a dacpac you are out of luck.&lt;/p&gt;</description>
    </item>
    <item>
      <title>My SQL Server Development Team Maturity Levels</title>
      <link>https://the.agilesql.club/2017/04/my-sql-server-development-team-maturity-levels/</link>
      <pubDate>Mon, 24 Apr 2017 16:21:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/04/my-sql-server-development-team-maturity-levels/</guid>
      <description>&lt;p&gt;A teams maturity shows in its choice of tools.&lt;/p&gt;&#xA;&lt;p&gt;I have seen quite a few different development teams in wildly different environments and the single fact that really stands out is that you can tell how good a team is by the tools that they use. It isn&amp;rsquo;t always the specific choice of which tools they use, although that can be important, it is the fact that they evaluate and chose to either use or ignore new tools.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SQL Server Continuous Deployment &#34;In a Box&#34;</title>
      <link>https://the.agilesql.club/2017/03/sql-server-continuous-deployment-in-a-box/</link>
      <pubDate>Tue, 07 Mar 2017 23:02:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/03/sql-server-continuous-deployment-in-a-box/</guid>
      <description>&lt;h2 id=&#34;what-is-this&#34;&gt;What is this?&lt;/h2&gt;&#xA;&lt;p&gt;Well if you read the name aloud &amp;ldquo;SQL Server Continuous Deployment in a box&amp;rdquo; then, if I have done my work correctly choosing the title for the blog, give a hint :)&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-is-the-big-idea&#34;&gt;what is the big idea?&lt;/h2&gt;&#xA;&lt;p&gt;There is really some great tooling for SQL Server - second to none really when it comes to RDBMS&amp;rsquo;s and setting up Continuous Deployment pipelines is actually pretty simple once you know which parts to plug together. I even did it in 55 minutes once (&lt;a href=&#34;https://www.youtube.com/watch?v=9YJQTx3bPek&#34;&gt;https://www.youtube.com/watch?v=9YJQTx3bPek&lt;/a&gt;).&lt;/p&gt;</description>
    </item>
    <item>
      <title>ScriptDom parsing and NoViableAltExceptions</title>
      <link>https://the.agilesql.club/2017/03/scriptdom-parsing-and-noviablealtexceptions/</link>
      <pubDate>Thu, 02 Mar 2017 22:02:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/03/scriptdom-parsing-and-noviablealtexceptions/</guid>
      <description>&lt;p&gt;If you have ever tried to debug a program that used the TSql Script Dom to parse some T-SQL you will know that the process is extremely slow and this is due to the volume of NoViableAltExceptions (and others) that are thrown and then caught. Because these are first chance exceptions they are being handled and it is the way that the script dom interacts with Antlr and the Lexer that they use. When you debug a program what happens is you have two processes, process one is the debuger, this starts (or attaches) to process two, the debugee.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SqlPackage Deploy Performance - IgnoreXX are not your friend!</title>
      <link>https://the.agilesql.club/2017/03/sqlpackage-deploy-performance-ignorexx-are-not-your-friend/</link>
      <pubDate>Thu, 02 Mar 2017 16:26:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/03/sqlpackage-deploy-performance-ignorexx-are-not-your-friend/</guid>
      <description>&lt;p&gt;Following on from yesterdays blog I was wondering about the comparison of objects that were the same and how the IgnoreWhitespace, IgnoreComments, IgnoreKeywordCasing and IgnoreSemiColonsBetweenStatements flags affected the comparison. To be fair I was only interested in IgnoreWhitespace but actually it turns out that those four are very closely related.&lt;/p&gt;&#xA;&lt;p&gt;When the deploy happens, where a script in the source and target are compared the process is:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1. Loads of things we will skip&lt;/li&gt;&#xA;&lt;li&gt;2. Any cmd variables in the scripts are replaced with their appropriate values&lt;/li&gt;&#xA;&lt;li&gt;3. If both the scripts are null - the comparison returns true. This has to be the best for performance but the worse for functionality ;)&lt;/li&gt;&#xA;&lt;li&gt;4. If one script is null but not the other then the comparison returns false. This actually has to be the best for comparison performance but worse for deploy performance!&lt;/li&gt;&#xA;&lt;li&gt;5. We then get a good old fashioned String.Equals, the standard .net compare goes: if both strings are not null and the lengths are the same do a check on each byte in the strings&lt;/li&gt;&#xA;&lt;li&gt;6. If the strings are equal we have a match, happy days no more action required&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;It is what happens if the strings do not match that it starts to get a bit more interesting, if the strings are not equal and any of those four ignore options are True then we then fall down into doing a further comparison but after the scripts have been normalized using the script dom and antlr which is an expensive operation in itself (this also happens to be my next topic!).&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSDT Deploy / Publish Performance</title>
      <link>https://the.agilesql.club/2017/03/ssdt-deploy-/-publish-performance/</link>
      <pubDate>Wed, 01 Mar 2017 18:03:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/03/ssdt-deploy-/-publish-performance/</guid>
      <description>&lt;p&gt;Publishing dacpac&amp;rsquo;s is a little bit of a pain when you have multiple databases, it can easily start to take minutes to hours to deploy changes depending on how many databases and the size of those databases. I wanted to understand more about the publish process and what we can do to speed it up as much as possible so I did some digging and this is a randomish post about how it all works and what we can do to make it faster.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSDT and Friends - .net meetup video</title>
      <link>https://the.agilesql.club/2017/02/ssdt-and-friends-.net-meetup-video/</link>
      <pubDate>Fri, 10 Feb 2017 16:38:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/02/ssdt-and-friends-.net-meetup-video/</guid>
      <description>&lt;p&gt;I did a talk at the london .net meetup if you want to get an overview of what SSDT is and how to get started then I would recommend it:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://skillsmatter.com/skillscasts/9274-londondot-net-january-meetup&#34;&gt;https://skillsmatter.com/skillscasts/9274-londondot-net-january-meetup&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;This was aimed at .net developers rather than DBA&amp;rsquo;s so there isn&amp;rsquo;t much talk about &amp;ldquo;why you should use source control&amp;rdquo; etc as everyone in the room used source control already :)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Devops without management buy in?</title>
      <link>https://the.agilesql.club/2017/02/devops-without-management-buy-in/</link>
      <pubDate>Fri, 10 Feb 2017 16:20:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2017/02/devops-without-management-buy-in/</guid>
      <description>&lt;p&gt;I was talking to someone at a meetup recently who was really keen on doing continuous deployment for their database but they had a number of issues, the main was that because management wasn&amp;rsquo;t sold on the idea and the DBA&amp;rsquo;s had complete control to push back on all and every idea he had - there was no way he could deploy continuously.&lt;/p&gt;&#xA;&lt;p&gt;The accepted route for devops is management buy-in, if you do not have management buy-in then you can&amp;rsquo;t do devops. I agree totally with this, I have seen how an executive can set the direction and all of a sudden hurdles that were there are now removed or being removed but what do you do when you don&amp;rsquo;t have management buy-in?&lt;/p&gt;</description>
    </item>
    <item>
      <title>SQLCover Fixes and Download location</title>
      <link>https://the.agilesql.club/2016/09/sqlcover-fixes-and-download-location/</link>
      <pubDate>Fri, 30 Sep 2016 16:46:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2016/09/sqlcover-fixes-and-download-location/</guid>
      <description>&lt;p&gt;There have been a couple of fixes in SQLCover this week, kindly submitted by John Mclusky (&lt;a href=&#34;https://github.com/jmclusky&#34;&gt;https://github.com/jmclusky&lt;/a&gt;):&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/GoEddie/SQLCover/issues/8&#34;&gt;Code coverage not reported correctly for CTEs at the end of a stored procedure if the &amp;lsquo;with&amp;rsquo; is immediately preceded with a semicolon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;and&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/GoEddie/SQLCover/issues/7&#34;&gt;DeclareTableVariableStatement statements cannot be covered, so report falsely as missing coverage&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;I have also changed where the releases can be downloaded from to use the github releases:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/GoEddie/SQLCover/releases&#34;&gt;https://github.com/GoEddie/SQLCover/releases&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;The previous version is still available but I would recommend the latest version.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Refactoring in SQL Server Data Tools - SSDT</title>
      <link>https://the.agilesql.club/2016/09/refactoring-in-sql-server-data-tools-ssdt/</link>
      <pubDate>Tue, 27 Sep 2016 19:23:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2016/09/refactoring-in-sql-server-data-tools-ssdt/</guid>
      <description>&lt;p&gt;In this post I will talk about the in-built refactoring support in SSDT – the language is slightly different from my normal style as originally it was going to be published else but rest assured it is written by myself&lt;/p&gt;&#xA;&lt;h3 id=&#34;what-is-refactoring&#34;&gt;What is refactoring?&lt;/h3&gt;&#xA;&lt;p&gt;In programming , the term ‘refactoring’ essentially means taking some code and improving it without adding features and without breaking the code. When we refactor code we ideally want to make small improvements over time, using an IDE that automates as many of the tasks as possible for us.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Database Deployments in Uncontrolled Environments</title>
      <link>https://the.agilesql.club/2016/09/database-deployments-in-uncontrolled-environments/</link>
      <pubDate>Tue, 20 Sep 2016 06:16:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2016/09/database-deployments-in-uncontrolled-environments/</guid>
      <description>&lt;p&gt;The ideal is to make a change and see that change deployed to production, in a perfect world we would be told to work on something, write the code + tests, deploy to a test environment, prove it works and deploy - this is the cycle time and the faster you can get this the easier many things become.&lt;/p&gt;&#xA;&lt;p&gt;The cycle time is easy to measure - it is the time the ticket arrives in the backlog to the time it moves to the done column, if your issue tracking system can&amp;rsquo;t tell you this easily then use something else! The tickets are moved into the &amp;ldquo;Done&amp;rdquo; state when they have been deployed into production - if you do nothing but investigate and try to reduce your cycle time you will make a massive difference to your development process.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Controlling a dacpac deployment</title>
      <link>https://the.agilesql.club/2016/08/controlling-a-dacpac-deployment/</link>
      <pubDate>Sun, 21 Aug 2016 21:06:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2016/08/controlling-a-dacpac-deployment/</guid>
      <description>&lt;p&gt;I have been thinking quite a lot recently (ok not that much but my thinking has changed) about how to deploy dacpac&amp;rsquo;s. In particular I am talking about how to control the deployment, what tool is used to deploy the dacpac, what connection details are passed in, which of the hundreds of parameters are passed in and how.&lt;/p&gt;&#xA;&lt;p&gt;I think that as I configured and deployed databases using dacpac&amp;rsquo;s in a number of different environments my approaches are been:&lt;/p&gt;</description>
    </item>
    <item>
      <title>tSQLt Visual Studio Test Adapter</title>
      <link>https://the.agilesql.club/2016/08/tsqlt-visual-studio-test-adapter/</link>
      <pubDate>Wed, 17 Aug 2016 16:32:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2016/08/tsqlt-visual-studio-test-adapter/</guid>
      <description>&lt;h1 id=&#34;tsqlt-visual-studio-test-adapter&#34;&gt;tSQLt Visual Studio Test Adapter&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-is-this&#34;&gt;What is this?&lt;/h2&gt;&#xA;&lt;p&gt;This lets you use Visual Studio to run tSQLt tests easily. Visual Studio has a built in framework for finding and executing tests so that if you have tSQLt tests in an SSDT project for example, although this just requires you have the .sql files in source control and does not require ssdt - you can easily see and execute your tests via the Visual Studio Test Explorer window. It is also available for use in your favorite build server via the vstest.console.exe tool or if you have vsts then you can use the default test task.&lt;/p&gt;</description>
    </item>
    <item>
      <title>DacFxed - Powershell Nugetized DacFx wrapper</title>
      <link>https://the.agilesql.club/2016/08/dacfxed-powershell-nugetized-dacfx-wrapper/</link>
      <pubDate>Tue, 02 Aug 2016 23:17:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2016/08/dacfxed-powershell-nugetized-dacfx-wrapper/</guid>
      <description>&lt;p&gt;Deploying a dacpac from powershell should be pretty easy, there is a .net api which you can use to open a dacpac, compare to a database and either create a script or get the database to look the same as the dacpac but there are a couple of problems with the approach.&lt;/p&gt;&#xA;&lt;h2 id=&#34;problem-1---is-the-dacfx-installed&#34;&gt;Problem 1 - Is the DacFx installed?&lt;/h2&gt;&#xA;&lt;p&gt;The first problem is whether the DacFx is installed, the chances are if Visual Studio or SQL Server have been installed then it will be there.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SQLCover v 0.2 - Bug fixes and Azure V12 Support</title>
      <link>https://the.agilesql.club/2016/05/sqlcover-v-0.2-bug-fixes-and-azure-v12-support/</link>
      <pubDate>Thu, 05 May 2016 23:03:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2016/05/sqlcover-v-0.2-bug-fixes-and-azure-v12-support/</guid>
      <description>&lt;p&gt;I have released a new version of SQLCover which is a code coverage tool for T-SQL (let&amp;rsquo;s you identify where you need to focus when writing tests).&lt;/p&gt;&#xA;&lt;p&gt;This includes a few minor fixes but also support for SQL Azure so if you run your test in a v12 database or higher you can now get an idea of code coverage from that.&lt;/p&gt;&#xA;&lt;p&gt;If you are interested in using this but don&amp;rsquo;t know where to start, there is a powershell script in the download (&lt;a href=&#34;https://the.agilesql.club/SQLCover/download.php&#34;&gt;https://the.agilesql.club/SQLCover/download.php&lt;/a&gt;) and if you also get reportgenerator (&lt;a href=&#34;https://github.com/danielpalme/ReportGenerator/releases/tag/v2.4.5.0&#34;&gt;https://github.com/danielpalme/ReportGenerator/releases/tag/v2.4.5.0&lt;/a&gt;):&lt;/p&gt;</description>
    </item>
    <item>
      <title>Where do you put your business logic? In stored procedures?</title>
      <link>https://the.agilesql.club/2016/05/where-do-you-put-your-business-logic-in-stored-procedures/</link>
      <pubDate>Thu, 05 May 2016 19:52:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2016/05/where-do-you-put-your-business-logic-in-stored-procedures/</guid>
      <description>&lt;p&gt;There seems to be two trains of thought and I think this is mainly down to who and where your developers are. The first is that a stored procedure or a function is a great place to put all the business logic that an application needs. The second is that no logic should be in code deployed to SQL Server at all.&lt;/p&gt;&#xA;&lt;p&gt;You can see these two extremes if you compare the difference between what stack overflow does (.Net/SQL Server &lt;strong&gt;BUT highly optimized for performance and deployments&lt;/strong&gt;) where they have no stored procedures and embed T-SQL directly in their code to the many many thousand line procedures that we see on a daily basis, this quora answer from Kevin Kline I think is extreme but not unexpected:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How do you audit automatically generated sql deployment scripts?</title>
      <link>https://the.agilesql.club/2016/05/how-do-you-audit-automatically-generated-sql-deployment-scripts/</link>
      <pubDate>Tue, 03 May 2016 16:13:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2016/05/how-do-you-audit-automatically-generated-sql-deployment-scripts/</guid>
      <description>&lt;p&gt;I saw recently an email where someone stated that the reason that they manually create deployment scripts is that because of the restirctions put on them by the requirements for auditing and the ability to be able to demonstrate exactly what was deployed at what time.&lt;/p&gt;&#xA;&lt;p&gt;When automating deployments it really makes sense to use a tool to generate the deployment so you can concentrate on writing productive code instead of deployment scripts. How do you balance the ideal of spending less time writing deployments but also ensure you can audit what happened?&lt;/p&gt;</description>
    </item>
    <item>
      <title>What is code coverage for?</title>
      <link>https://the.agilesql.club/2016/04/what-is-code-coverage-for/</link>
      <pubDate>Mon, 11 Apr 2016 06:39:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2016/04/what-is-code-coverage-for/</guid>
      <description>&lt;p&gt;Code coverage gives you an indication of how well tested a particular area is. It is not a measure of code quality and having a statement covered by a test does not mean that the code is accurate.&lt;/p&gt;&#xA;&lt;p&gt;Using code coverage you can see how risky changes are to a particular area of code. If you have a high level of code coverage you can be fairly confident in changes, if you have low code coverage in an area then when you make changes you will need be careful.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SQLCover Code Coverage for SQL Server T-SQL</title>
      <link>https://the.agilesql.club/2016/04/sqlcover-code-coverage-for-sql-server-t-sql/</link>
      <pubDate>Fri, 08 Apr 2016 15:38:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2016/04/sqlcover-code-coverage-for-sql-server-t-sql/</guid>
      <description>&lt;p&gt;Open Source code coverage tool for T-SQL, SQL Server 2008+&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-is-code-coverage&#34;&gt;What is code coverage?&lt;/h2&gt;&#xA;&lt;p&gt;Code coverage is a way to see how many statements in your database code have been executed when you ran your tests(s). It is a way to see how well covered with tests a particular area is - the better covered with tests, the less likely you will miss issues when you make changes in those areas.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Post Deploy Scripts In Composite Dacpacs not deploying</title>
      <link>https://the.agilesql.club/2016/03/post-deploy-scripts-in-composite-dacpacs-not-deploying/</link>
      <pubDate>Thu, 03 Mar 2016 17:13:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2016/03/post-deploy-scripts-in-composite-dacpacs-not-deploying/</guid>
      <description>&lt;p&gt;Composite projects in SSDT are a really useful way to logically split databases up while still being able to deploy into a database as a whole. Even if you have a fairly simple database in a single SSDT project you should put your unit tests somewhere. What I like to do is have my solution configured like:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Main.dbproj - actual production code and reference data&lt;/li&gt;&#xA;&lt;li&gt;Main.UnitTests.dbproj - unit test code + references to tSQLt etc&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The unit tests have a &amp;ldquo;Same Database&amp;rdquo; reference pointing to the main project so it is as if my tests were in the same project.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Where did january go?</title>
      <link>https://the.agilesql.club/2016/02/where-did-january-go/</link>
      <pubDate>Tue, 16 Feb 2016 16:23:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2016/02/where-did-january-go/</guid>
      <description>&lt;p&gt;I have been pretty busy over january and the first half of feburary and haven&amp;rsquo;t had time to write any blogs, I did have an article on simple talk published:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.simple-talk.com/sql/sql-tools/connected-development-with-sql-server-data-tools/&#34;&gt;https://www.simple-talk.com/sql/sql-tools/connected-development-with-sql&amp;hellip;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;A couple of exciting things did happen, firstly I was allowed back into the friends of redgate programme - I like the redgate guys and am pleased to be back! Secondly I have been accepted into the Microsoft ALM Ranger programme which means I can help deliver some tooling and documentation as part of a team instead of beavering away by myself. I am particularly pleased about the ALM Rangers as I have been thinking about who is actually interested in better development practices and automated deployments for SQL Server and whereas I did originally think it would be SQL developers, I feel that the majority of SQL devs and especially DBA&amp;rsquo;s are more focused on other things than improving their working practices so this is hopefully a way to help more people write and deploy code for SQL Server and databases in general :)&lt;/p&gt;</description>
    </item>
    <item>
      <title>T-SQL Code Coverage in SSDT using the SSDT Dev Pack</title>
      <link>https://the.agilesql.club/2016/01/t-sql-code-coverage-in-ssdt-using-the-ssdt-dev-pack/</link>
      <pubDate>Wed, 13 Jan 2016 23:20:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2016/01/t-sql-code-coverage-in-ssdt-using-the-ssdt-dev-pack/</guid>
      <description>&lt;h2 id=&#34;code-coverage&#34;&gt;Code Coverage&lt;/h2&gt;&#xA;&lt;h3 id=&#34;what-is-code-coverage&#34;&gt;What is code coverage?&lt;/h3&gt;&#xA;&lt;p&gt;When you write some code and then test it, how sure are you that you have tested the whole thing? Code coverage gives you an idea of how well tested a bit of code is.&lt;/p&gt;&#xA;&lt;p&gt;If you have lots of branches in your code (not something I am advocating) it is important to make sure you test it all so we can use code coverage to get an idea of how much of a particular piece of code has been tested (or not).&lt;/p&gt;</description>
    </item>
    <item>
      <title>What is SSDT? Part 3 - an API for me, an API for you, an API for everyone!</title>
      <link>https://the.agilesql.club/2016/01/what-is-ssdt-part-3-an-api-for-me-an-api-for-you-an-api-for-everyone/</link>
      <pubDate>Thu, 07 Jan 2016 21:14:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2016/01/what-is-ssdt-part-3-an-api-for-me-an-api-for-you-an-api-for-everyone/</guid>
      <description>&lt;p&gt;In the final part of this 3 part series on what SSDT actually is I am going to talk about the documented API. What I mean by documented is that Microsoft have published the specification to it so that it is available to use rather than the documentation is particularly good - I warn you it isn&amp;rsquo;t great but there are some places to get some help and I will point them out to you.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What is SSDT? Part 2 - More Reasons to Bother!</title>
      <link>https://the.agilesql.club/2016/01/what-is-ssdt-part-2-more-reasons-to-bother/</link>
      <pubDate>Wed, 06 Jan 2016 16:30:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2016/01/what-is-ssdt-part-2-more-reasons-to-bother/</guid>
      <description>&lt;p&gt;In part 1 of this series available &lt;a href=&#34;https://the.agilesql.club/blogs/Ed-Elliott/2016-01-05/What-Is-SSDT-Why-Should-I-Bother&#34;&gt;here&lt;/a&gt; I introduced my drawing of what I think SSDT is and talked about the first major category the development ide and how it can help us. Just to recap for each subject on the image I give a bit of blurb and then some links to further reading.&lt;/p&gt;&#xA;&lt;p&gt;In this part (part 2 would you believe) I will give an overview of the second major category which is that it is a deployment utility. What I mean by deployment utility is that we can take our code and deploy it to a SQL Server (hopefully that is fairly obvious).&lt;/p&gt;</description>
    </item>
    <item>
      <title>What is SSDT all about aka Why should I bother?</title>
      <link>https://the.agilesql.club/2016/01/what-is-ssdt-all-about-aka-why-should-i-bother/</link>
      <pubDate>Tue, 05 Jan 2016 16:53:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2016/01/what-is-ssdt-all-about-aka-why-should-i-bother/</guid>
      <description>&lt;p&gt;I often get asked the questions “What is SSDT&amp;quot; and I have wanted to have a single reference as to what it is as it is actually pretty big. To be clear I am just looking at the database projects version of SSDT what was originally SSDT rather than the BI tools that came with SSDT-BI and are now being merged with SSDT – Perhaps I will expand this to include those one day but probably not.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSDT Migrating Data Without Losing It</title>
      <link>https://the.agilesql.club/2015/12/ssdt-migrating-data-without-losing-it/</link>
      <pubDate>Wed, 30 Dec 2015 00:28:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/12/ssdt-migrating-data-without-losing-it/</guid>
      <description>&lt;p&gt;You sometimes want to do things like split a table into two or move a column into another table and when you use SSDT or the compare / merge type of deployments it can be hard to migrate the data in a single deploy as you can&amp;rsquo;t insert the data into a table that doesn&amp;rsquo;t exist and you can&amp;rsquo;t drop the data before it has bee migrated. To fix this we can use pre/post deploy scripts in SSDT. The overall process is:&lt;/p&gt;</description>
    </item>
    <item>
      <title>T-SQL Clippy</title>
      <link>https://the.agilesql.club/2015/12/t-sql-clippy/</link>
      <pubDate>Thu, 10 Dec 2015 22:09:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/12/t-sql-clippy/</guid>
      <description>&lt;p&gt;I love writing c# code using visual studio and resharper, it is a really nice experience and resharper does a lot of boiler plate stuff and offers re-writes for you that mean you can concentrate on writing the useful bits of code. T-Sql Clippy is no where near as great as resharper but hopefully starts to show what we could actually do with t-sql and ssdt :).&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-is-it&#34;&gt;What is it?&lt;/h2&gt;&#xA;&lt;p&gt;There are some things that we can do using the ScriptDom and the rest of the DacFx to help people write better t-sql code, so the things it does today is:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Automatically re-write non-sargable isnulls into sargable code in SSDT</title>
      <link>https://the.agilesql.club/2015/12/automatically-re-write-non-sargable-isnulls-into-sargable-code-in-ssdt/</link>
      <pubDate>Thu, 10 Dec 2015 21:28:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/12/automatically-re-write-non-sargable-isnulls-into-sargable-code-in-ssdt/</guid>
      <description>&lt;p&gt;&amp;ldquo;where ISNULL(column, &amp;lsquo;DontMatch&amp;rsquo;) = &amp;lsquo;Match&amp;rsquo;&amp;rdquo; - is kind of a bad thing to do in SQL as it means that any index on column can&amp;rsquo;t be used. It is a really simple thing that is a waste of time, fixing it is pretty simple but I see it a lot and so I thought it would be a perfect candidate for some SSDT Dev Pack t-sql re-writing :).&lt;/p&gt;&#xA;&lt;p&gt;So the dev pack now has the ability to re-write any non-sargable IsNull statements into ones that are sargable (if you don&amp;rsquo;t know what sargable means and you are a SQL dev, look it up, it is really important!)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Find duplicate indexes in SSDT</title>
      <link>https://the.agilesql.club/2015/11/find-duplicate-indexes-in-ssdt/</link>
      <pubDate>Fri, 27 Nov 2015 12:29:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/11/find-duplicate-indexes-in-ssdt/</guid>
      <description>&lt;h3 id=&#34;update-new-download-location-is-httpsvisualstudiogallerymsdnmicrosoftcom435e7238-0e64-4667-8980-5&#34;&gt;Update new download location is &lt;a href=&#34;https://visualstudiogallery.msdn.microsoft.com/435e7238-0e64-4667-8980-5b8a05dc7906&#34;&gt;https://visualstudiogallery.msdn.microsoft.com/435e7238-0e64-4667-8980-5&amp;hellip;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Duplicate indexes, one of the most pointless things you can do to a table that just adds pure overhead. No one likes them so SQL Developers do your DBA&amp;rsquo;s a favour and stop them from ever being deployed :)&lt;/p&gt;&#xA;&lt;p&gt;This new tool for the SSDT Dev Pack adds a menu item (Tools&amp;ndash;&amp;gt;SSDT Dev Pack &amp;ndash;&amp;gt; Find Duplicate Indexes) what it does is scan all the projects in the solution (it doesn&amp;rsquo;t follow &amp;ldquo;this database&amp;rdquo; references to examine them, maybe a future version) and then print to the output window a list of all the duplicate indexes based on the table, the columns and included columns - I don&amp;rsquo;t check anything else so you might actually want a duplicate in some circumstances but these should be very few and far between.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Convert select statements in scripts into Inline-TVFs automatically</title>
      <link>https://the.agilesql.club/2015/11/convert-select-statements-in-scripts-into-inline-tvfs-automatically/</link>
      <pubDate>Wed, 25 Nov 2015 22:42:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/11/convert-select-statements-in-scripts-into-inline-tvfs-automatically/</guid>
      <description>&lt;h3 id=&#34;update-new-download-location-is-httpsvisualstudiogallerymsdnmicrosoftcom435e7238-0e64-4667-8980-5&#34;&gt;Update new download location is &lt;a href=&#34;https://visualstudiogallery.msdn.microsoft.com/435e7238-0e64-4667-8980-5b8a05dc7906&#34;&gt;https://visualstudiogallery.msdn.microsoft.com/435e7238-0e64-4667-8980-5&amp;hellip;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;In-line TVF&amp;rsquo;s are awesome, they are a great way to reuse T-SQL code without the performance penalties of multi line TVF&amp;rsquo;s or horror of horrors Scalar Functions. Taking select statements and turning them into in-line TVF&amp;rsquo;s is actually really really simple using the TSql ScriptDom so here is another tool for the SSDT Dev Pack that lets you highlight a select statement in SSDT and generate a TVF and replace the statement with a call to the TVF.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ScriptDomVisualizer - Now Displays TSqlParserTokens</title>
      <link>https://the.agilesql.club/2015/11/scriptdomvisualizer-now-displays-tsqlparsertokens/</link>
      <pubDate>Wed, 25 Nov 2015 17:07:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/11/scriptdomvisualizer-now-displays-tsqlparsertokens/</guid>
      <description>&lt;p&gt;New ScriptDom visualizer now also shows the tokens that are found in a sql script. It also highlights the part of the query that is covered by the token so it is really easy to see where you are in the script.&lt;/p&gt;&#xA;&lt;p&gt;Honestly if you are doing anything with the T-SQL Script Dom this is really useful to help reverse engineer t-sql into ScriptDom objects :)&lt;/p&gt;&#xA;&lt;p&gt;Grab it from:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/GoEddie/ScriptDomVisualizer/tree/master/release&#34;&gt;https://github.com/GoEddie/ScriptDomVisualizer/tree/master/release&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Changing case of T-SQL Keywords</title>
      <link>https://the.agilesql.club/2015/11/changing-case-of-t-sql-keywords/</link>
      <pubDate>Tue, 24 Nov 2015 20:44:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/11/changing-case-of-t-sql-keywords/</guid>
      <description>&lt;h3 id=&#34;update-new-download-location-is-httpsvisualstudiogallerymsdnmicrosoftcom435e7238-0e64-4667-8980-5&#34;&gt;Update new download location is &lt;a href=&#34;https://visualstudiogallery.msdn.microsoft.com/435e7238-0e64-4667-8980-5b8a05dc7906&#34;&gt;https://visualstudiogallery.msdn.microsoft.com/435e7238-0e64-4667-8980-5&amp;hellip;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Bert likes his T-SQL keywords in UPPERCASE, Ernie likes his in lowercase which causes some internal struggle as it is actually one person &amp;ldquo;Mr Bert Ernie&amp;rdquo; anyway I digress, whether you are working by yourself or in a team you sometimes want to change the case of all the keywords in some code.&lt;/p&gt;&#xA;&lt;p&gt;If you are using SSDT you can use my new SSDT-DevPack tool to do it for you:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Quickly deploying procedure/functions from SSDT (Bypass Publish)</title>
      <link>https://the.agilesql.club/2015/11/quickly-deploying-procedure/functions-from-ssdt-bypass-publish/</link>
      <pubDate>Tue, 24 Nov 2015 12:28:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/11/quickly-deploying-procedure/functions-from-ssdt-bypass-publish/</guid>
      <description>&lt;p&gt;SSDT is great but one thing that is not so great is the performance of the publish. I am not complaining, I understand it does a lot and is well worth the wait when publishing however, when you are writing and testing code having this process really kills productivity:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1. Write code&lt;/li&gt;&#xA;&lt;li&gt;2. Build projects&lt;/li&gt;&#xA;&lt;li&gt;3. Publish projects&lt;/li&gt;&#xA;&lt;li&gt;4. Wait for publish to complete&lt;/li&gt;&#xA;&lt;li&gt;5. Check publish messages for errors&lt;/li&gt;&#xA;&lt;li&gt;6. Test your changes&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;If you develop like that you will be very slow so instead I have added a &amp;ldquo;Quick Deploy&amp;rdquo; to SSDT - it is nothing new, I had one before and Dave Ballyntyne had one (&lt;a href=&#34;http://dataidol.com/davebally/2014/03/01/ssdt-fast-deploy/&#34;&gt;http://dataidol.com/davebally/2014/03/01/ssdt-fast-deploy/&lt;/a&gt;) but I wanted to do a couple of things to mine, firstly add it to the SSDT-DevPack (whoop whoop) and secondly make it so you do not have to save the file to deploy any changes so it uses the Visual Studio API&amp;rsquo;s to get the contents of the current document and deploy that to a database.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using the ScriptDom without losing comments</title>
      <link>https://the.agilesql.club/2015/11/using-the-scriptdom-without-losing-comments/</link>
      <pubDate>Tue, 24 Nov 2015 00:20:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/11/using-the-scriptdom-without-losing-comments/</guid>
      <description>&lt;p&gt;The ScriptDom is cool, it lets you parse T-SQL, play around with the AST (tree of statements) and then generate T-SQL again (probably in a different format etc). This is really cool but if you round-trip the T-SQL into an AST and back you lose some important information like comments so, if you do something like:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;  &#xD; var original = @&amp;quot;create procedure [dbo].[get_employee](@employee_id int)  &#xD; as  &#xD; --ssssss&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;select 100;&lt;/p&gt;&#xA;&lt;p&gt;select * from a a1 where a1.a like &amp;lsquo;%fff%&amp;rsquo;;&lt;br&gt;&#xA;&amp;ldquo;;&lt;br&gt;&#xA;var parser = new TSql120Parser(false);&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSDT DevPack - Highlight expensive queries</title>
      <link>https://the.agilesql.club/2015/11/ssdt-devpack-highlight-expensive-queries/</link>
      <pubDate>Sun, 22 Nov 2015 22:35:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/11/ssdt-devpack-highlight-expensive-queries/</guid>
      <description>&lt;p&gt;When developing stored procedures in SSDT it is important to know when you have written a query that is potentially slow or has a high IO or CPU cost but there is no real way other than examining the the tables you are querying and understanding the data volumes and indexes whether they could be a problem.&lt;/p&gt;&#xA;&lt;p&gt;The idea of this new tool is to highlight in either yellow or red (yellow is quite expensive, red is really expensive) any statements that have a high cost. This isn&amp;rsquo;t an actual profiler so it is important to understand what it does and its limitations.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Create stub tSQLt tests in SSDT from stored procedures</title>
      <link>https://the.agilesql.club/2015/11/create-stub-tsqlt-tests-in-ssdt-from-stored-procedures/</link>
      <pubDate>Tue, 17 Nov 2015 20:51:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/11/create-stub-tsqlt-tests-in-ssdt-from-stored-procedures/</guid>
      <description>&lt;p&gt;I have released another tool as part of the ssdt dev pack, what this does is create tSQLt classes and stub tests. If you open a stored procedure in ssdt and then do &amp;ldquo;Tools&amp;ndash;&amp;gt; SSDT Dev Pack&amp;ndash;&amp;gt; Create tSQLt Class&amp;rdquo; or you can create a keyboard mapping in &amp;ldquo;tools-&amp;gt;options-&amp;gt;keyboard&amp;rdquo;, what I do on my machine is map &amp;ldquo;Tools.CreatetSQLtClass&amp;rdquo; to Ctrl+K Ctrl+S - it will create a schema with the name of your stored procedure and the correct extended property for tSQLt to register it as a test class.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Automatically name primary key constraints in SSDT</title>
      <link>https://the.agilesql.club/2015/11/automatically-name-primary-key-constraints-in-ssdt/</link>
      <pubDate>Mon, 16 Nov 2015 13:23:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/11/automatically-name-primary-key-constraints-in-ssdt/</guid>
      <description>&lt;h3 id=&#34;automatically-name-primary-key-constraints&#34;&gt;Automatically name primary key constraints&lt;/h3&gt;&#xA;&lt;p&gt;There are some things you see when writing t-sql code and schemas that just look sloppy, one of those is unnamed constraints, what you see is:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt; &#xD; create table t(  &#xD; id int not null primary key  &#xD; )  &#xD;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;The problem with this is that the primary key is given an automatic name which will look like &amp;ldquo;PK__t__3213E83F5F141958&amp;rdquo; - this means comparing database schemas for differences becomes hard as the constraints have different names.&lt;/p&gt;</description>
    </item>
    <item>
      <title>New Version of MergeUi</title>
      <link>https://the.agilesql.club/2015/11/new-version-of-mergeui/</link>
      <pubDate>Thu, 12 Nov 2015 07:41:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/11/new-version-of-mergeui/</guid>
      <description>&lt;p&gt;I have made some changes to the way MergeUi works and also moved it into a new repository (&lt;a href=&#34;https://github.com/GoEddie/SSDT-DevPack&#34;&gt;https://github.com/GoEddie/SSDT-DevPack&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;The way MergeUi used to work was that it enumerated the schemas and tables in a project and let you create a merge statement in the post-deploy script. The problem with that is that you may want to have different versions of the table for different environments or you may want to put the merge in a different script and either reference it using :r imports or not reference it at all.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to get started with the ScriptDom</title>
      <link>https://the.agilesql.club/2015/11/how-to-get-started-with-the-scriptdom/</link>
      <pubDate>Sat, 07 Nov 2015 21:29:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/11/how-to-get-started-with-the-scriptdom/</guid>
      <description>&lt;h3 id=&#34;what-is-the-scriptdom&#34;&gt;What is the ScriptDom?&lt;/h3&gt;&#xA;&lt;p&gt;The ScriptDom is an api for taking t-sql scripts, converting them into an AST or taking an AST and generating t-sql.&lt;/p&gt;&#xA;&lt;h3 id=&#34;what-is-an-ast&#34;&gt;What is an AST?&lt;/h3&gt;&#xA;&lt;p&gt;Read this: &lt;a href=&#34;https://en.wikipedia.org/wiki/Abstract_syntax_tree&#34;&gt;https://en.wikipedia.org/wiki/Abstract_syntax_tree&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Think about this:&lt;/p&gt;&#xA;&lt;p&gt;select col from tablea&lt;br&gt;&#xA;select col from tablea&lt;br&gt;&#xA;select col /*from not_table*/ from tablea&lt;br&gt;&#xA;select &amp;ndash;not_col&lt;br&gt;&#xA;col from tablea&lt;/p&gt;&#xA;&lt;p&gt;and then something more complicated like:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;  &#xD; select col from (select a as col from something /*else*/) a&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>ScriptDom Visualizer V2</title>
      <link>https://the.agilesql.club/2015/11/scriptdom-visualizer-v2/</link>
      <pubDate>Fri, 06 Nov 2015 21:56:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/11/scriptdom-visualizer-v2/</guid>
      <description>&lt;p&gt;I have made a few ui changes to this to make it a little more usable, I can&amp;rsquo;t really think of any new features so if anyone has any ideas let me know :)&lt;/p&gt;&#xA;&lt;p&gt;New version (slightly prettier):&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/GoEddie/ScriptDomVisualizer/blob/master/release/ScriptDomVisualizer.2.0.zip?raw=true&#34;&gt;https://github.com/GoEddie/ScriptDomVisualizer/blob/master/release/Scrip&amp;hellip;&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Blocking SSDT Deployments When You Dont Like Something</title>
      <link>https://the.agilesql.club/2015/11/blocking-ssdt-deployments-when-you-dont-like-something/</link>
      <pubDate>Fri, 06 Nov 2015 07:46:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/11/blocking-ssdt-deployments-when-you-dont-like-something/</guid>
      <description>&lt;p&gt;This is probably the last contributor that I am going to add to the DacFx deployment contributors project (&lt;a href=&#34;https://github.com/DacFxDeploymentContributors/Contributors/&#34;&gt;https://github.com/DacFxDeploymentContributors/Contributors/&lt;/a&gt;) for a little while, if anyone else has one they want to contribute please feel free. I have been pretty pleased with how they went but want to make the testing side better.&lt;/p&gt;&#xA;&lt;p&gt;This is an example contributor that is different to all the others in that the previous contributors enumerated the list of steps and either modified one or swapped it with another but this one uses the context object that is passed in to find all changes to stored procedures and then based on the dacpac and deployment database made a decision about whether to fail the deployment or not:&lt;/p&gt;</description>
    </item>
    <item>
      <title>SQL Server Edition aware SSDT deployment scripts</title>
      <link>https://the.agilesql.club/2015/11/sql-server-edition-aware-ssdt-deployment-scripts/</link>
      <pubDate>Thu, 05 Nov 2015 21:40:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/11/sql-server-edition-aware-ssdt-deployment-scripts/</guid>
      <description>&lt;p&gt;Another day another deployment contributor for the project: &lt;a href=&#34;https://github.com/DacFxDeploymentContributors/Contributors&#34;&gt;https://github.com/DacFxDeploymentContributors/Contributors&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This one came about because I was talking to Peter Schott (&lt;a href=&#34;http://schottsql.blogspot.co.uk/&#34;&gt;b&lt;/a&gt;|&lt;a href=&#34;https://twitter.com/paschott&#34;&gt;t&lt;/a&gt;) over at the deployment contributor &lt;a href=&#34;https://gitter.im/DacFxDeploymentContributors/Contributors&#34;&gt;gitter room&lt;/a&gt; and he has dacpac he wants to deploy to different editions of sql server and enable different options when deploying to enterprise edition.&lt;/p&gt;&#xA;&lt;p&gt;One of the things I found out is that from a contributor, although you have the source and destination models you do not have access to any information about the server other than the version. To get around this you can either pass in an arg to say which edition the compare is running against or if you leave that off then the create index statement is duplicated and wrapped on an check against @@version to determine the edition which is more t-sql than I would like but should work.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deploy SSDT INSERTS in Batches</title>
      <link>https://the.agilesql.club/2015/11/deploy-ssdt-inserts-in-batches/</link>
      <pubDate>Wed, 04 Nov 2015 11:45:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/11/deploy-ssdt-inserts-in-batches/</guid>
      <description>&lt;p&gt;I have added my first actual deployment contributor to my deployment contributor project:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/DacFxDeploymentContributors/Contributors&#34;&gt;https://github.com/DacFxDeploymentContributors/Contributors&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;The idea is basically for people to share ideas about writing deployment contributors for SSDT and help each other. If you don&amp;rsquo;t know what a deployment contributor is then you are missing a real treat. A deployment contributor lets you modify the t-sql that SSDT creates to upgrade a database from one version to the next.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ScriptDom Visualizer</title>
      <link>https://the.agilesql.club/2015/11/scriptdom-visualizer/</link>
      <pubDate>Tue, 03 Nov 2015 16:27:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/11/scriptdom-visualizer/</guid>
      <description>&lt;p&gt;Writing code to generate TSql using the ScriptDom is hard. There is a seemingly bewildering array of objects you can use and where you use different types is unclear, I think this is due to the complexity of the task, it really isn&amp;rsquo;t simple and dealing with t-sql gets complicated very quickly - to be clear the ScriptDom is a great tool and although is difficult to use is 1 million times better than writing custom parsers / generators for t-sql.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Shared SSDT Deployment Contributor Repository and Free Help</title>
      <link>https://the.agilesql.club/2015/11/shared-ssdt-deployment-contributor-repository-and-free-help/</link>
      <pubDate>Mon, 02 Nov 2015 16:26:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/11/shared-ssdt-deployment-contributor-repository-and-free-help/</guid>
      <description>&lt;p&gt;One of the best features of SSDT is deployment contributors. They are so exciting I am going to say it again with more gusto. &lt;strong&gt;One of the best features of SSDT is deployment contributors&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;What these do is let you examine or modify the deployment script that is generated when SSDT compares a project to a database.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-is-that-cool&#34;&gt;why is that cool?&lt;/h2&gt;&#xA;&lt;p&gt;Please imagine for a minute a scenario where you have used SSDT to generate a deployment script and you have looked at it and scoffed that you could have written a better upgrade script. Perhaps you have seen that it has done a table migration and uses a single insert to move all the rows from one table to the next. You have looked up from your script, gazed out of the window and dreamed of a world where instead of a single insert the insert happened in batches. You throw down your script, grab your keyboard from your desk and manually write the upgrade script. A few days later you need to do the same thing so again gaze out of the window dreaming of a batched insert script at which point you grab your keyboard and bash out another script.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Looking at SSDT upgrade scripts</title>
      <link>https://the.agilesql.club/2015/11/looking-at-ssdt-upgrade-scripts/</link>
      <pubDate>Sun, 01 Nov 2015 22:49:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/11/looking-at-ssdt-upgrade-scripts/</guid>
      <description>&lt;p&gt;I have been using SSDT seriously for a couple of years now and have really been impressed with the code that is generated to upgrade schemas and over that time have learnt to trust that SSDT generates good upgrade scripts.&lt;/p&gt;&#xA;&lt;p&gt;It is however a concern that a tool generates the deployment script rather than a person and to move to a continuous deployment environment we need to be sure that the tooling is better than a person. To be clear I am already in that camp but wanted to spend some time exploring what upgrade scripts get generated in which scenarios.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dir2Dac and github2dacpac - create dacpacs from script folders or the internet</title>
      <link>https://the.agilesql.club/2015/10/dir2dac-and-github2dacpac-create-dacpacs-from-script-folders-or-the-internet/</link>
      <pubDate>Fri, 16 Oct 2015 11:11:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/10/dir2dac-and-github2dacpac-create-dacpacs-from-script-folders-or-the-internet/</guid>
      <description>&lt;p&gt;I like writing go (golang not the batch separator) and one of the things that I like is that if you want to use something from github you literally type &amp;ldquo;go get &lt;a href=&#34;https://github.com/user/repo&#34;&gt;https://github.com/user/repo&lt;/a&gt;&amp;rdquo; and the code is downloaded and installed ready to be used.&lt;/p&gt;&#xA;&lt;p&gt;I also like write t-sql using ssdt and sometimes I want to reference other things like tSQLt or maybe a set of admin scripts or something but unlike go, to reference them what I need to do is:&lt;/p&gt;</description>
    </item>
    <item>
      <title>New SSDT Projects default to the latest version of SQL Server</title>
      <link>https://the.agilesql.club/2015/10/new-ssdt-projects-default-to-the-latest-version-of-sql-server/</link>
      <pubDate>Wed, 14 Oct 2015 16:10:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/10/new-ssdt-projects-default-to-the-latest-version-of-sql-server/</guid>
      <description>&lt;p&gt;When you create a new SSDT project it is created (at the moment) as a SQL Server 2014 project which is annoying when you are on something else.&lt;/p&gt;&#xA;&lt;p&gt;However, if after you have created the project you import the code from an existing database and check the box &amp;ldquo;Import Database Settings&amp;rdquo; it will set it to the correct version, which is much less annoying than trying to deploy, failing and fixing it and the deploying.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Video of sqlrelay talk - build a ci pipeline in 55 minutes</title>
      <link>https://the.agilesql.club/2015/10/video-of-sqlrelay-talk-build-a-ci-pipeline-in-55-minutes/</link>
      <pubDate>Fri, 09 Oct 2015 21:39:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/10/video-of-sqlrelay-talk-build-a-ci-pipeline-in-55-minutes/</guid>
      <description>&lt;p&gt;My session yesterday was recorded, apart from the fact that me and mark were having a chat for about 25 minutes before it kicked off it seemed to work quite well:&lt;/p&gt;&#xA;&lt;p&gt;Skip forward to 24:32 to get to the actual content.&lt;/p&gt;&#xA;&lt;p&gt;The lovely Mark at SQLRelay has edited the video and put it on youtube so you miss our chat at the beginning:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=9YJQTx3bPek&#34;&gt;https://www.youtube.com/watch?v=9YJQTx3bPek&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Any questions please shout!&lt;/p&gt;</description>
    </item>
    <item>
      <title>How do you choose a source control system for your SQL Server database</title>
      <link>https://the.agilesql.club/2015/10/how-do-you-choose-a-source-control-system-for-your-sql-server-database/</link>
      <pubDate>Fri, 09 Oct 2015 15:43:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/10/how-do-you-choose-a-source-control-system-for-your-sql-server-database/</guid>
      <description>&lt;p&gt;If you already have a source code repository for your app code or other databases or you have another team that uses source control then just use theirs.&lt;/p&gt;&#xA;&lt;p&gt;If you don&amp;rsquo;t then use whatever the members of your team have used most, they all basically do the same thing and having your database under source control is a million times better than not having it under source control.&lt;/p&gt;&#xA;&lt;p&gt;There is an exception, if you use visual source safe and I know people do still use it then use something else, it hasn&amp;rsquo;t had a release in over 10 years and in my opinion is no longer fit for purpose, especially when you consider the other free options available to you.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SQLRelay Reading - Build a CI Pipeline in 55 Minutes Talk</title>
      <link>https://the.agilesql.club/2015/10/sqlrelay-reading-build-a-ci-pipeline-in-55-minutes-talk/</link>
      <pubDate>Fri, 09 Oct 2015 15:29:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/10/sqlrelay-reading-build-a-ci-pipeline-in-55-minutes-talk/</guid>
      <description>&lt;p&gt;I had a lot of fun yesterday presenting my talk on how to go from not having your database in version control to deploying to a CI database, running unit tests and generating deployment scripts for a QA/Prod database so effectively how to build a fully functioning continuous delivery process for SQL Server databases in less than an hour (my wittering was about 40 minutes and the demo just over 10).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deployment Contributor Logger</title>
      <link>https://the.agilesql.club/2015/09/deployment-contributor-logger/</link>
      <pubDate>Wed, 30 Sep 2015 15:47:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/09/deployment-contributor-logger/</guid>
      <description>&lt;h3 id=&#34;niche-tool-of-the-day&#34;&gt;Niche tool of the day&lt;/h3&gt;&#xA;&lt;p&gt;If you know what a deployment contributor is and have wanted to see what steps were in a plan and have got bored setting a breakpoint in visual studio and using the watch window or something to display the steps in a plan, you might find this useful.&lt;/p&gt;&#xA;&lt;p&gt;It is really simple, all it does it look through all the steps in a deployment plan and dumps (Console.WriteLine) the steps, any properties it can find and some custom bits like the T-SQL that makes up the step.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deployment Contributor KeepTableColumns Filter</title>
      <link>https://the.agilesql.club/2015/09/deployment-contributor-keeptablecolumns-filter/</link>
      <pubDate>Wed, 23 Sep 2015 20:52:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/09/deployment-contributor-keeptablecolumns-filter/</guid>
      <description>&lt;p&gt;To help with this scenario (it is pretty specific):&lt;/p&gt;&#xA;&lt;p&gt;You have a table that has columns that you do not know about when you create the dacpac, possibly you have a customer who modifies your schema after you deploy. If you deploy your dacpac those columns will be dropped which is bad and you don&amp;rsquo;t want to completely ignore all changes to a table what do you do?&lt;/p&gt;&#xA;&lt;p&gt;You can now use the new version of my deployment contributor with a filter like SqlPackageFilter=KeepTableColumns(Employees)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Inside an SSDT Deployment Contributor</title>
      <link>https://the.agilesql.club/2015/09/inside-an-ssdt-deployment-contributor/</link>
      <pubDate>Wed, 23 Sep 2015 20:24:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/09/inside-an-ssdt-deployment-contributor/</guid>
      <description>&lt;p&gt;In my deployment filter I have been asked a couple of times to allow columns that exist on a table that do not exist in a dacpac to be ignored so that they are deleted. The typical scenario is that a vendor supplies a database and then customers can add extra columns (I know what a horrible place to be but it happens).&lt;/p&gt;&#xA;&lt;p&gt;I had a look at this and my first thought was that if we use the deployment filter and add an IgnoreType(SqlColumn) that it would work but it obviously doesn&amp;rsquo;t. What I ended up doing is adding a new filter type specifically for table columns and it actually turned out to be quite an interesting jaunt into the ScriptDom and Microsoft.Data.Tools.Schema.Sql.dll so I thought I would blog it because it also strays into understanding how the DacFx builds the deployment scripts for changes to tables (when do you get an Alter Table Add Column and when do you get a Create/Insert/Drop Table).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Setting up a new CI server to build SSDT projects</title>
      <link>https://the.agilesql.club/2015/09/setting-up-a-new-ci-server-to-build-ssdt-projects/</link>
      <pubDate>Wed, 23 Sep 2015 10:37:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/09/setting-up-a-new-ci-server-to-build-ssdt-projects/</guid>
      <description>&lt;p&gt;I am going to ignore the fact that people don&amp;rsquo;t want to install visual studio on a build server, in the future there will likely be a way to install just the required components rather than everything. Today, the way I see it is that I develop in Visual Studio, I am happy to install Visual Studio on the build server for me Visual Studio is as dependency for SSDT.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ScriptDom versioning issues</title>
      <link>https://the.agilesql.club/2015/09/scriptdom-versioning-issues/</link>
      <pubDate>Tue, 15 Sep 2015 06:07:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/09/scriptdom-versioning-issues/</guid>
      <description>&lt;p&gt;I installed the 2016 SSMS client recently and in one way or another any of my apps that I have written that use the DacFx ScriptDom have all broken in slightly different ways. One app throws a type conversion error and another just failed to find any statements in a batch.&lt;/p&gt;&#xA;&lt;p&gt;When I started debugging the problem I noticed that I got this when I started one of the apps from Visual Studion:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why is my tSQLt test not running?</title>
      <link>https://the.agilesql.club/2015/09/why-is-my-tsqlt-test-not-running/</link>
      <pubDate>Thu, 10 Sep 2015 15:31:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/09/why-is-my-tsqlt-test-not-running/</guid>
      <description>&lt;p&gt;I wrote a test earlier and forgot one of the two cardinal rules about tSQLt so I was running my test suite and the test did not run, I re-deployed and it still didn&amp;rsquo;t run so I thought I would create this handy list of things to check that mean that even when the tests exist in the database they do not run:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Are the tests in a schema that has the tSQLt test class extended property?&lt;/li&gt;&#xA;&lt;li&gt;Does the name of the test start with the word &amp;ldquo;test&amp;rdquo;? If it doesn&amp;rsquo;t then it will not actually run&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Test schema extended property&lt;/p&gt;</description>
    </item>
    <item>
      <title>Slides for my pass virtualisation virtual chapter talk on how sql fits into a containered world</title>
      <link>https://the.agilesql.club/2015/09/slides-for-my-pass-virtualisation-virtual-chapter-talk-on-how-sql-fits-into-a-containered-world/</link>
      <pubDate>Thu, 10 Sep 2015 06:31:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/09/slides-for-my-pass-virtualisation-virtual-chapter-talk-on-how-sql-fits-into-a-containered-world/</guid>
      <description>&lt;p&gt;The slides are up:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/GoEddie/SQL-Server-Containers&#34;&gt;https://github.com/GoEddie/SQL-Server-Containers&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Any questions shout!&lt;/p&gt;</description>
    </item>
    <item>
      <title>We can do professional SQL Server deployments using SSDT</title>
      <link>https://the.agilesql.club/2015/09/we-can-do-professional-sql-server-deployments-using-ssdt/</link>
      <pubDate>Wed, 02 Sep 2015 15:16:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/09/we-can-do-professional-sql-server-deployments-using-ssdt/</guid>
      <description>&lt;p&gt;Really excited by my first post on medium, haven&amp;rsquo;t really used it before but found it to be a really nice tool:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://medium.com/@edelliott.the.agilesql.club/let-s-start-doing-professional-sql-server-deployments-6ebb5a3718ec&#34;&gt;https://medium.com/@edelliott.the.agilesql.club/let-s-start-doing-profes&amp;hellip;&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Slides and Demos for SQLSupper August meeting</title>
      <link>https://the.agilesql.club/2015/08/slides-and-demos-for-sqlsupper-august-meeting/</link>
      <pubDate>Wed, 26 Aug 2015 12:30:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/08/slides-and-demos-for-sqlsupper-august-meeting/</guid>
      <description>&lt;p&gt;Last night I had a lot of fun presenting on one of my favorite topics, MARS and SQL Server protocols including a rather fun live demo.&lt;/p&gt;&#xA;&lt;p&gt;The slides and demo apps are available: &lt;a href=&#34;https://github.com/GoEddie/SQLSupper-WhenMarsAttacks&#34;&gt;https://github.com/GoEddie/SQLSupper-WhenMarsAttacks&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;If anyone wants to know more about MARS or TDS feel free to contact me as always :)&lt;/p&gt;</description>
    </item>
    <item>
      <title>I dont use the Visual Studio SSDT Publish</title>
      <link>https://the.agilesql.club/2015/08/i-dont-use-the-visual-studio-ssdt-publish/</link>
      <pubDate>Wed, 19 Aug 2015 06:23:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/08/i-dont-use-the-visual-studio-ssdt-publish/</guid>
      <description>&lt;p&gt;I see questions pretty regularly on stack overflow and the ssdt msdn forum that is some variation on &amp;ldquo;I am doing a publish through visual studio and it doesn&amp;rsquo;t quite do what I want&amp;rdquo; or &amp;ldquo;I want to publish the database when I press F5 except when I don&amp;rsquo;t want it to publish&amp;rdquo;. The second variation I particularly enjoy because I have always though that what I want is a computer that I can think something and it will do it - I guess we are a little way off but one day hopefully that will be possible.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ignore a warning on a dacpac reference at your peril</title>
      <link>https://the.agilesql.club/2015/08/ignore-a-warning-on-a-dacpac-reference-at-your-peril/</link>
      <pubDate>Mon, 17 Aug 2015 15:28:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/08/ignore-a-warning-on-a-dacpac-reference-at-your-peril/</guid>
      <description>&lt;p&gt;I worked on a project where we had two SSDT projects with different versions of SQL, one 2012 and one 2008. The 2012 project referenced the 2008 project as a &amp;ldquo;this database&amp;rdquo; reference and while this seemed like it worked, the reference in solution explorer had a little warning sign and it caused nothing but problems.&lt;/p&gt;&#xA;&lt;p&gt;The first thing was that the reference didn&amp;rsquo;t work on anyone else&amp;rsquo;s machine when they checked out the solution, the other developers had to delete and re-add the reference once., Once it had been done at least once it always worked after that which is the first odd thing.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Shared databases or private databases?</title>
      <link>https://the.agilesql.club/2015/08/shared-databases-or-private-databases/</link>
      <pubDate>Mon, 17 Aug 2015 06:53:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/08/shared-databases-or-private-databases/</guid>
      <description>&lt;p&gt;Traditionally database developers have shared a database and while this certainly made sense when everyone had a limited amount of ram and a few hundred megabytes of hard disk space it has been a while since we have had a development machines without enough resources to easily run a few copies of visual studio and SQL Server - if this isn&amp;rsquo;t the case then you really need to re-evaluate the cost of a new machine versus the cost of developers time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>AdventureworksCI Step 5 Adding tSQLt to the solution</title>
      <link>https://the.agilesql.club/2015/07/adventureworksci-step-5-adding-tsqlt-to-the-solution/</link>
      <pubDate>Wed, 22 Jul 2015 22:43:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/07/adventureworksci-step-5-adding-tsqlt-to-the-solution/</guid>
      <description>&lt;p&gt;This is part of a series on how to take the Adventureworks database and bring it in line with modern standards. How do we put a legacy SQL Server database into source control? What issues do we face and how hard is it? Then how do we build a continuous integration pipeline and possibly move towards continuous deployment. This series takes a look at how we achieve this whilst also implementing some coding standards and making an imperfect database a little bit better.&lt;/p&gt;</description>
    </item>
    <item>
      <title>AdventureworksCI Step 4 Pushing to GitHub</title>
      <link>https://the.agilesql.club/2015/07/adventureworksci-step-4-pushing-to-github/</link>
      <pubDate>Wed, 22 Jul 2015 06:40:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/07/adventureworksci-step-4-pushing-to-github/</guid>
      <description>&lt;p&gt;This is part of a series on how to take the Adventureworks database and bring it in line with modern standards. How do we put a legacy SQL Server database into source control? What issues do we face and how hard is it? Then how do we build a continuous integration pipeline and possibly move towards continuous deployment. This series takes a look at how we achieve this whilst also implementing some coding standards and making an imperfect database a little bit better.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Keep your environments in-sync and your upgrade scripts fresh</title>
      <link>https://the.agilesql.club/2015/07/keep-your-environments-in-sync-and-your-upgrade-scripts-fresh/</link>
      <pubDate>Tue, 21 Jul 2015 06:38:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/07/keep-your-environments-in-sync-and-your-upgrade-scripts-fresh/</guid>
      <description>&lt;p&gt;Whether we use a tool to generate upgrade scripts or we write manual test scripts for database changes there are a few things that we should bear in mind to ensure we do not break existing databases.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-is-it-important&#34;&gt;Why is it important?&lt;/h2&gt;&#xA;&lt;p&gt;When you upgrade an application you just compile and then deploy the code in a single operation, the old code is removed and the new code put in place, simple.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pre-Compare &amp; Pre-Deployment Scripts to SSDT</title>
      <link>https://the.agilesql.club/2015/07/pre-compare-pre-deployment-scripts-to-ssdt/</link>
      <pubDate>Mon, 20 Jul 2015 15:56:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/07/pre-compare-pre-deployment-scripts-to-ssdt/</guid>
      <description>&lt;p&gt;When you use SSDT to deploy database changes you can include a pre/post deploy script which is run after the dacpac and database has been deployed. The process looks like:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1. sqlpackage.exe compares dacpac to database&lt;/li&gt;&#xA;&lt;li&gt;2. sqlpackage.exe generates a deploy script&lt;/li&gt;&#xA;&lt;li&gt;3. sqlpackage.exe runs pre-deployment script&lt;/li&gt;&#xA;&lt;li&gt;4. sqlpackage.exe runs deploy script (generated in step 2)&lt;/li&gt;&#xA;&lt;li&gt;5. sqlpackage.exe runs post-deploy script&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;This happens whether you get sqlpackage.exe to do the deployment or whether you generate a script for later deployment.&lt;/p&gt;</description>
    </item>
    <item>
      <title>WaitForSql (to start)</title>
      <link>https://the.agilesql.club/2015/07/waitforsql-to-start/</link>
      <pubDate>Fri, 17 Jul 2015 13:07:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/07/waitforsql-to-start/</guid>
      <description>&lt;p&gt;In the spirit of having apps that do just one thing I have put a really small .net app on github that tries to create a connection to a SQL Server database and just keeps retrying until it is available:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/GoEddie/WaitForSQL&#34;&gt;https://github.com/GoEddie/WaitForSQL&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;what-huh&#34;&gt;What? Huh?&lt;/h3&gt;&#xA;&lt;p&gt;If you have a CI build and you start a new instance or database or azure db etc it can take different amounts of time to be available so this just sits trying until it can get a valid connection and you can continue your CI loveliness.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Layer a database into a SQL Server container</title>
      <link>https://the.agilesql.club/2015/07/layer-a-database-into-a-sql-server-container/</link>
      <pubDate>Wed, 08 Jul 2015 22:06:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/07/layer-a-database-into-a-sql-server-container/</guid>
      <description>&lt;p&gt;In my previous post on running SQL Server in a container I showed how you could use the Spoon (&lt;a href=&#34;https://spoon.net&#34;&gt;https://spoon.net&lt;/a&gt;) products to start an instance of SQL Server without having to install it: &lt;a href=&#34;https://the.agilesql.club/Blog/Ed-Elliott/Containers/Run-SQL-Server-In-A-Container-Today-July-2015&#34;&gt;https://the.agilesql.club/Blog/Ed-Elliott/Containers/Run-SQL-Server-In-A&amp;hellip;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;In this post I am going to talk about images and how to layer them together and why SQL Server is perfect for this sort of container technology!&lt;/p&gt;&#xA;&lt;h3 id=&#34;what-is-an-image&#34;&gt;What is an image&lt;/h3&gt;&#xA;&lt;p&gt;An image is the files and registry keys that make up an application, the sqlserver/sqlserver2012-express image was created by taking taking all of the files and registry keys that were added to a machine during the SQL Server install. This normally happens using Spoon Studio which takes a snapshot of the system, you then do your install and configure SQL Server (or whatever app it is) however you like and then you take a post snapshot, Spoon Studio gathers all the changes and creates an image.&lt;/p&gt;</description>
    </item>
    <item>
      <title>AdventureworksCI Step 3 Handling data with SSDT</title>
      <link>https://the.agilesql.club/2015/07/adventureworksci-step-3-handling-data-with-ssdt/</link>
      <pubDate>Tue, 07 Jul 2015 18:53:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/07/adventureworksci-step-3-handling-data-with-ssdt/</guid>
      <description>&lt;p&gt;This is part of a series on how to take the Adventureworks database and bring it in line with modern standards. How do we put a legacy SQL Server database into source control? What issues do we face and how hard is it? Then how do we build a continuous integration pipeline and possibly move towards continuous deployment. This series takes a look at how we achieve this whilst also implementing some coding standards and making an imperfect database a little bit better.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Run SQL Server In A Container Today July 2015</title>
      <link>https://the.agilesql.club/2015/07/run-sql-server-in-a-container-today-july-2015/</link>
      <pubDate>Tue, 07 Jul 2015 09:33:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/07/run-sql-server-in-a-container-today-july-2015/</guid>
      <description>&lt;p&gt;Containers are one of the big things at the moment, Microsoft has recently announced that they will be bringing official support to Windows. While this is great news it is unlikely to be something most IT departments can use in the near term mainly because it takes time for everyone to get up to date with the latest version of windows, which in this case, is still to be written.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Download SSMS, SSDT or SSDT-BI</title>
      <link>https://the.agilesql.club/2015/06/download-ssms-ssdt-or-ssdt-bi/</link>
      <pubDate>Tue, 30 Jun 2015 19:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/06/download-ssms-ssdt-or-ssdt-bi/</guid>
      <description>&lt;p&gt;It is a constant source of frustration for some people that it is hard to download SSDT or SSDT-BI or you download the wrong thing.&lt;/p&gt;&#xA;&lt;p&gt;This is an example of some frustration: &lt;a href=&#34;https://social.msdn.microsoft.com/Forums/sqlserver/en-US/c82354d0-2f88-49a0-9c99-66bf61206a9c/how-the-hell-i-can-install-ssdt-bi-on-sql-2014?forum=ssdt&#34;&gt;https://social.msdn.microsoft.com/Forums/sqlserver/en-US/c82354d0-2f88-4&amp;hellip;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Anyway, this is now sorted as there is a single page to download SSMS or SSDT:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://msdn.microsoft.com/en-us/library/mt238365.aspx?f=255&amp;amp;MSPPError=-2147217396&#34;&gt;https://msdn.microsoft.com/en-us/library/mt238365.aspx?f=255&amp;amp;MSPPError=-&amp;hellip;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;and SSDT and SSDT-BI:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://msdn.microsoft.com/en-us/library/mt204009.aspx&#34;&gt;https://msdn.microsoft.com/en-us/library/mt204009.aspx&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Feel free to grab Preview or RTM versions!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why does sqlpackage.exe not compare after the pre deployment script has run?</title>
      <link>https://the.agilesql.club/2015/06/why-does-sqlpackage.exe-not-compare-after-the-pre-deployment-script-has-run/</link>
      <pubDate>Wed, 24 Jun 2015 16:55:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/06/why-does-sqlpackage.exe-not-compare-after-the-pre-deployment-script-has-run/</guid>
      <description>&lt;p&gt;It isn&amp;rsquo;t a Pre compare script&lt;/p&gt;&#xA;&lt;p&gt;When you use SSDT to deploy your dacpac, a pre deployment script lets you run some T-SQL scripts before the script which brings your database up to date with your dacpac.&lt;/p&gt;&#xA;&lt;p&gt;The important thing to note is that the process is:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;sqlpackage compares the dacpac to the database&lt;/li&gt;&#xA;&lt;li&gt;sqlpackage generates a list of changes to make&lt;/li&gt;&#xA;&lt;li&gt;sqlpackage generates the T-SQL statements to make those changes&lt;/li&gt;&#xA;&lt;li&gt;sql package either creates a script for later execution or deploys the changes&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The script that is created *or* is executed contains, 0 or 1 pre deployment scripts, the statements to generate the required changes and then 0 or 1 post deployment scripts.&lt;/p&gt;</description>
    </item>
    <item>
      <title>AdventureWorksCI Step 2 From MDF to Dot Sql Files</title>
      <link>https://the.agilesql.club/2015/06/adventureworksci-step-2-from-mdf-to-dot-sql-files/</link>
      <pubDate>Mon, 22 Jun 2015 21:29:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/06/adventureworksci-step-2-from-mdf-to-dot-sql-files/</guid>
      <description>&lt;p&gt;This is part of a series on how to take the Adventureworks database and bring it in line with modern standards. How do we put a legacy SQL Server database into source control? What issues do we face and how hard is it? Then how do we build a continuous integration pipeline and possibly move towards continuous deployment. This series takes a look at how we achieve this whilst also implementing some coding standards and making an imperfect database a little bit better.&lt;/p&gt;</description>
    </item>
    <item>
      <title>AdventureWorksCI Step 1 planning</title>
      <link>https://the.agilesql.club/2015/06/adventureworksci-step-1-planning/</link>
      <pubDate>Fri, 12 Jun 2015 06:39:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/06/adventureworksci-step-1-planning/</guid>
      <description>&lt;p&gt;This is part of a series on how to take the Adventureworks database and bring it inline with modern standards. How do we put a legacy SQL Server database into source control? What issues do we face and how hard is it? Then how do we build a continuous integration pipeline and possibly move towards continuous deployment. This series takes a look at how we achieve this whilst also implementing some coding standards and making an imperfect database a little bit better.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A reference implementation of a continuous integration pipeline for legacy SQL Server databases</title>
      <link>https://the.agilesql.club/2015/06/a-reference-implementation-of-a-continuous-integration-pipeline-for-legacy-sql-server-databases/</link>
      <pubDate>Wed, 10 Jun 2015 00:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/06/a-reference-implementation-of-a-continuous-integration-pipeline-for-legacy-sql-server-databases/</guid>
      <description>&lt;h3 id=&#34;what-am-i-doing&#34;&gt;What am I doing?&lt;/h3&gt;&#xA;&lt;p&gt;Creating a publically available version of the adventureworks 2012 oltp database but by putting it under source control, implementing unit tests and improving the design and code to fit modern development guidelines.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why&#34;&gt;Why?&lt;/h3&gt;&#xA;&lt;p&gt;There are two aims, firstly to show how to take an existing database and safely get it into source control. Once it is under source control we can start to document how it works and write unit tests which will allow us to make changes to it knowing that we are not breaking backwards compatibility or losing any functionality.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why is SSDT so slow?</title>
      <link>https://the.agilesql.club/2015/06/why-is-ssdt-so-slow/</link>
      <pubDate>Tue, 02 Jun 2015 18:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/06/why-is-ssdt-so-slow/</guid>
      <description>&lt;p&gt;I see the same question again and again &amp;ldquo;I am using SSDT but it takes a long time to publish changes, how do I make it faster?&amp;rdquo; or the ever useful &amp;ldquo;SSDT is too slow&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://the.agilesql.club/assets/downloads/download.php?path=BOOHOOHOO.png&#34; alt=&#34;SSDT is slower than the alternatives at publishing changes because it does so many cool things&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Anyone who has used SSDT knows that doing a publish can take time, how much time typically varies depending on a number of factors:&lt;/p&gt;</description>
    </item>
    <item>
      <title>MergeUi is on github.com</title>
      <link>https://the.agilesql.club/2015/05/mergeui-is-on-github.com/</link>
      <pubDate>Thu, 21 May 2015 06:17:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/05/mergeui-is-on-github.com/</guid>
      <description>&lt;p&gt;I have put the code for MergeUi on github now:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/GoEddie/MergeUi&#34;&gt;https://github.com/GoEddie/MergeUi&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;That is all.&lt;/p&gt;</description>
    </item>
    <item>
      <title>MergUi 0.1.9</title>
      <link>https://the.agilesql.club/2015/05/mergui-0.1.9/</link>
      <pubDate>Wed, 20 May 2015 18:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/05/mergui-0.1.9/</guid>
      <description>&lt;h3 id=&#34;what-is-mergeui&#34;&gt;What is MergeUi?&lt;/h3&gt;&#xA;&lt;p&gt;A Visual Studio Addin to create and edit MERGE statements in SSDT projects.&lt;/p&gt;&#xA;&lt;h3 id=&#34;what-have-you-done&#34;&gt;What have you done?&lt;/h3&gt;&#xA;&lt;p&gt;I have released a new version of MergeUi, thanks to Luca Zavarella for prodding me into getting this release out and for pointing out some bugs!&lt;/p&gt;&#xA;&lt;p&gt;This has a number of bug fixes and a new UI, the old one was pretty ugly, although this still isn&amp;rsquo;t 100% perfect but it should be more usable.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Putting the ORM debate to bed</title>
      <link>https://the.agilesql.club/2015/05/putting-the-orm-debate-to-bed/</link>
      <pubDate>Wed, 20 May 2015 16:41:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/05/putting-the-orm-debate-to-bed/</guid>
      <description>&lt;p&gt;Hopefully this should put the ORM debate to bed, either use an ORM or don&amp;rsquo;t but please don&amp;rsquo;t access tables directly&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://the.agilesql.club/assets/downloads/download.php?path=ORMorNoORM.png&#34; alt=&#34;Accessing tables directly is a Sad Face using procs is a Happy Face&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;There are obviously reasons behind all of this but if you follow this golden rule you will have a happy DBA and user base.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;comments&#34;&gt;Comments:&lt;/h3&gt;&#xA;&lt;p&gt;Anonymous&lt;/p&gt;&#xA;&lt;p&gt;May 21, 2015 - 17:28&lt;/p&gt;&#xA;&lt;h3 id=&#34;well---no-one-wants-a-sad&#34;&gt;well - no one wants a sad&lt;/h3&gt;&#xA;&lt;p&gt;well - no one wants a sad panda.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Approaches to deploying Sql Server database code</title>
      <link>https://the.agilesql.club/2015/04/approaches-to-deploying-sql-server-database-code/</link>
      <pubDate>Mon, 27 Apr 2015 22:10:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/04/approaches-to-deploying-sql-server-database-code/</guid>
      <description>&lt;p&gt;When you deploy your Sql Server code, there are two approaches, there is the manual way and the automated &amp;ldquo;compare &amp;amp; deploy&amp;rdquo; way.&lt;/p&gt;&#xA;&lt;h2 id=&#34;manual&#34;&gt;Manual&lt;/h2&gt;&#xA;&lt;p&gt;The manual way is where you track what changes you have made and when you want to release, build a script or set of scripts which contain the updates. If you are modifying objects then you should use alter or drop/create and you need to manually create rollback scripts (should you need them).&lt;/p&gt;</description>
    </item>
    <item>
      <title>BIML is better even for simple packages</title>
      <link>https://the.agilesql.club/2015/04/biml-is-better-even-for-simple-packages/</link>
      <pubDate>Mon, 27 Apr 2015 21:24:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/04/biml-is-better-even-for-simple-packages/</guid>
      <description>&lt;p&gt;BIML, you either love it or hate it - either you use it to totally generate hundreds of packages or a bucket load of data flow components all at the push of a button or you are perfectly happy using the SSIS editor, you can see how the package is made up and drag the little lines from one task to another and it is simple right, why bother using xml that is more complicated, you only need to create a single package with a few tasks on it, maybe a script component here or there.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sql Saturday Talk</title>
      <link>https://the.agilesql.club/2015/04/sql-saturday-talk/</link>
      <pubDate>Sat, 25 Apr 2015 11:26:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/04/sql-saturday-talk/</guid>
      <description>&lt;p&gt;I had the honour of talking at the excellent Sql Saturday Exeter this morning and wanted to share my slides and say thanks to the organisers, sponsors and everyone who came along to my session - I really enjoyed it and I hope you did to.&lt;/p&gt;&#xA;&lt;p&gt;The slides are available:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://the.agilesql.club/assets/talks/sqlsat15/SC-SSDT-CI.pptx&#34;&gt;https://the.agilesql.club/assets/talks/sqlsat15/SC-SSDT-CI.pptx&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Enjoy!&lt;/p&gt;</description>
    </item>
    <item>
      <title>What Permissions do I need to generate a deploy script with SSDT?</title>
      <link>https://the.agilesql.club/2015/04/what-permissions-do-i-need-to-generate-a-deploy-script-with-ssdt/</link>
      <pubDate>Tue, 21 Apr 2015 21:28:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/04/what-permissions-do-i-need-to-generate-a-deploy-script-with-ssdt/</guid>
      <description>&lt;p&gt;It is sometimes useful to be able to use sqlpackage.exe to create a script that can be deployed manually or still automatically but at a later date plus you may not want to give the user or process that does this sysadmin permissions just so that it can generate a deploy script. The permissions you need in this case are:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;SELECT permissions on dbo.__Refactorlog&lt;/p&gt;&#xA;&lt;p&gt;VIEW DEFINITION at the database level&lt;/p&gt;</description>
    </item>
    <item>
      <title>HOWTO-Get-T-SQL-Into-SSDT</title>
      <link>https://the.agilesql.club/2015/04/howto-get-t-sql-into-ssdt/</link>
      <pubDate>Wed, 08 Apr 2015 21:45:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/04/howto-get-t-sql-into-ssdt/</guid>
      <description>&lt;p&gt;Ok so you have created an SSDT project and are currently congratulating yourself on how awesome and cool you are but then you realise that your project is like an empty void, completely devoid of any emotion, love or joy - there is no schema and code in the project and you have all that lovely T-SQL sitting in a database, now how the hell do you get it into SSDT?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Generating tSQLt tests from a dacpac</title>
      <link>https://the.agilesql.club/2015/04/generating-tsqlt-tests-from-a-dacpac/</link>
      <pubDate>Thu, 02 Apr 2015 21:37:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/04/generating-tsqlt-tests-from-a-dacpac/</guid>
      <description>&lt;h2 id=&#34;update&#34;&gt;UPDATE&lt;/h2&gt;&#xA;&lt;p&gt;I went and built this into my add-in for SSDT, more details &lt;a href=&#34;https://the.agilesql.club/blog/Ed-Elliott/2015-11-17/Create-Stub-tSQLt-tests-in-SSDT-from-stored-procedures&#34;&gt;https://the.agilesql.club/blog/Ed-Elliott/2015-11-17/Create-Stub-tSQLt-t&amp;hellip;&lt;/a&gt; and &lt;a href=&#34;https://the.agilesql.club/Projects/SSDT-Dev-Pack&#34;&gt;https://the.agilesql.club/Projects/SSDT-Dev-Pack&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;generating-tsqlt-tests-from-a-dacpac&#34;&gt;Generating tSQLt tests from a dacpac&lt;/h2&gt;&#xA;&lt;p&gt;I use SSDT and tSQLt in my work and I am always interested in productivity tools to help speed up development and make it more streamlined, if there is something that can help us develop better or faster then we should use it.&lt;/p&gt;&#xA;&lt;p&gt;I have been a great fan of the DacFx for a while and the sample Dacpac Explorer seems to get quite a lot of visits with one mention from ms devs internally using it as a learning reference!&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSDT Myths 1 - SSDT only works with TFS</title>
      <link>https://the.agilesql.club/2015/04/ssdt-myths-1-ssdt-only-works-with-tfs/</link>
      <pubDate>Thu, 02 Apr 2015 16:47:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/04/ssdt-myths-1-ssdt-only-works-with-tfs/</guid>
      <description>&lt;p&gt;I was reading a white paper from a Sql Server tools vendor about how to integrate their tools with SSDT and while it was very interesting there were a couple of inaccuracies and I wanted to clear one of them up and also to help people understand that although SSDT is integrated to Visual Studio it is not tied to it in any way to TFS. You can use SSDT with any source code provider such as TFS, Git, Mercurial, Svn or Source Safe etc although you really should not use source safe for anything as it is the least likely tool to keep your source safe!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Free Professional Advice on Setting up Continuous Integration for Sql Server Databases</title>
      <link>https://the.agilesql.club/2015/03/free-professional-advice-on-setting-up-continuous-integration-for-sql-server-databases/</link>
      <pubDate>Thu, 19 Mar 2015 21:49:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/03/free-professional-advice-on-setting-up-continuous-integration-for-sql-server-databases/</guid>
      <description>&lt;h2 id=&#34;calling-all-londonsussex-sql-developers-does-this-sound-like-you&#34;&gt;Calling all London/Sussex Sql Developers does this sound like you?&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Would you like to set up Continuous Integration or Continuous Deployment&lt;/li&gt;&#xA;&lt;li&gt;Do you want to get your databases under source control&lt;/li&gt;&#xA;&lt;li&gt;Have a high code coverage of your app but zero tests for your database code?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Maybe you have thought how good it would be but you are a little lost at the options available, do you use SSDT and SqlPackage to deploy or SSMS with the Redgate source control addin, how do you deploy your code to different environments safely?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Unit Test Sql Server Code</title>
      <link>https://the.agilesql.club/2015/03/unit-test-sql-server-code/</link>
      <pubDate>Tue, 03 Mar 2015 18:25:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/03/unit-test-sql-server-code/</guid>
      <description>&lt;p&gt;In part 3 of this series of blogs on &amp;ldquo;getting more agile&amp;rdquo; I am going to look at unit testing and why we need to do it.&lt;/p&gt;&#xA;&lt;h1 id=&#34;my-code-is-perfect-i-need-no-stinking-tests&#34;&gt;My code is perfect, I need no stinking tests&lt;/h1&gt;&#xA;&lt;p&gt;Ah you are like me, my code is perfect as well, good point. blog end.&lt;/p&gt;&#xA;&lt;p&gt;actually&amp;hellip;your code may well be perfect but:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;a) It only got perfect by you writing the code and writing a test script to make sure it worked (you did at least test it once, didn&amp;rsquo;t you?)&lt;/li&gt;&#xA;&lt;li&gt;b) Everyone else in the world (basically everyone other that you and me who are the only people, dear reader, who write perfect code) write horrible code and do terrible things like change table and column definitions, the blighters&lt;/li&gt;&#xA;&lt;li&gt;c) Those other horrible developers and DBAs need examples of how to use the code&lt;/li&gt;&#xA;&lt;li&gt;d) They also need documentation on how it works, what it returns in all cases and what side effects it has as they are too simple to work it out for themselves, the welps&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ok, I admit it, I am one of those welps - what is more, I make changes to code without examining every stored procedure, every function, every piece of application code to see if it will cause any issues - I am literally a renegade throwing caution to the wind plus I write very little documentation, I certainly never explain what I have done to a stored procedure, I don&amp;rsquo;t need to. I can do this because I write unit tests and make sure that every piece of code that can run is covered by a unit test.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introducing MergeUI</title>
      <link>https://the.agilesql.club/2015/03/introducing-mergeui/</link>
      <pubDate>Sun, 01 Mar 2015 00:07:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/03/introducing-mergeui/</guid>
      <description>&lt;h1 id=&#34;what-is-it&#34;&gt;What is it?&lt;/h1&gt;&#xA;&lt;p&gt;MergeUi is a addin (VSPackage) for Visual Studio / Sql Server Data Tools projects. It is a ui to create and edit T-Sql merge statements in pre and post deployment scripts.&lt;/p&gt;&#xA;&lt;p&gt;In this screen shot you can see the merg statement that is generated using the data in the grid which is based on a table created using the metadata in the dacpac about the table:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://the.agilesql.club/assets/images/intromerge/intromerge.png&#34; alt=&#34;Screen shot of MergeUi&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Source control isnt just a backup</title>
      <link>https://the.agilesql.club/2015/02/source-control-isnt-just-a-backup/</link>
      <pubDate>Thu, 19 Feb 2015 23:49:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/02/source-control-isnt-just-a-backup/</guid>
      <description>&lt;p&gt;In the second part of this series on getting more agile and bringing our Sql Server development practices up to date I am going to talk about why you should get your database under source control.&lt;/p&gt;&#xA;&lt;p&gt;First a little rambling story, I was at the Redgate Sql in the city event in London last October and the speakers asked a few times who had their databases under source control, betwen 5 and 10 percent of the people there had their databases under source control. One speaker asked &amp;ldquo;who uses source control&amp;rdquo;, the person sitting next to me didn&amp;rsquo;t put his hand up and then the speaker asked &amp;ldquo;who has their databases under source control&amp;rdquo;, the gentleman then said he thought the first question was about databases, of course he had his code under source control, he would be stupid not to!&lt;/p&gt;</description>
    </item>
    <item>
      <title>COOL Projects!</title>
      <link>https://the.agilesql.club/projects/</link>
      <pubDate>Mon, 16 Feb 2015 17:38:00 +0000</pubDate>
      <guid>https://the.agilesql.club/projects/</guid>
      <description>&lt;h1 id=&#34;k-ssis-ed&#34;&gt;K-SSIS-ed&lt;/h1&gt;&#xA;&lt;p&gt;A re-envisioned IDE for SSIS packages, jump &lt;a href=&#34;k-ssis-ed&#34;&gt;here&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;ssdt-dev-pack&#34;&gt;SSDT Dev Pack&lt;/h1&gt;&#xA;&lt;p&gt;A few helpers to make using SSDT slightly better, the killer feature for me is quickly deploying the proc or view you are looking at to a database - this means you can write code, quick deploy it and run your tests - red, green, refactor for T-SQL! &lt;a href=&#34;SSDT-Dev-Pack&#34;&gt;jump to it&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;sqlcover&#34;&gt;SQLCover&lt;/h1&gt;&#xA;&lt;p&gt;Code coverage reporting for T-SQL, ideally you would use it with tSQLt but works with anything, grab it from: &lt;a href=&#34;SQLCover&#34;&gt;here&lt;/a&gt; and remember code coverage tells you where you need more tests, it isn&amp;rsquo;t a weapon to beat yourself or your employees with.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSDT all the way</title>
      <link>https://the.agilesql.club/2015/02/ssdt-all-the-way/</link>
      <pubDate>Mon, 16 Feb 2015 17:38:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/02/ssdt-all-the-way/</guid>
      <description>&lt;p&gt;I generally write T-SQL code in SSDT (Sql Server Data Tools) and find that I often publish to my local database instance and then test the actual code in SSMS, or at least debug the code in SSMS - whether this is using the Sql debugger or modifying procs to output additional data (debugging Sql is so old fasioned!).&lt;/p&gt;&#xA;&lt;p&gt;It occured to me that I am wasting time switching between windows when SSDT should do everything I want already so I am investigating whether I can move away from SSMS to just SSDT and Visual Studio - is it possible? Is it better or worse?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Steps to become more agile with Sql development</title>
      <link>https://the.agilesql.club/2015/02/steps-to-become-more-agile-with-sql-development/</link>
      <pubDate>Thu, 12 Feb 2015 21:26:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/02/steps-to-become-more-agile-with-sql-development/</guid>
      <description>&lt;p&gt;In this series of posts I am going to talk about what it is we need to do, as Sql developers and DBAs to improve our working practices so that we take advantage of modern development patterns and practices to improve the quality of our work, the time it takes to implement features, lower the risk of deployments and have more fun as well.&lt;/p&gt;&#xA;&lt;p&gt;This blog is focused on becoming more agile, but even in a strict waterfall environment you can still take the methods we will talk about to improve your processes, just because you have created your design up front and had it signed off, doesn&amp;rsquo;t mean that you cannot write unit tests and have an integration server, it just means you are more formal in your design, your ability to handle changes and your documentation which isn&amp;rsquo;t necessarily a bad thing.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Choosing a Development IDE for Sql Development</title>
      <link>https://the.agilesql.club/2015/02/choosing-a-development-ide-for-sql-development/</link>
      <pubDate>Thu, 12 Feb 2015 07:17:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/02/choosing-a-development-ide-for-sql-development/</guid>
      <description>&lt;h3 id=&#34;note-this-was-written-in-2015-it-is-now-2020---that-is-5-years-so-please-consider-this-a-historical-artifact-that-is-probably-out-of-date&#34;&gt;NOTE: THIS WAS WRITTEN IN 2015, it is now 2020 - that is 5 years so please consider this a historical artifact that is probably out of date.&lt;/h3&gt;&#xA;&lt;p&gt;In this series of blog posts, I am talking about how to use agile or modern development practices to help us become better Sql developers.&lt;/p&gt;&#xA;&lt;p&gt;The first step on the list is a development IDE and it really is the first thing to think about, sure getting your database in source control is critical and if you haven&amp;rsquo;t already then you should get that done (really go do it now) but how you get your schema and code into source control and how you will manage that going forwards depends a lot on which IDE you choose.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Enable SSDT and DacFx logging</title>
      <link>https://the.agilesql.club/2015/02/enable-ssdt-and-dacfx-logging/</link>
      <pubDate>Thu, 05 Feb 2015 21:36:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/02/enable-ssdt-and-dacfx-logging/</guid>
      <description>&lt;h3 id=&#34;update&#34;&gt;**Update**&lt;/h3&gt;&#xA;&lt;p&gt;I have noticed that these cmd files are missing from recent ssdt builds, to enable logging see Kevin&amp;rsquo;s comment:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://blogs.msdn.com/b/ssdt/archive/2014/07/15/sql-server-data-tools-july-update.aspx?PageIndex=2&#34;&gt;http://blogs.msdn.com/b/ssdt/archive/2014/07/15/sql-server-data-tools-ju&amp;hellip;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;update-1&#34;&gt;**/update&lt;/h3&gt;&#xA;&lt;p&gt;I was helping someone get a deployment filter working in SSDT recently and the issue was that they had configured the publish profile to include filter but when they did a publish or generate script, an error occurred with no more detail than &amp;ldquo;Contributor initialization error.&amp;rdquo;:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://the.agilesql.club/assets/images/contributorinitializationerror.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Being stuck at what to do next I had a poke around and found the SsdtTrace.cmd in the Dac folder:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why does SqlPackage keep dropping and recreating constraints?</title>
      <link>https://the.agilesql.club/2015/01/why-does-sqlpackage-keep-dropping-and-recreating-constraints/</link>
      <pubDate>Fri, 16 Jan 2015 20:14:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/01/why-does-sqlpackage-keep-dropping-and-recreating-constraints/</guid>
      <description>&lt;p&gt;I sometimes see this when deploying via sqlpackager.exe:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;Analyzing deployment plan (Complete)  &#xD; Updating database (Start)  &#xD; Dropping DF_XXX...  &#xD; Creating DF_XXX...  &#xD; Update complete.  &#xD; Updating database (Complete)  &#xD; Successfully published database.  &#xD; &lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;This happens everytime I publish, even though there have not been any changes.&lt;/p&gt;&#xA;&lt;p&gt;Typically this is caused by Sql taking the create statement from SSDT and changing it, it does things like changes GETDATE to getdate and (0) to ((0)), to be honest I am not 100% sure what it will and won&amp;rsquo;t change but my fix for this when I get it happening is to go to SSMS and script out the table and copy and paste the constraint back into SSDT, then deploy and it should stop.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HOWTO: Filter Dacpac Deployments</title>
      <link>https://the.agilesql.club/2015/01/howto-filter-dacpac-deployments/</link>
      <pubDate>Wed, 14 Jan 2015 00:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2015/01/howto-filter-dacpac-deployments/</guid>
      <description>&lt;h2 id=&#34;updated-2015-02-02&#34;&gt;Updated 2015-02-02&lt;/h2&gt;&#xA;&lt;p&gt;I have changed the details about passing multiple filters at the bottom, see the codepex site for full details.&lt;/p&gt;&#xA;&lt;h2 id=&#34;tldr&#34;&gt;tldr;&lt;/h2&gt;&#xA;&lt;p&gt;Download the filter from: &lt;a href=&#34;https://agilesqlclub.codeplex.com/releases/view/610727&#34;&gt;https://agilesqlclub.codeplex.com/releases/view/610727&lt;/a&gt; put the dll into the same folder as sqlpackage.exe and add these command line parameters to your deployment:&lt;/p&gt;&#xA;&lt;p&gt;/p:AdditionalDeploymentContributors=AgileSqlClub.DeploymentFilterContributor /p:AdditionalDeploymentContributorArguments=&amp;ldquo;SqlPackageFilter=IgnoreSchema(BLAH)&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;This will neither deploy, drop or alter anything in the BLAH schema.&lt;/p&gt;&#xA;&lt;h2 id=&#34;more-info&#34;&gt;More Info&lt;/h2&gt;&#xA;&lt;p&gt;I recently discovered deployment contributors which let you write .net code to interrupt the dacpac deployment process and modify either the steps involved or the actual scripts themselves. They are documented: &lt;a href=&#34;http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dac.deployment.deploymentplanexecutor.aspx&#34;&gt;http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dac.deployme&amp;hellip;&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Enforcing T-SQL quality with SSDT Analysis Extensions</title>
      <link>https://the.agilesql.club/2014/12/enforcing-t-sql-quality-with-ssdt-analysis-extensions/</link>
      <pubDate>Tue, 30 Dec 2014 00:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2014/12/enforcing-t-sql-quality-with-ssdt-analysis-extensions/</guid>
      <description>&lt;h2 id=&#34;what&#34;&gt;What?&lt;/h2&gt;&#xA;&lt;p&gt;Simply put, it is possible to include checks in the SSDT (Sql Server Data Tools) build process - you come up with a set of rules or start with these (&lt;a href=&#34;https://tsqlsmellsssdt.codeplex.com/&#34;&gt;https://tsqlsmellsssdt.codeplex.com/&lt;/a&gt;) and when you check-in your code, as part of your normal build or CI build you run the code analysis - the code analysis verifies that the code is good and either continues the build or fails it if you have committed a crime against your rules.&lt;/p&gt;</description>
    </item>
    <item>
      <title>DacFX Links</title>
      <link>https://the.agilesql.club/2014/12/dacfx-links/</link>
      <pubDate>Sun, 07 Dec 2014 21:55:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2014/12/dacfx-links/</guid>
      <description>&lt;p&gt;I thought it would be a good idea to gather together a list of links for DacFx, blogs code or articles - if you have anything that you think should be included in this list please send it and I will include it.&lt;/p&gt;&#xA;&lt;p&gt;The first thing to read is the &amp;ldquo;DacFx Public Model Tutorial&amp;rdquo; this by Kevin Cunnane from the Microsoft SSDT team and is highly recommended:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://blogs.msdn.com/b/ssdt/archive/2013/12/23/dacfx-public-model-tutorial.aspx&#34;&gt;http://blogs.msdn.com/b/ssdt/archive/2013/12/23/dacfx-public-model-tutor&amp;hellip;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Then there are the DacFx samples on codeplex:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Make Visual Studio Setup Slightly Faster</title>
      <link>https://the.agilesql.club/2014/12/make-visual-studio-setup-slightly-faster/</link>
      <pubDate>Sun, 07 Dec 2014 21:34:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2014/12/make-visual-studio-setup-slightly-faster/</guid>
      <description>&lt;p&gt;If you get the Visual Studio 2012 or 2013 web installer then it uses the BITS service to download the setup files.&lt;/p&gt;&#xA;&lt;p&gt;The BITS service is used to download files but throttles the download so it doesn&amp;rsquo;t overwhelm your bandwidth.&lt;/p&gt;&#xA;&lt;p&gt;If you are also downloading lots of other things like windows updates then the visual studio downloads have to take their time in the queue with everything else.&lt;/p&gt;&#xA;&lt;p&gt;If you want to download to go quicker, you can disable and stop the BITS service, the installer will fall back to traditional HTTP can be much faster (depending on what other things are trying to use BITS).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Running tSQLt tests from C/VB.Net/Java/Whatever</title>
      <link>https://the.agilesql.club/2014/11/running-tsqlt-tests-from-c/vb.net/java/whatever/</link>
      <pubDate>Thu, 20 Nov 2014 07:19:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2014/11/running-tsqlt-tests-from-c/vb.net/java/whatever/</guid>
      <description>&lt;p&gt;When you already have a test framework setup such as MSTest or NUnit and possibly a CI build in place and you want to add Sql Server tests it is often wise to call the tests from the framework you already have setup.&lt;/p&gt;&#xA;&lt;p&gt;I do this at the moment using C# and I have a helper method that calls tSQLt.Run/RunClass/RunAll passing in the name of the test(s) to run - this means that from within visual studio, I can see and run all of my tSQLt tests alongside my existing NUnit / Moq tests.&lt;/p&gt;</description>
    </item>
    <item>
      <title>For better Sql code use fake tables</title>
      <link>https://the.agilesql.club/2014/11/for-better-sql-code-use-fake-tables/</link>
      <pubDate>Tue, 18 Nov 2014 23:13:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2014/11/for-better-sql-code-use-fake-tables/</guid>
      <description>&lt;p&gt;When unit testing code there is a really powerful feature that is either called mocking or faking or sometimes using stubs and what these mean is creating objects that look like real objects but aren&amp;rsquo;t.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-would-you-want-something-that-looks-like-something-but-isnt&#34;&gt;Why would you want something that looks like something but isn&amp;rsquo;t?&lt;/h2&gt;&#xA;&lt;p&gt;Unit testing means breaking your code into small chunks and testing that the small chunk does what it is meant to. Testing small chunks of code in isolation is difficult as they often call other chunks of code so we test and pretend that the other thing is correct and to validate those other small chunks, we unit test them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Unit tests help document your code!</title>
      <link>https://the.agilesql.club/2014/11/unit-tests-help-document-your-code/</link>
      <pubDate>Sun, 02 Nov 2014 20:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2014/11/unit-tests-help-document-your-code/</guid>
      <description>&lt;p&gt;I recently had the chance honour to spend twenty minutes talking to Boris Hristov about testing with Sql Server for his Google Hangouts series, catch the video &lt;a href=&#34;http://borishristov.com/blog/hangout-24-unit-testing-sql-server/&#34;&gt;here&lt;/a&gt;&lt;br&gt;&#xA;One of the things I mentioned was that having a suite of unit tests helps to document the code and in this post I would like to demonstrate that. If we take the first stored procedure in the AdventureWorks2012 database to see how it is documented, if we take the procedure definition, we get:&lt;/p&gt;</description>
    </item>
    <item>
      <title>What collation variables take on in T-SQL</title>
      <link>https://the.agilesql.club/2014/10/what-collation-variables-take-on-in-t-sql/</link>
      <pubDate>Wed, 22 Oct 2014 17:46:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2014/10/what-collation-variables-take-on-in-t-sql/</guid>
      <description>&lt;p&gt;I was asked an interesting question about collations in sql server recently about where variables in a script got their collation&amp;rsquo;s from. I really wasn&amp;rsquo;t too sure of the answer, I generally try to ensure that databases are in the company default collation although I realise that this is not always possible.&lt;/p&gt;&#xA;&lt;p&gt;Given how important this is I thought I would investigate it a little:&lt;/p&gt;&#xA;&lt;p&gt;The first question I had was what collaction is the actual T-Sql script compiled in, is it the database or server?&lt;/p&gt;</description>
    </item>
    <item>
      <title>DBAs - Step away from production</title>
      <link>https://the.agilesql.club/2014/10/dbas-step-away-from-production/</link>
      <pubDate>Tue, 21 Oct 2014 22:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2014/10/dbas-step-away-from-production/</guid>
      <description>&lt;p&gt;I have worked as a DBA and also as a Sql Server developer and in many roles had full access to production, it is OK though I know what I am doing and I normally don&amp;rsquo;t make mistakes (we&amp;rsquo;ll come back to this!).&lt;/p&gt;&#xA;&lt;p&gt;To be clear, this isn&amp;rsquo;t a moan at DBA&amp;rsquo;s, I am one and can and do make changes myself - I am trying to improve processes that I have input into. This also applies to anyone who has access to production, ops teams tweaking config settings take note!&lt;/p&gt;</description>
    </item>
    <item>
      <title>DevDev</title>
      <link>https://the.agilesql.club/2014/10/devdev/</link>
      <pubDate>Mon, 20 Oct 2014 22:11:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2014/10/devdev/</guid>
      <description>&lt;p&gt;There has been a gigantic shift in attitudes between development and operations, the devops movement, to create a streamlined, automated and high performing team of developers and infrastructure techs which has really helped transform many operations and projects.&lt;/p&gt;&#xA;&lt;p&gt;It occurs to me that when building a development team or planning out a project we should include resources for developers to write tools and improve processes for the other developers in the team. I have seen this work very well in a small team which constantly had one developer on rotation spend a week just writing tools for developers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>DevDev</title>
      <link>https://the.agilesql.club/2014/10/devdev/</link>
      <pubDate>Mon, 20 Oct 2014 22:11:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2014/10/devdev/</guid>
      <description>&lt;p&gt;There has been a gigantic shift in attitudes between development and operations, the devops movement, to create a streamlined, automated and high performing team of developers and infrastructure techs which has really helped transform many operations and projects.&lt;/p&gt;&#xA;&lt;p&gt;It occurs to me that when building a development team or planning out a project we should include resources for developers to write tools and improve processes for the other developers in the team. I have seen this work very well in a small team which constantly had one developer on rotation spend a week just writing tools for developers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Blog Redirected</title>
      <link>https://the.agilesql.club/2014/10/blog-redirected/</link>
      <pubDate>Mon, 20 Oct 2014 20:02:00 +0000</pubDate>
      <guid>https://the.agilesql.club/2014/10/blog-redirected/</guid>
      <description>&lt;p&gt;I have moved my blog over to here, expect exciting posts about the things that &lt;a href=&#34;https://the.agilesql.club/Blogs/Ed-Elliott/About/&#34;&gt;interest me&lt;/a&gt; my previous blog was at: &lt;a href=&#34;http://sqlserverfunctions.wordpress.com&#34;&gt;http://sqlserverfunctions.wordpress.com&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I hope you find something you enjoy and please comment or contact me for anything!&lt;/p&gt;&#xA;&lt;p&gt;Ed&lt;/p&gt;</description>
    </item>
    <item>
      <title>About Ed Elliott</title>
      <link>https://the.agilesql.club/about/</link>
      <pubDate>Sat, 12 Feb 2000 14:32:37 +0000</pubDate>
      <guid>https://the.agilesql.club/about/</guid>
      <description>&lt;p&gt;Hi,&lt;/p&gt;&#xA;&lt;p&gt;My name is Ed Elliott, I live in Sussex, England with my family. I work in and around data and when people ask me what I do for a living I say &amp;ldquo;I move data around so people can look at it&amp;rdquo;. In more depth, I work between the world of data engineering and devops so you&amp;rsquo;ll see over the course of this blog (since 2014) I started writing more about databasey, devopsey type topics (DacFX FTW) and now I am tending to write more about data engineeringey types of things.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Search</title>
      <link>https://the.agilesql.club/search/</link>
      <pubDate>Sat, 12 Feb 2000 14:32:37 +0000</pubDate>
      <guid>https://the.agilesql.club/search/</guid>
      <description>&lt;h2 id=&#34;search-via-duck-duck-go&#34;&gt;Search via duck duck go:&lt;/h2&gt;&#xA;&lt;iframe src=&#34;https://duckduckgo.com/search.html?site=the.agilesql.club&amp;amp;prefill=Search The Agile SQL Club&#34; frameborder=&#34;0&#34;&gt;&lt;/iframe&gt;</description>
    </item>
    <item>
      <title>Contact</title>
      <link>https://the.agilesql.club/contact/</link>
      <pubDate>Fri, 11 Feb 2000 00:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/contact/</guid>
      <description></description>
    </item>
    <item>
      <title>ETL Testing</title>
      <link>https://the.agilesql.club/etl-testing/</link>
      <pubDate>Fri, 11 Feb 2000 00:00:00 +0000</pubDate>
      <guid>https://the.agilesql.club/etl-testing/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://the.agilesql.club/assets/images/broken_pipeline.jpg&#34;&#xD;&#xA;style=&#34;padding: 10px; float: right;max-height: 300px;&#34; /&gt;&#xA;There is only one thing guaranteed when writing ETL pipelines and that is that upstream changes WILL occur and WILL break your ETL pipeline.&lt;/p&gt;&#xA;&lt;p&gt;As Data Engineers we MUST make sure that we test well so that we can identify breaking changes, rapidly, AND fix and deploy just as fast. To do this we need to use automated testing.&lt;/p&gt;&#xA;&lt;p&gt;To get started here are links some links to a four part blog series I wrote on testing ETL pipelines, the theory is the same whether your pipelines are SSIS packages, Informatica, Python / Airflow or anything you can dream of:&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
