Tag: AI

  • Using Prompt AI to Help Setup Data Analysis

    I used Claude to build an application that loaded data for me. However, there were a few others things I needed done to help me get the data ready for analysis. I could have used Claude (or another human), but this was a place I’d need to do a lot of directing.

    I did, however, use Prompt AI to help me get this moving quicker and start some analysis. This post covers the way I got assistance inside SSMS from Prompt AI.

    This is part of a series of posts on SQL Prompt. You can see all my posts on SQL Prompt under that tag. This is part of a series of experiments with AI systems.

    Adding New Structures

    As a part of my data analysis, I needed to tag sessions with topics. This wasn’t really done as a part of most SQL Saturday events. While there might be tracks, often the sessions aren’t categorized with tags. It’s a pain, most organizers and most speakers don’t want to bother.

    Plus, search works well on a website. For data analysis, not so much.

    I decided to use Prompt AI to help a bit at this point, since I was low on credits.
    I asked it to add a structure. Possibly I could have written the code in not much more time than it took for this prompt, but here I get to let an assistant take a stab and then critique the work. Here’s my prompt to SQL Prompt AI:

    2025-12_0118

    Here are the results. This has the PKs, FKs, and indexes, some of which I might have forgotten. I don’t love names like “description”, but that’s fine. I could easily fix that.

    -- Create a table to store tags
    CREATE TABLE dbo.Tags
    (
        TagID INT IDENTITY(1, 1) PRIMARY KEY,
        TagName NVARCHAR(100) NOT NULL,
        Description NVARCHAR(500) NULL,
        CreatedDate DATETIME
            DEFAULT GETDATE()
    );
    
    -- Create a junction table to link sessions with tags (many-to-many relationship)
    CREATE TABLE dbo.SessionTags
    (
        SessionID INT NOT NULL,
        TagID INT NOT NULL,
        PRIMARY KEY (
                        SessionID,
                        TagID
                    ),
        CONSTRAINT FK_SessionTags_Sessions
            FOREIGN KEY (SessionID)
            REFERENCES dbo.Sessions (SessionID),
        CONSTRAINT FK_SessionTags_Tags
            FOREIGN KEY (TagID)
            REFERENCES dbo.Tags (TagID)
    );
    
    -- Create index to improve query performance
    CREATE INDEX IX_SessionTags_TagID ON dbo.SessionTags (TagID);
    CREATE INDEX IX_SessionTags_SessionID ON dbo.SessionTags (SessionID);
    

    Now, I need to analyze the data.

    Fortunately, Prompt AI helped me. Below this DDL, was a snippet to test my tags. I had this code listed:

    SELECT 
         s.SessionID, 
         s.Title, 
         STRING_AGG(t.TagName, ', ') AS Tags
    FROM 
         dbo.Sessions s
    LEFT JOIN 
         dbo.SessionTags st ON s.SessionID = st.SessionID
    LEFT JOIN 
         dbo.Tags t ON st.TagID = t.TagID
    --WHERE Title LIKE '%n rds%'
    GROUP BY 
         s.SessionID, s.Title;

    I used this to check my tags, which were non existent at this point, so I had all NULL values in the Tags column. Fortunately, I know how to write some code, so in another window I wrote this code, which inserts data, but doesn’t create dups since I might have dups based on my LIKE clause catching the same session twice.

    I also get the list of current tags, so I could change the number used in the insert as needed. There are more elegant ways to do this, but I wanted to get something done.

    INSERT dbo.SessionTags
    (
         SessionID,
         TagID
    )
    SELECT SessionID, 10
    FROM sessions WHERE Title LIKE '%n rds%'
       AND sessionid NOT IN (SELECT sessionid 
            FROM dbo.SessionTags 
         WHERE TagID = 10)

    SELECT @@rowcount
    GO
    SELECT top 30
    *
    FROM dbo.Tags

    
    

    There was a sample INSERT statement for tags as well, so I modified it to use tags I cared about. Then I started running my test query to look for NULL values and start filling them in.

    Here’s a look at a run. I’ve added some tags, but there are some nulls. There are also multiple tags for some sessions. I added the description field as well, but for most of the data, this doesn’t exist, so I don’t have it. Yet. That’s another project.

    2026-01_0130

    Line 63 is for Snowflake, which isn’t a tag. So I edit my commented out code to include Snowflake and then execute it. This is commented, so as I hit execute it doesn’t run automatically.

    2026-01_0131

    Now I get a list of tags and use that to edit my numbers in the SessionTags insert statement. In this case, Snowflake is number 17, so I change the insert to that, and edit the LIKE statement. This will add that tag to all sessions with Snowflake in the title.

    2026-01_0132

    I repeated this for a number of sessions. Below, I’ve re-run my tag query and now we see Snowflake is added.

    2026-01_0133

    Why I Didn’t Use an AI for This

    I built an application that loaded this data with Claude Code. I could have asked Claude to add the tags as well, but I didn’t have any data to put in there. I wasn’t even sure what I would do, especially as a lot of these sessions aren’t really sessions. Notice the timings above, the breaks, the panels, etc. There are also lunch breaks and other items that aren’t really sessions.

    Claude could have cleaned this data. However, I want to be sure of what I’m removing. Having Claude write the delete (or run a select first) and then ask me what to do doesn’t seem to be a good use of its cost or my time.

    I still need to be the human in the loop. There were some times I ran a select for certain words and then check the list before adding the tags. For example, here was what I did for Snowflake.

    2026-01_0134

    All those are good, but when I ran a search for Agent, I found mostly AI based results, but a few were SQL Agent sessions. Tagging those as AI wouldn’t make sense, so I had to find a better way to update the data I needed updating.

    Summary

    SQL Prompt didn’t do a lot here, but it did quickly get me moving on the task I was focused on rather than the details to support it. I could have written the DDL, but it would have taken focus away from me in thinking about tags. This did as good a job as I could do, or more importantly, as good a job as I needed.

    It also gave me a query and insert statement to get moving, again, reducing my mental load. I could have written that query, but I would have spent a few minutes doing it rather than thinking about how to assign tags.

    Ultimately I think this was a good use of AI, saving my time and energy, allowing me to focus on the task I was trying to accomplish without distraction.

  • Minimally Viable Security

    Security has been a constant concern for many IT professionals over the years. Many of us are trying to implement better security controls, and yet at the same time, we try to avoid anything that slows us down. Security clearly hasn’t been a big enough concern, as we’ve had more than our share of SQL Injection issues. These often come about from poor practices, lack of education, and too many people not learning to adopt better habits across time.

    We’ve also had no shortage of lost backups, open cloud buckets, and more over the years. While security (or cybersecurity) is listed as a concern for tech management, they are quick to avoid slowing down any development or deployment of software. While it is easier to get time for patching these days, it’s still not easy. There are plenty of organizations that prioritize resources spent on tasks other than patching, upgrading systems, or training developers.

    One of the ideas in modern software development is to often build an MVP, a minimally viable product, where we can test ideas and determine if our solution is worth pursuing. This could be a greenfield application, or even a feature enhancement to an existing system. In the age of GenAI, vibe-coding, and more, this might be MCP or agent-based AI additions to software that are being developed and enhanced rapidly, incorporating feedback from customers.

    If we allow minimal amounts of features to test things, shouldn’t we have minimal levels of security as well? That’s the thrust of a blog post from Forrester that discusses how we might look forward in 2026 to protecting our digital systems. There ought to be a minimum set of controls, testing, and more that ensures we can build software that doesn’t cost more from security issues than it generates in revenue. This might be especially important in the age of GenAI-coding where we can have less experienced engineers or even helpful agents committing lots of code they expect to deploy to production.

    Education is important here to ensure everyone is aware of your MVS (minimal viable security) before they get too far along. It might be especially important in helping others guide their GenAI tools to ensure security is being considered early on. Adding in security requirements as a standard for your tools, such as in a Claude.MD file is a best practice that should be required for all future software development. You never know who might start to add AI coding tools or agents to your codebase, so be prepared now.

    Education isn’t enough. It’s too easy for someone to forget what they learned. It’s also easy to assume many people have learned something when they haven’t. To me, part of an MVS is ensuring you have a framework or platform that can test all code and ensure that your systems are being securely built and deployed. This includes third-party software, especially SaaS products, where vendors might be tempted to sell you their own MVP without any MVS.

    Steve Jones

    Listen to the podcast at Libsyn, Spotify, or iTunes.

    Note, podcasts are only available for a limited time online.

  • Using Prompt AI for a Travel Data Analysis

    I was looking back at my year and decided to see if SQL Prompt could help me with some analysis. I was pleasantly surprised by how this went. This post looks at my experience using this to help me write a few queries.

    This is part of a series of experiments with AI systems.

    New York City

    This year was a big one for me and New York City. By my count, I went there five times. I wanted to see if that was right.

    I started by loading up a bunch of travel data I keep into a database. I do this to keep an eye on where/when I’m going places, so that I have a few of how busy I’ll be. In this case, I loaded data into a table. Here’s a short sample of data.

    2025-12_0217

    I started by asking Prompt AI to write me a query. Here’s the prompt:

    2025-12_0212

    Simple enough. I could have written what it gave me, so I asked for more. Since I’m not tracking trips, but where I am on days, I needed something better. My prompt is what I might express to someone else, non-continuous trips.

    2025-12_0213

    2025-12_0214

    I got a 4 back from more complex code, which is looking for entries with the city being NYC or a variant. It then adds a LAG(), which is what I was thinking before I decided to let Prompt do this. Notice above I was already asking for dates.

    2025-12_0215

    I got my dates, but still 4 trips. I know I flew to the NYC area more times. In looking at the dates, I realized that one of the trips, Mar 31-Apr 2, was only to Jersey City. So I had asked for that above.

    You can see more more complex code, which adds in New Jersey. The results were interesting. This has 6 trips, because on one another trip, I went to New Jersey for a day. I had forgotten that one.

    2025-12_0216

    Checking Countries

    I wanted to do some country analysis. I knew there was a bunch of country data from 2025 in there, so I wrote a simple query. That gets me some data, but it’s a bit of a mess. I really want to know when I visited countries.

    2025-12_0227

    I used PromptAI with a simple request.

    2025-12_0228

    I got some results back, which were good, but included the USA. I then asked to remove this and you see the result.

    2025-12_0229

    This was a good query, overall, so I clicked the “Optimize SQL” button. I got these items added as comments.

    2025-12_0230

    There isn’t a lot to do here, but I created the index. The “optimize” had also added a FORCESEEK, which I didn’t realize at first, so I removed it.

    Eventually I added back the USA, partially as this improves performance, but also, with the results, I got a good look at travel patterns. In this case, I can see when I’m in the USA and when I’m not. I liked that I had asked for the trip duration, but the GenAI also added days traveling on the trips, which was fascinating.

    2025-12_0233

    The final query is here:

    ;WITH TravelCTE
    AS (SELECT Country,
                TravelDate,
                DaySpentTraveling,
                ROW_NUMBER() OVER (PARTITION BY Country ORDER BY TravelDate) AS RowNum
         FROM dbo.Travel WITH (INDEX = IX_Travel_YearCountry) -- Use existing index to improve performance
         WHERE TravelDate >= '20250101' -- Using efficient date literal format
    )
    SELECT t.Country,
            t.TripStartDate,
            t.TripEndDate,
            t.TripDuration,
            t.TotalDaysSpentTraveling
    FROM
    (
         SELECT Country,
                MIN(TravelDate) AS TripStartDate,
                MAX(TravelDate) AS TripEndDate,
                DATEDIFF(DAY, MIN(TravelDate), MAX(TravelDate)) + 1 AS TripDuration,
                SUM(DaySpentTraveling) AS TotalDaysSpentTraveling,
                DATEADD(DAY, -RowNum, TravelDate) AS GroupingKey
         FROM TravelCTE
         GROUP BY Country,
                  DATEADD(DAY, -RowNum, TravelDate)
    ) AS t
    ORDER BY t.TripStartDate;

    Summary

    This was an interesting experiment in having an AI help me do some data analysis. I could have written these queries, but it would definitely have taken me as long as it took to ask the AI and write this post to do so. I’d be messing with data, double checking myself, and trying to decide what I wanted.

    I also found it interesting to have the AI write the code and I could think more about the data being returned. I found a few data anomalies that I corrected along the way.

    Prompt AI is proving useful, though when I was going back and forth a lot, I got this message.

    2025-12_0223

    There are limits to how much and how often you can query.

    Video Walkthough

    I’ve tried to duplicate this in video below.

  • The Challenge of AI

    In his book, The Coming Wave, the CEO of Microsoft AI laid out the risks of AI tech bluntly. “These tools will only temporarily augment human intelligence. They will make us smarter and more efficient for a time, and will unlock enormous amounts of economic growth, but they are fundamentally labor-replacing,” he wrote. Suleyman advocated for regulatory oversight and other government interventions, such as new taxes on autonomous systems and a universal basic income to prevent a socioeconomic collapse. This book was published before Suleyman joined Microsoft.

    Satya Nadella is more optimistic than his new deputy. In an interview at Microsoft headquarters, while sitting next to his human chief of staff, Nadella said that his Copilot assistants wouldn’t replace his human assistant. As his chief of staff sat typing notes of the conversation on her tablet, Nadella acknowledged that AI will cause “hard displacement and changes in labor pools,” including for Microsoft. Judson Althoff, Chief Commercial Officer, said that Nadella was pressuring his team to find ways to use AI to increase revenue without adding headcount.

    In 2025, Microsoft has reduced quite a bit of its workforce. Over 9,000 earlier this year, though perhaps there will be some hiring in the future, according to Nadella. Nadella contends that AI could end up delivering more societal benefits than the Industrial Revolution did. “When you create abundance,” Nadella said, “then the question is what one does with that abundance to create more surplus.”

    As I discuss AI with different people, I get wildly different opinions. The pace of GenAI model growth across the last two years has led quite a few people to believe that the technology will approach mimicking the average human’s intelligence in just a few years. That’s a scary thought, and it certainly could lead a lot of executives to place a bet on fewer human employees and more digital ones.

    However, many more people believe that the GenAI models still need a lot of guidance, and they are best suited for partnerships with humans. That’s good, in a sense. If a smart or talented human can use an AI partner and get a lot done, that means we still need some humans.

    Some.

    That use of AI by a few talented people might also lead us to a reduction in labor for a lot of organizations. Maybe fewer humans get more done with AI, and it’s possible organizations want to make that trade. It’s easy to think we’ll find things for more humans to do, but computers are incredible levers, and this worries me.

    A little.

    What I also think is that there is so much work we’d like to get done, but we can’t, at least in the technology space. We don’t have enough people to do the work, so GenAI agents or partners working with humans might let us catch up on the backlogs we have.

    Of course, I don’t know that all that backlogged software we went is something we need, if it’s good for the world, and if it will end up putting even more people in the real world out of work.

    Lots of challenges ahead. Let me know what you think.

    Steve Jones

    Listen to the podcast at Libsyn, Spotify, or iTunes.

    Note, podcasts are only available for a limited time online.