Congratulations!

[Valid RSS] This is a valid RSS feed.

Recommendations

This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

Source: https://www.sqlservercentral.com/feed

  1. <?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
  2. xmlns:content="http://purl.org/rss/1.0/modules/content/"
  3. xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  4. xmlns:dc="http://purl.org/dc/elements/1.1/"
  5. xmlns:atom="http://www.w3.org/2005/Atom"
  6. xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  7. xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  8. >
  9.  
  10. <channel>
  11. <title>Articles - SQLServerCentral</title>
  12. <atom:link href="https://www.sqlservercentral.com/articles/feed" rel="self" type="application/rss+xml" />
  13. <link>https://www.sqlservercentral.com</link>
  14. <description>The #1 SQL Server community</description>
  15. <lastBuildDate>Fri, 15 Aug 2025 20:52:07 +0000</lastBuildDate>
  16. <language>en-GB</language>
  17. <sy:updatePeriod>
  18. hourly </sy:updatePeriod>
  19. <sy:updateFrequency>
  20. 1 </sy:updateFrequency>
  21. <generator>https://wordpress.org/?v=6.0.3</generator>
  22. <item>
  23. <title>From Rows to Pages: The Hidden Chaos Behind SQL Server’s Sampling Methods</title>
  24. <link>https://www.sqlservercentral.com/articles/from-rows-to-pages-the-hidden-chaos-behind-sql-servers-sampling-methods</link>
  25. <dc:creator><![CDATA[Chandan Shukla]]></dc:creator>
  26. <pubDate>Fri, 22 Aug 2025 00:00:07 +0000</pubDate>
  27. <category><![CDATA[T-SQL]]></category>
  28. <guid isPermaLink="false">https://www.sqlservercentral.com/?post_type=ssc_article&#038;p=4626647</guid>
  29.  
  30. <description><![CDATA[<p>Learn about the TABLESAMPLE option in T-SQL and uncover some of the pitfalls of assuming this works as you think it does.</p>
  31. <p>The post <a rel="nofollow" href="https://www.sqlservercentral.com/articles/from-rows-to-pages-the-hidden-chaos-behind-sql-servers-sampling-methods">From Rows to Pages: The Hidden Chaos Behind SQL Server’s Sampling Methods</a> appeared first on <a rel="nofollow" href="https://www.sqlservercentral.com">SQLServerCentral</a>.</p>
  32. ]]></description>
  33. <content:encoded><![CDATA[<h2 data-start="306" data-end="322"><strong data-start="306" data-end="322">Introduction</strong></h2>
  34. <p data-start="324" data-end="1406">Sampling data is a common requirement in many real-world SQL Server workloads. Whether you are trying to test a subset of data, preview records before an export, or build a small development copy of a table, sampling becomes a go-to tool. SQL Server offers an operator called TABLESAMPLE, which looks simple and promising at first. When someone writes a query like select top 100 from Orders tablesample 10 percent, the natural expectation is that SQL Server will return a random 10 percent of the rows. Unfortunately, that’s not how it works.</p>
  35. <p data-start="324" data-end="1406">The TABLESAMPLE clause does not operate on individual rows but rather on the physical data pages. This means SQL Server tries to return rows from approximately 10 percent of the total pages, not rows. If your data is evenly distributed and each page is full, it might give you close to 10 percent. But in reality, due to fragmentation, updates, and deletes, most pages contain varying number of rows. That is where TABLESAMPLE becomes highly unpredictable. Let us simulate this with a quick example to demonstrate the behavior in practice.</p>
  36. <h2 data-start="1413" data-end="1455"><strong data-start="1413" data-end="1455">Step-by-Step Simulation of TABLESAMPLE</strong></h2>
  37. <p data-start="1457" data-end="1628">Create a table named SampleTest with three columns — an identity column called ID, a default name column, and a datetime column that records the current timestamp.</p>
  38. <pre class="prettyprint  lang-mssql">create table SampleTest
  39. (
  40. ID int identity(1,1),
  41. Name varchar(100) default 'Test',
  42. CreatedDate datetime default getdate()
  43. )</pre>
  44. <p data-start="1764" data-end="1835">Step 2: Insert some rows to make the table large enough to sample from.</p>
  45. <pre class="prettyprint  lang-mssql">declare @i int = 0
  46. while @i &lt; 10000
  47. begin
  48. insert into SampleTest default values
  49. set @i = @i + 1
  50. end</pre>
  51. <p data-start="1948" data-end="1972">Now we run the sampling.</p>
  52. <pre class="prettyprint  lang-mssql">select count(*) from SampleTest tablesample (10 percent)</pre>
  53. <p data-start="2032" data-end="2990">Try running this query multiple times. In the first run, I got a row count of 1408. I ran it again, and got 895. Third execution gave 1253.</p>
  54. <h3 data-start="2032" data-end="2990">First Run</h3>
  55. <p data-start="2032" data-end="2990"><img class="alignnone size-full wp-image-4628325" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.38.03 AM.png" data-lazy-load alt="" width="1518" height="564" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.38.03 AM.png 1518w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.38.03 AM-300x111.png 300w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.38.03 AM-1024x380.png 1024w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.38.03 AM-768x285.png 768w" sizes="(max-width: 1518px) 100vw, 1518px" /></p>
  56. <h3 data-start="2032" data-end="2990">Second Run</h3>
  57. <p data-start="2032" data-end="2990"><img loading="lazy" class="alignnone size-full wp-image-4628326" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.37.52 AM.png" data-lazy-load alt="" width="1566" height="556" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.37.52 AM.png 1566w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.37.52 AM-300x107.png 300w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.37.52 AM-1024x364.png 1024w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.37.52 AM-768x273.png 768w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.37.52 AM-1536x545.png 1536w" sizes="(max-width: 1566px) 100vw, 1566px" /></p>
  58. <h3 data-start="2032" data-end="2990">Third Run</h3>
  59. <p data-start="2032" data-end="2990"><img loading="lazy" class="alignnone size-full wp-image-4628327" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.37.42 AM.png" data-lazy-load alt="" width="1548" height="594" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.37.42 AM.png 1548w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.37.42 AM-300x115.png 300w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.37.42 AM-1024x393.png 1024w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.37.42 AM-768x295.png 768w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.37.42 AM-1536x589.png 1536w" sizes="(max-width: 1548px) 100vw, 1548px" /></p>
  60. <p data-start="2032" data-end="2990">This happens because SQL Server chooses a different set of pages each time. It does not guarantee which rows will be chosen. Even worse, two consecutive runs can give two sets of results with no overlap. You might get different date ranges, different IDs, and even different value distributions.</p>
  61. <p data-start="2032" data-end="2990">If you had a clustered index on CreatedDate, for example, one sample might have mostly older rows and the next might have mostly recent ones. This unpredictability makes TABLESAMPLE unsuitable for use cases where uniformity or fairness of sample matters. For example, in financial reporting, fraud detection, or AI training datasets, using TABLESAMPLE could introduce hidden bias. You might think you’re working with a fair representation of the data, but SQL Server might have skipped entire chunks of it.</p>
  62. <h2 data-start="1343" data-end="1389"><strong data-start="1343" data-end="1389">TABLESAMPLE with ROWS Still Works on Pages</strong></h2>
  63. <p data-start="1391" data-end="2288">Here’s a lesser-known twist with TABLESAMPLE. If you use the syntax TABLESAMPLE (100 ROWS), expecting exactly 100 rows, you will be surprised. SQL Server does not read 100 individual rows. It internally estimates how many pages would roughly contain 100 rows based on current statistics, and then it reads those pages instead. Since some pages might be half full and others might be over-packed, the actual number of rows returned can vary widely. One run might give you 52 rows and another run might return 135 rows — even though you requested exactly 100, and next run may give zero(as shown in below screenshot).</p>
  64. <p data-start="1391" data-end="2288">The core reason is that all TABLESAMPLE operations, whether you specify ROWS or PERCENT, are page-based. SQL Server always maps your request to an approximate number of pages. So even though you are writing a row-level intention, the engine executes a page-level action. That’s why you should never trust TABLESAMPLE for fixed-size output.</p>
  65. <p data-start="1391" data-end="2288">For demonstration run this query as below:</p>
  66. <pre class="prettyprint  lang-mssql">select count(*) from SampleTest tablesample (100 rows)</pre>
  67. <p data-start="484" data-end="1747" data-is-last-node="" data-is-only-node=""><img loading="lazy" class="alignnone size-full wp-image-4628323" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.35.16 AM.png" data-lazy-load alt="" width="2550" height="1336" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.35.16 AM.png 2550w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.35.16 AM-300x157.png 300w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.35.16 AM-1024x536.png 1024w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.35.16 AM-768x402.png 768w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.35.16 AM-1536x805.png 1536w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/Screenshot-2025-07-30-at-12.35.16 AM-2048x1073.png 2048w" sizes="(max-width: 2550px) 100vw, 2550px" /></p>
  68. <p data-start="1149" data-end="2013">To confirm this, you can open the actual execution plan in SSMS and hover over the Table Scan operator. In the execution plan output, you will notice that SQL Server shows "Estimated Number of Rows for All Executions = 100" and also "Estimated Number of Rows Per Execution = 100". This proves that the optimizer planned for 100 rows. However, the actual number of rows retrieved was "0" in the screenshot shown here, which means that in that run, even though SQL Server aimed to retrieve 100 rows by estimating page counts, the actual rows returned were zero. This is direct evidence that TABLESAMPLE with 100 ROWS does not literally scan for 100 rows. It uses metadata and statistics to estimate how many data pages might contain that many rows, and those pages are scanned — but the actual contents depend on page density, fragmentation, and internal row layout.</p>
  69. <p data-start="2015" data-end="2590">This mismatch between estimated and actual rows reinforces the fact that TABLESAMPLE, even in ROW mode, is not a row-level operator. It behaves entirely based on pages. And the inconsistency shown in the execution plan confirms why this operator is unpredictable in scenarios that expect accuracy or fixed-size samples. If your use case demands exactly 100 rows, you must not rely on TABLESAMPLE. Use row-level methods instead, such as order by newid or deterministic checksum filters. TABLESAMPLE is fast, but only suitable for approximate sampling, not guaranteed outcomes.</p>
  70. <h2 data-start="215" data-end="264"><strong data-start="215" data-end="264">When TOP Meets TABLESAMPLE: Total Random Mess</strong></h2>
  71. <p data-start="266" data-end="385">Now here is where things get unexpectedly chaotic. Try combining TOP (1) with TABLESAMPLE in a single query, like this:</p>
  72. <pre class="prettyprint  lang-mssql">select top 1 from SampleTest tablesample (10 percent)</pre>
  73. <p data-start="442" data-end="1336">At first glance, this looks harmless. But try running it five times in a row. You will get five different rows every single time. That is because TABLESAMPLE already introduces random page-level sampling, and then TOP just picks the first row from that unpredictable result set — which makes the final output even more unstable. There is no guarantee which pages will be included in the 10 percent, and there is no ordering within that sample. So the combination leads to what we call total random mess — where neither the sampling nor the row selection is deterministic.</p>
  74. <p data-start="442" data-end="1336">This kind of query is sometimes used in quick demos or testing, but in production or analysis, it can silently break expectations. If you ever need a single random row, you are much better off using select top 1 from SampleTest order by newid. It is slower, but it delivers a true per-row random behavior with consistency.</p>
  75. <h2 data-start="2295" data-end="2356"><strong data-start="2295" data-end="2356">Fixed-Checksum Sampling: Fast, Repeatable, and Controlled</strong></h2>
  76. <p data-start="2358" data-end="2610">One bonus trick that is not widely used is fixed-checksum sampling. Instead of relying on randomness, you use a mathematical filter that gives you the same sample every time. For example, this query gives you a repeatable 10 percent slice of your data:</p>
  77. <pre class="prettyprint  lang-mssql">select from SampleTest where abs(checksum(ID)) % 100 &lt; 10</pre>
  78. <p data-start="2671" data-end="3692">This method uses the ID column as a seed for the checksum function, which produces a consistent numeric value. Applying modulo logic allows you to extract roughly 10 percent of rows based on this pattern. The sample will not be random in the traditional sense, but it will be stable and reproducible. This is very helpful when you want to use the same subset across multiple environments, or want to perform validations that need consistency.</p>
  79. <p data-start="2671" data-end="3692">For example, your dev, staging, and production environments can all operate on the same logical sample just by running the same query. You can even use this approach for partitioned test cases, by using different modulus ranges for different teams. Just remember — this works best on integer columns like identity or surrogate keys. If the column is skewed or contains long strings, checksum might not distribute the values evenly, which can cause bias. But with proper usage, this technique gives you the speed of TABLESAMPLE and the control of NEWID, without the sorting cost.</p>
  80. <h2 data-start="2997" data-end="3054"><strong data-start="2997" data-end="3054">Comparison with ORDER BY NEWID for Row-Level Sampling</strong></h2>
  81. <p data-start="3056" data-end="3262">Now let us compare it with another technique. Suppose we want to fetch exactly 1000 random rows out of our 10000-row table. One safe and repeatable approach is to use order by newid. Here’s how we write it.</p>
  82. <pre class="prettyprint  lang-mssql">select top 1000 * from SampleTest order by newid()</pre>
  83. <p data-start="3316" data-end="4147">This query works differently. It generates a random guid for each row using newid, sorts the entire table by those guids, and returns the top 1000. Since the guids are randomly generated at runtime, every run gives a different set of rows. However, unlike TABLESAMPLE, this is row-level randomness. It is slow because sorting 10000 guids takes time, especially on large tables, but the sample is fair and consistent. This is useful when you are testing logic that depends on representative data. You can even store the newid value in a column if you want reproducibility.</p>
  84. <p data-start="3316" data-end="4147">Developers often use this technique for training data preparation, UI previews, or staggered processing. In summary, TABLESAMPLE is fast but not reliable. Order by newid is reliable but not fast. You must choose based on what matters more — speed or accuracy.</p>
  85. <h2 data-start="3316" data-end="4147">Summary</h2>
  86. <p>Sampling in SQL Server may look simple at first glance, but as we’ve seen, it is full of hidden behaviors and side effects that can silently impact your logic. The TABLESAMPLE operator works at the page level, regardless of whether you use PERCENT or ROWS. Even when you ask for TABLESAMPLE (100 ROWS), SQL Server estimates the number of pages that might contain around 100 rows and returns rows from those pages — meaning the actual number of rows can vary greatly between executions. When combined with TOP, it becomes even more unstable, and the output can differ every single time.</p>
  87. <p>If your requirement is strict control over the number of rows or reproducibility, then TABLESAMPLE is not the tool for the job. Instead, you can use ORDER BY NEWID for true row-level randomness or a checksum-based filter when you need fast, repeatable, and controlled subsets of data. These approaches let you avoid the chaos of page-level sampling and give you full control over the sampling logic.</p>
  88. <p>The bottom line is — don’t use TABLESAMPLE blindly assuming it gives you what it says. Understand how it works internally and when to avoid it. It is great for fast approximations and quick tests, but not for consistent results or sensitive analysis. Knowing when to use TABLESAMPLE, when to avoid it, and what alternatives exist — that’s what separates a cautious SQL developer from one stuck debugging inconsistent results for hours.</p>
  89. <p><code data-start="2735" data-end="2740"></code></p>
  90. <p><code data-start="2735" data-end="2740"></code></p>
  91. <p><code data-start="2735" data-end="2740"></code></p>
  92. <p><code data-start="2735" data-end="2740"></code></p>
  93. <p data-start="2735" data-end="2793"><code data-start="2735" data-end="2740"></code></p>
  94. <p>The post <a rel="nofollow" href="https://www.sqlservercentral.com/articles/from-rows-to-pages-the-hidden-chaos-behind-sql-servers-sampling-methods">From Rows to Pages: The Hidden Chaos Behind SQL Server’s Sampling Methods</a> appeared first on <a rel="nofollow" href="https://www.sqlservercentral.com">SQLServerCentral</a>.</p>
  95. ]]></content:encoded>
  96. </item>
  97. <item>
  98. <title>Long Short-Term Memory Network for Machine Learning</title>
  99. <link>https://www.sqlservercentral.com/articles/long-short-term-memory-network-for-machine-learning</link>
  100. <dc:creator><![CDATA[Additional Articles]]></dc:creator>
  101. <pubDate>Fri, 22 Aug 2025 00:00:40 +0000</pubDate>
  102. <category><![CDATA[Machine Learning (ML)]]></category>
  103. <guid isPermaLink="false">https://www.sqlservercentral.com/?post_type=ssc_article&#038;p=4634615</guid>
  104.  
  105. <description><![CDATA[<p>While Recurrent Neural Networks (RNN) are powerful, they often struggle with long-term dependencies due to the vanishing gradient problem. Long Short-Term Memory Networks (LSTMs) address this issue by introducing memory cells and gates. For beginners, understanding LSTM components, such as the input, output, and forget gates, can be challenging. This tip breaks down LSTMs in an intuitive way, highlighting their importance and practical applications.</p>
  106. <p>The post <a rel="nofollow" href="https://www.sqlservercentral.com/articles/long-short-term-memory-network-for-machine-learning">Long Short-Term Memory Network for Machine Learning</a> appeared first on <a rel="nofollow" href="https://www.sqlservercentral.com">SQLServerCentral</a>.</p>
  107. ]]></description>
  108. <content:encoded><![CDATA[<p>The post <a rel="nofollow" href="https://www.sqlservercentral.com/articles/long-short-term-memory-network-for-machine-learning">Long Short-Term Memory Network for Machine Learning</a> appeared first on <a rel="nofollow" href="https://www.sqlservercentral.com">SQLServerCentral</a>.</p>
  109. ]]></content:encoded>
  110. </item>
  111. <item>
  112. <title>Contained Availability Groups in SQL Server 2022</title>
  113. <link>https://www.sqlservercentral.com/articles/contained-availability-groups-in-sql-server-2022</link>
  114. <dc:creator><![CDATA[Deepam Ghosh]]></dc:creator>
  115. <pubDate>Wed, 20 Aug 2025 00:00:11 +0000</pubDate>
  116. <category><![CDATA[Availability Group (AG)]]></category>
  117. <category><![CDATA[High Availability (HA)]]></category>
  118. <guid isPermaLink="false">https://www.sqlservercentral.com/?post_type=ssc_article&#038;p=4626091</guid>
  119.  
  120. <description><![CDATA[<p>SQL Server 2022 introduced a new feature called Contained Availability Groups. It allows the Database Administrators to effectively manage the Server Level objects, such as Logins, SQL Agent jobs, etc. in an HA environment. In today's article, we will learn about this new feature of SQL Server. The Challenge of Managing Server Objects in Availability [&#8230;]</p>
  121. <p>The post <a rel="nofollow" href="https://www.sqlservercentral.com/articles/contained-availability-groups-in-sql-server-2022">Contained Availability Groups in SQL Server 2022</a> appeared first on <a rel="nofollow" href="https://www.sqlservercentral.com">SQLServerCentral</a>.</p>
  122. ]]></description>
  123. <content:encoded><![CDATA[<p>SQL Server 2022 introduced a new feature called Contained Availability Groups. It allows the Database Administrators to effectively manage the Server Level objects, such as Logins, SQL Agent jobs, etc. in an HA environment. In today's article, we will learn about this new feature of SQL Server.</p>
  124. <h2>The Challenge of Managing Server Objects in Availability Groups</h2>
  125. <p>Always On Availability Groups were first introduced way back in 2012. It was designed to provide a highly available and disaster recovery solution. The problem with normal availability group is that DBA's must manually replicate the server-level objects, such as logins, sql agent jobs or operators on all the replicas whenever they are created.  A Contained AG fixes this problem. In addition to user databases, the contained AG also includes portions of the master and msdb databases. Thus along with user databases, system databases get replicated across all the replicas. This eliminates the need for  DBAs to manually create or update the objects across all the replicas.</p>
  126. <h2>Configuring Contained Availability Groups</h2>
  127. <p>We will now see how to Create an Always On Contained Availability Groups on a 2-node Windows Cluster. For this example, we will use 2 nodes, ACS-POC-DB01 and ACS-POC-DB02. Both the nodes have a named SQL Server Instance(SQL2022) installed on them. You may refer this <a href="https://www.sqlservercentral.com/articles/sql-automate-a-dbas-time-saving-toolkit">article</a> to learn how to install standalone SQL Servers on a Windows Server.</p>
  128. <h3>Enable the Always On Feature</h3>
  129. <p>Connect to both the Primary and Secondary Instances and open SQL Server 2022 Configuration Manager. Then select the SQL Server(SQL2022) Service properties and Check<em> 'Enable Always On Availability Groups'.</em></p>
  130. <p><img loading="lazy" class="wp-image-4626120 alignnone" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/clus.jpg" data-lazy-load alt="" width="569" height="429" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/clus.jpg 665w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/clus-300x226.jpg 300w" sizes="(max-width: 569px) 100vw, 569px" /></p>
  131. <h3>Create a Test Database</h3>
  132. <p>Next, connect to the Primary Instance ACS-POC-DB01\SQL2022 and create a test database named '<em>TestAG</em>'. Take a full backup of the database.</p>
  133. <p><img loading="lazy" class="wp-image-4626530 alignnone" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/db.jpg" data-lazy-load alt="" width="337" height="307" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/db.jpg 537w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/db-300x274.jpg 300w" sizes="(max-width: 337px) 100vw, 337px" /></p>
  134. <h3>Create a Contained AG</h3>
  135. <p>After taking the database backup, right click on Always On Availability Groups option and select<em> 'New Availability Group Wizard'</em></p>
  136. <p><img loading="lazy" class="wp-image-4626522  alignnone" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag1.jpg" data-lazy-load alt="" width="376" height="310" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag1.jpg 493w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag1-300x247.jpg 300w" sizes="(max-width: 376px) 100vw, 376px" /></p>
  137. <p>Provide a name '<em>SQLAG-2022</em>' for the availability Group and enable the <em>'Contained'</em> and '<em>Reuse System Databases</em>' option.</p>
  138. <p><img loading="lazy" class="wp-image-4626529 alignnone" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag2.jpg" data-lazy-load alt="" width="569" height="504" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag2.jpg 705w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag2-300x266.jpg 300w" sizes="(max-width: 569px) 100vw, 569px" /></p>
  139. <p><em><em><em><em><strong>Note:</strong> If you enable the 'Reuse System Databases' option, SQL Server replicates the existing master and msdb databases across all nodes. If you don't enable this option, SQL Server creates new master and msdb databases within the availability group, and it does not replicate the existing server-level objects. In this case, only the server-level objects that you create after the availability group is created will be replicated.</em></em></em></em></p>
  140. <p>Next, add <em>TestAG</em> database to the availability group.</p>
  141. <p><img loading="lazy" class="wp-image-4626528 alignnone" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag3.jpg" data-lazy-load alt="" width="569" height="512" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag3.jpg 672w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag3-300x270.jpg 300w" sizes="(max-width: 569px) 100vw, 569px" /></p>
  142. <p>Then, add the secondary replica <em>ACS-POC-DB01\SQL2022</em> to the availability group from the Add Replica option.</p>
  143. <p><em><img loading="lazy" class="wp-image-4626527 alignnone" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag4.jpg" data-lazy-load alt="" width="569" height="507" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag4.jpg 681w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag4-300x267.jpg 300w" sizes="(max-width: 569px) 100vw, 569px" /></p>
  144. <p><strong data-start="72" data-end="80">Note</strong>: You can leave the default settings for Endpoints, Backup Preferences, and Read-Only Routing, as this article does not cover these features in detail.</p>
  145. <p></em></p>
  146. <p>Then, create a Listener <em>'SQL2022Listener'</em> for the availability group and assign an IP address to it.</p>
  147. <p><img loading="lazy" class="wp-image-4626526 alignnone" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag5.jpg" data-lazy-load alt="" width="569" height="512" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag5.jpg 663w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag5-300x270.jpg 300w" sizes="(max-width: 569px) 100vw, 569px" /></p>
  148. <p>Finally, perform a validation test, and if all the validations are passed, verify the configuration settings.</p>
  149. <p><img loading="lazy" class="wp-image-4626525 alignnone" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag6.jpg" data-lazy-load alt="" width="569" height="521" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag6.jpg 656w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag6-300x275.jpg 300w" sizes="(max-width: 569px) 100vw, 569px" /></p>
  150. <p>Click on Finish to create the Contained Availability Group.</p>
  151. <p><img loading="lazy" class="wp-image-4626523 alignnone" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag8.jpg" data-lazy-load alt="" width="569" height="509" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag8.jpg 650w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag8-300x269.jpg 300w" sizes="(max-width: 569px) 100vw, 569px" /></p>
  152. <p>After you create the Availability Group, SQL Server automatically adds two additional system databases—<em>SQLAG-2022_master and SQLAG-2022_msdb</em>—alongside TestAG. You will see these databases on both instances.</p>
  153. <p><img loading="lazy" class="wp-image-4626534  alignnone" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag9.jpg" data-lazy-load alt="" width="408" height="405" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag9.jpg 605w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag9-300x298.jpg 300w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/ag9-150x150.jpg 150w" sizes="(max-width: 408px) 100vw, 408px" /></p>
  154. <h2>Managing Logins in a Contained Availability Group</h2>
  155. <p>Let's understand how to create a login and observe it's behavior in a Contained Availability Group. First, create a login in the Primary Instance.</p>
  156. <pre class="prettyprint  lang-mssql">:connect ACS-POC-DB01\SQL2022
  157. USE [master]
  158. GO
  159. CREATE LOGIN [user1] WITH PASSWORD=N'qwerty123', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
  160. GO</pre>
  161. <p>After running the above commands, you can verify the login by querying the <em>sys.server_principals</em> system view. <em>user1 </em>will appear in the result. However if you connect via Availability Group Listener and run the same query, you won't see <em>user1.</em> This is because contained availability groups maintains it own copy of master database separate from the instance one.</p>
  162. <p><img loading="lazy" class="wp-image-4627000 alignnone" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/logins3.jpg" data-lazy-load alt="" width="569" height="388" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/logins3.jpg 737w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/logins3-300x204.jpg 300w" sizes="(max-width: 569px) 100vw, 569px" /></p>
  163. <p>To make the login available in the context of Availability Group (thus replicating it to secondary replica), connect via listener name and create the login.</p>
  164. <pre class="prettyprint  lang-mssql">:connect SQL2022Listener,1434
  165. USE [master]
  166. GO
  167. CREATE LOGIN [user1] WITH PASSWORD=N'qwerty123', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
  168. GO</pre>
  169. <p>Now if you query <em>sys.server_principals, </em>you will see user1.</p>
  170. <p><img loading="lazy" class="wp-image-4627001 alignnone" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/logins4.jpg" data-lazy-load alt="" width="569" height="374" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/logins4.jpg 953w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/logins4-300x197.jpg 300w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/logins4-768x505.jpg 768w" sizes="(max-width: 569px) 100vw, 569px" /></p>
  171. <p>If you connect to the Secondary Instance, still you won't see <em>user1.</em> This is because <em>user1</em> exists only within the context of Availability Group and not at Instance-level. To make it available at instance level also, create the login like you created it in the primary instance.</p>
  172. <h2>Managing SQL Agent Jobs in Contained Availability Group</h2>
  173. <p>Managing jobs in Contained Availability Groups are similar to managing logins. To understand this, first create a SQL Agent job <em>TestAGJob</em> in the Primary Instance. Once the job is created, you can verify it by querying the <em>msdb.dbo.sysjobs</em> system table. You will see a record of it. However if you connect via Availability Group Listener and run the same query, you won't see the job<em>. </em>Again, this is because contained availability groups maintains it own copy of msdb database as well, separate from the instance one.</p>
  174. <p><img loading="lazy" class="wp-image-4627002 alignnone" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/JOB2.jpg" data-lazy-load alt="" width="569" height="327" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/JOB2.jpg 972w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/JOB2-300x172.jpg 300w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/JOB2-768x441.jpg 768w" sizes="(max-width: 569px) 100vw, 569px" /></p>
  175. <p>To make it available in the context of Availability Group, connect via the listener name and create the job.</p>
  176. <p><img loading="lazy" class="wp-image-4627003 alignnone" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/JOB3.jpg" data-lazy-load alt="" width="569" height="202" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/JOB3.jpg 887w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/JOB3-300x107.jpg 300w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/JOB3-768x273.jpg 768w" sizes="(max-width: 569px) 100vw, 569px" /></p>
  177. <h2>Conclusion</h2>
  178. <p>Contained Availability Groups help DBAs manage server-level objects across replicas in a high availability and disaster recovery (HADR) setup. Previously, DBAs had to manually create logins, SQL Agent jobs, and other objects on each replica. Now, by connecting to the listener and creating these objects, they are automatically available on all replicas. This not only saves time but also ensures consistency across the environment</p>
  179. <p>The post <a rel="nofollow" href="https://www.sqlservercentral.com/articles/contained-availability-groups-in-sql-server-2022">Contained Availability Groups in SQL Server 2022</a> appeared first on <a rel="nofollow" href="https://www.sqlservercentral.com">SQLServerCentral</a>.</p>
  180. ]]></content:encoded>
  181. </item>
  182. <item>
  183. <title>13 Things I wish I knew about Power Query (when I first started)</title>
  184. <link>https://www.sqlservercentral.com/articles/13-things-i-wish-i-knew-about-power-query-when-i-first-started</link>
  185. <dc:creator><![CDATA[Additional Articles]]></dc:creator>
  186. <pubDate>Wed, 20 Aug 2025 00:00:40 +0000</pubDate>
  187. <category><![CDATA[Power Query]]></category>
  188. <guid isPermaLink="false">https://www.sqlservercentral.com/?post_type=ssc_article&#038;p=4634611</guid>
  189.  
  190. <description><![CDATA[<p>When I first started with Power Query, it was in Excel, through the Power Pivot feature. I was amazed at how I could transform data with just a few clicks and quickly create PivotTables. Then, when Power Query appeared in Power BI, I began working with larger data sources and more complex projects.</p>
  191. <p>The post <a rel="nofollow" href="https://www.sqlservercentral.com/articles/13-things-i-wish-i-knew-about-power-query-when-i-first-started">13 Things I wish I knew about Power Query (when I first started)</a> appeared first on <a rel="nofollow" href="https://www.sqlservercentral.com">SQLServerCentral</a>.</p>
  192. ]]></description>
  193. <content:encoded><![CDATA[<p>The post <a rel="nofollow" href="https://www.sqlservercentral.com/articles/13-things-i-wish-i-knew-about-power-query-when-i-first-started">13 Things I wish I knew about Power Query (when I first started)</a> appeared first on <a rel="nofollow" href="https://www.sqlservercentral.com">SQLServerCentral</a>.</p>
  194. ]]></content:encoded>
  195. </item>
  196. <item>
  197. <title>Building a Database Dashboard with SSRS</title>
  198. <link>https://www.sqlservercentral.com/articles/building-a-database-dashboard-with-ssrs-2</link>
  199. <dc:creator><![CDATA[Nisarg Upadhyay]]></dc:creator>
  200. <pubDate>Mon, 18 Aug 2025 00:00:26 +0000</pubDate>
  201. <category><![CDATA[Administration]]></category>
  202. <category><![CDATA[Reporting Services (SSRS)]]></category>
  203. <guid isPermaLink="false">https://www.sqlservercentral.com/?p=4433329&#038;post_type=ssc_article&#038;preview_id=4433329</guid>
  204.  
  205. <description><![CDATA[<p>Learn how to create a dynamic database dashboard that tracks key metrics using SQL Server Reporting Services. From setting up to deploying your report.</p>
  206. <p>The post <a rel="nofollow" href="https://www.sqlservercentral.com/articles/building-a-database-dashboard-with-ssrs-2">Building a Database Dashboard with SSRS</a> appeared first on <a rel="nofollow" href="https://www.sqlservercentral.com">SQLServerCentral</a>.</p>
  207. ]]></description>
  208. <content:encoded><![CDATA[<p>A database dashboard is a graphical user interface (GUI) that summarizes the key performance indicators (KPIs) for a SQL Server database. It presents the data in a visually appealing format, such as charts, graphs, tables, and other types of visualizations, to help users easily monitor and understand the status of their database.</p>
  209. <p>In this article, I will show how we can create a database dashboard using SQL Server Reporting Services. The database dashboard contains the following details:</p>
  210. <ul>
  211. <li>Server / Host Name: Hostname / Server name on which the SQL Server is installed.</li>
  212. <li>Operating system: The operating system of the server on which the SQL Server is installed.</li>
  213. <li>SQL Server version: Version and edition of SQL Server.</li>
  214. <li>Authentication type: Authentication type used to access SQL Server instance.</li>
  215. <li>Clustering setup: Whether the SQL Server instance is clustered or stand-alone.</li>
  216. <li>Database: Total databases created in SQL Server instance.</li>
  217. <li>Total SQL Jobs: Count of SQL Server agent jobs.</li>
  218. <li>Failed SQL Jobs: Count of failed SQL Jobs in the last 7 days.</li>
  219. </ul>
  220. <h2>Demo Setup</h2>
  221. <p>For demonstration, I have created two virtual machines, named SQLWindows and SQLUbuntu. I have installed Windows Server 2019 and SQL Server 2019 developer edition on SQLWindows. I have installed Ubuntu 20.0 and SQL Server 2019 on Linux on SQLUbuntu. I have created a separate SQL Server instance on the local machine named Nisarg-PC, which connects to both SQL Server instances using Linked Server. I have created a database named SQLDashboard, storing the details of both SQL Server instances.</p>
  222. <h2>Populate Data</h2>
  223. <p>We will create a stored procedure named sp_get_server_details on SQLWindows and SQLUbuntu database servers. We will use a linked server to execute stored procedures on remote servers. The output of both stored procedures will be stored on a table named tbl_server_detail. We will create another stored procedure that stores the data populated from the linked server named sp_get_all_server_detail.</p>
  224. <p>You can read about the linked server <a href="https://learn.microsoft.com/en-us/sql/relational-databases/linked-servers/linked-servers-database-engine?view=sql-server-ver17">here</a>. We can query the sys.server_details system catalog view to populate the list of linked servers. You can execute the query using SQL Server Management studio or <a href="https://www.devart.com/dbforge/sql/studio/?utm_source=article&amp;utm_medium=referral&amp;utm_content=building+a+database+dashboard+with+ssrs">dbForge Studio for SQL Server</a>.</p>
  225. <pre class="prettyprint  lang-mssql">USE master
  226. GO
  227. SELECT name 'Server Name' , product 'Product Name' ,data_source 'Data Source Name',s.modify_date 'Modified Date',
  228. CASE WHEN is_linked =1 THEN 'Lineked Sever' WHEN is_linked=0 THEN 'Local Server' END 'Server Type'
  229. FROM sys.servers s
  230. </pre>
  231. <p>Query output:</p>
  232. <p><img loading="lazy" class="alignnone size-full wp-image-4191701" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_19-37-40.jpg" data-lazy-load alt="" width="974" height="277" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_19-37-40.jpg 974w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_19-37-40-300x85.jpg 300w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_19-37-40-768x218.jpg 768w" sizes="(max-width: 974px) 100vw, 974px" /></p>
  233. <p>The code of the sp_get_server_detail stored procedure is shown below. This procedure will be created on SQLWindows and SQLUbuntu.</p>
  234. <pre class="prettyprint  lang-mssql">USE DBATools
  235. Go
  236. IF EXISTS (SELECT name FROM dbatools.sys.procedures WHERE name='sp_get_server_detail')
  237. DROP PROCEDURE sp_get_server_detail
  238. Go
  239. create procedure sp_get_server_detail    
  240. as    
  241. begin    
  242. SELECT      
  243. Convert(varchar,SERVERPROPERTY('ServerName')) AS ServerName    
  244. ,Convert(varchar,isnull(SERVERPROPERTY('InstanceName'), 'Default')) AS [SQLServer InstanceName]    
  245. ,Convert(varchar,SUBSTRING(@@VERSION,0,CHARINDEX('(',@@VERSION)-1)) as [SQLServer Version]    
  246. ,Convert(varchar,SERVERPROPERTY('EDITION')) AS [SQLServer Edition]    
  247.  ,Convert(varchar,SERVERPROPERTY('InstanceDefaultDataPath')) AS [Default DataPath]    
  248. ,Convert(varchar,SERVERPROPERTY('InstanceDefaultLogPath')) AS [DEFAULT LogPath]
  249. ,Convert(varchar,iif(SERVERPROPERTY('IsIntegratedSecurityOnly') = 0, 'Windows and SQL Server Authentication', 'Windows Authentication')) AS [Authentication Type]    
  250. ,cpu_count AS [Total Processor],
  251. round(physical_memory_kb / 1024.0 / 1024.0, 2) AS [Physical Memory_GB]    
  252. ,sqlserver_start_time AS [LastStartTime],
  253. (select count(name) from sys.databases where database_id&gt;4) as 'Count of Databases',    
  254. (select count(name) from msdb..sysjobs where enabled=1) as 'Count of Jobs',    
  255. (SELECT  count(1) FROM    msdb.dbo.sysjobhistory h          INNER JOIN msdb.dbo.sysjobs j     ON h.job_id = j.job_id  INNER JOIN msdb.dbo.sysjobsteps s              ON j.job_id = s.job_id  AND h.step_id = s.step_id    
  256. AND h.run_date &gt; CONVERT(int     , CONVERT(varchar(10), DATEADD(DAY, -7, GETDATE()), 112)) and run_status = 0) 'Count of failed SQL Job'    
  257.  
  258. FROM sys.dm_os_sys_info  ,sys.dm_os_windows_info    
  259.  
  260. End</pre>
  261. <p>Here is the code for the tbl_all_server_detail table. This table will be created in Nisarg-PC.</p>
  262. <pre class="prettyprint  lang-mssql"> IF EXISTS (SELECT NAME
  263.           FROM   dbatools.sys.tables
  264.           WHERE  NAME = 'tbl_all_server_detail')
  265.  DROP TABLE tbl_all_server_detail
  266.  
  267. go
  268.  
  269. CREATE TABLE dbatools..tbl_all_server_detail
  270.  (
  271.     id                 INT IDENTITY(1, 1),
  272.     servername         VARCHAR(50),
  273.     instancename       VARCHAR(100),
  274.     sqlserverversion   VARCHAR(50),
  275.     sqlserveredition   VARCHAR(500),
  276.     defaultdatafile    VARCHAR(max),
  277.     defaultlogfile     VARCHAR(max),
  278.     authenticationtype VARCHAR(200),
  279.     cpucount           INT,
  280.     physicalmemory     NUMERIC(10, 2),
  281.     lastsqlstarttime   DATETIME,
  282.     databasecount      INT,
  283.     sqljobcount        INT,
  284.     sqlfailedjobcount  INT
  285.  )</pre>
  286. <p>This is the code for the sp_get_all_server_detail stored procedure. The procedure will be created on Nisarg-PC.</p>
  287. <pre class="prettyprint  lang-mssql">USE dbatools
  288. go
  289. CREATE PROCEDURE Sp_get_all_server_detail
  290. AS
  291.  BEGIN
  292.      TRUNCATE TABLE dbatools..tbl_all_server_detail
  293.  
  294.      INSERT INTO dbatools..tbl_all_server_detail
  295.      EXEC [SQLWINDOWS].[DBAtools].[dbo].[Sp_get_server_details]
  296.  
  297.      INSERT INTO dbatools..tbl_all_server_detail
  298.      EXEC [SQLUBUNTU].[DBAtools].[dbo].[Sp_get_server_details]
  299.  END</pre>
  300. <p>Now, Execute the sp_get_all_server_detail procedure. The procedure will populate data from both servers and store it in the table.</p>
  301. <pre class="prettyprint  lang-mssql">Exec dbatools..sp_get_all_server_detail</pre>
  302. <p>Once the procedure is executed, run the following query to view data.</p>
  303. <pre class="prettyprint  lang-mssql">SELECT * FROM dbatools..tbl_all_server_detail</pre>
  304. <p>Here is the query output for me:</p>
  305. <p><img loading="lazy" class="alignnone size-full wp-image-4191702" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_21-05-06.jpg" data-lazy-load alt="" width="1511" height="207" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_21-05-06.jpg 1511w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_21-05-06-300x41.jpg 300w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_21-05-06-1024x140.jpg 1024w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_21-05-06-768x105.jpg 768w" sizes="(max-width: 1511px) 100vw, 1511px" /></p>
  306. <p>Now, let us create an SSRS report to view the details of the server.</p>
  307. <h2>Create an SSRS Report</h2>
  308. <p>We are using SQL Server data tools 2017 to create an SSRS report. First, create a Reporting Service project, named DatabaseDashboard, and add a new report, named rpt_server_details. You can view the Report in Solution Explorer.</p>
  309. <p><img loading="lazy" class="alignnone size-full wp-image-4191703" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_22-02-58.jpg" data-lazy-load alt="" width="1095" height="715" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_22-02-58.jpg 1095w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_22-02-58-300x196.jpg 300w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_22-02-58-1024x669.jpg 1024w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_22-02-58-768x501.jpg 768w" sizes="(max-width: 1095px) 100vw, 1095px" /></p>
  310. <p>Now, add a data source to the Report. To do that, Open Report Data --&gt; Right-click on DataSource --&gt; Add Data Source. In the Data Source properties dialog box, specify the data source name, select Microsoft SQL Server as a Type, and Specify the connection string to connect to the DBATools database of Nisarg-PC. You can view the configured data source in Report Data pan.</p>
  311. <p><img loading="lazy" class="alignnone size-full wp-image-4191704" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_22-14-58.jpg" data-lazy-load alt="" width="1095" height="738" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_22-14-58.jpg 1095w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_22-14-58-300x202.jpg 300w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_22-14-58-1024x690.jpg 1024w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_22-14-58-768x518.jpg 768w" sizes="(max-width: 1095px) 100vw, 1095px" /></p>
  312. <p>Now, add a dataset. To do that, Right-click on Dataset --&gt; Add Data Set. Specify the Dataset name, and select use dataset embedded in the report option. Select DsServerDetails as the DataSource name and enter the following SQL query.</p>
  313. <p><img loading="lazy" class="alignnone size-full wp-image-4191705" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_22-20-28.jpg" data-lazy-load alt="" width="756" height="766" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_22-20-28.jpg 756w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_22-20-28-296x300.jpg 296w" sizes="(max-width: 756px) 100vw, 756px" /></p>
  314. <p>Save the dataset by closing the dialog box. You can view the dataset in Report Data.</p>
  315. <p><img loading="lazy" class="alignnone size-full wp-image-4191721" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_23-57-49-1.jpg" data-lazy-load alt="" width="229" height="482" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_23-57-49-1.jpg 229w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_23-57-49-1-143x300.jpg 143w" sizes="(max-width: 229px) 100vw, 229px" /></p>
  316. <p>The report designer tools are in Toolbox. We are creating a list report; hence we will use the table tool of the report designer. Drag and drop the table tool in the report designer pan.</p>
  317. <p><img loading="lazy" class="alignnone size-full wp-image-4191707" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_23-17-10.jpg" data-lazy-load alt="" width="1363" height="744" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_23-17-10.jpg 1363w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_23-17-10-300x164.jpg 300w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_23-17-10-1024x559.jpg 1024w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_23-17-10-768x419.jpg 768w" sizes="(max-width: 1363px) 100vw, 1363px" /></p>
  318. <p>Now, drag and drop all fields of Dataset_server_details in a table tool, which looks like the following image:</p>
  319. <p><img loading="lazy" class="alignnone size-full wp-image-4191706" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_23-14-15.jpg" data-lazy-load alt="" width="1363" height="744" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_23-14-15.jpg 1363w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_23-14-15-300x164.jpg 300w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_23-14-15-1024x559.jpg 1024w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_23-14-15-768x419.jpg 768w" sizes="(max-width: 1363px) 100vw, 1363px" /></p>
  320. <p>Once Report is prepared, click on Preview to view the Report, which looks like the below image:</p>
  321. <p><img loading="lazy" class="alignnone size-full wp-image-4191708" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_23-23-36.jpg" data-lazy-load alt="" width="1737" height="256" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_23-23-36.jpg 1737w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_23-23-36-300x44.jpg 300w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_23-23-36-1024x151.jpg 1024w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_23-23-36-768x113.jpg 768w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-13_23-23-36-1536x226.jpg 1536w" sizes="(max-width: 1737px) 100vw, 1737px" /></p>
  322. <h2>Deploy the SSRS report</h2>
  323. <p>Let us deploy the Report on the report server configured in Nisarg-PC. You can read <a href="https://learn.microsoft.com/en-us/sql/reporting-services/report-server/configure-a-report-server-reporting-services-native-mode?view=sql-server-ver16">Configure a Report Server</a> to learn more about the deployment process of SSRS reports on a Report Server. To deploy the reports, we must specify the TargetServerURL and TargetReportFolder. You can find the Report Server URL in Reporting Service Configuration Manager. The following image is for reference.</p>
  324. <p><img loading="lazy" class="alignnone size-full wp-image-4191698" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-14_00-31-06.jpg" data-lazy-load alt="" width="819" height="445" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-14_00-31-06.jpg 819w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-14_00-31-06-300x163.jpg 300w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-14_00-31-06-768x417.jpg 768w" sizes="(max-width: 819px) 100vw, 819px" /></p>
  325. <p>In our case, the report server URL is <em><span class="text--underline">nisarg-pc/ReportServer/</span></em>. To deploy the Report, right-click on Database Dashboard --&gt; Properties. Specify the above URL in TargetServerURL and Database Dashboard as TargetReportFolder. Following image is for reference.</p>
  326. <p>To begin the deployment, Select Build from top menu and click Deploy Solution.</p>
  327. <p><img loading="lazy" class="alignnone size-full wp-image-4191699" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-14_00-34-26.jpg" data-lazy-load alt="" width="728" height="479" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-14_00-34-26.jpg 728w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-14_00-34-26-300x197.jpg 300w" sizes="(max-width: 728px) 100vw, 728px" /></p>
  328. <p>Once the deployment completes, open Web Portal URL of Report Server which is <span class="text--underline"><em>nisarg-pc/Reports/report/DatabaseDashboard/rpt_server_details</em></span>. Here you can see the server detail report. See following image for reference.</p>
  329. <p><img loading="lazy" class="alignnone size-full wp-image-4191700" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-14_00-45-28.jpg" data-lazy-load alt="" width="1697" height="344" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-14_00-45-28.jpg 1697w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-14_00-45-28-300x61.jpg 300w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-14_00-45-28-1024x208.jpg 1024w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-14_00-45-28-768x156.jpg 768w, https://www.sqlservercentral.com/wp-content/uploads/2023/05/2023-05-14_00-45-28-1536x311.jpg 1536w" sizes="(max-width: 1697px) 100vw, 1697px" /></p>
  330. <h2>Summary</h2>
  331. <p>This article explains how to create a basic SSRS report to show the details of the database servers. Also, we learn the basic process of creating a list report and deploying it on the Report Server. This article can be a good start to creating a customized report to show the SQL Server details. In the next article, I will show you how we can provide more insights, like a list of databases and their properties, a storage summary, and insights of SQL Server Agent Jobs.</p>
  332. <p>The post <a rel="nofollow" href="https://www.sqlservercentral.com/articles/building-a-database-dashboard-with-ssrs-2">Building a Database Dashboard with SSRS</a> appeared first on <a rel="nofollow" href="https://www.sqlservercentral.com">SQLServerCentral</a>.</p>
  333. ]]></content:encoded>
  334. </item>
  335. <item>
  336. <title>Split strings by Regular Expressions in SQL Server 2025</title>
  337. <link>https://www.sqlservercentral.com/articles/split-strings-by-regular-expressions-in-sql-server-2025</link>
  338. <dc:creator><![CDATA[Additional Articles]]></dc:creator>
  339. <pubDate>Mon, 18 Aug 2025 00:00:55 +0000</pubDate>
  340. <category><![CDATA[Regular Expressions]]></category>
  341. <category><![CDATA[SQL Server 2025]]></category>
  342. <category><![CDATA[T-SQL]]></category>
  343. <guid isPermaLink="false">https://www.sqlservercentral.com/?post_type=ssc_article&#038;p=4634612</guid>
  344.  
  345. <description><![CDATA[<p>SQL Server users have been asking for native regular expression support for over two decades. There are third-party Common Language Runtime (CLR) modules that offer this functionality, but these can be complicated to install and simply aren’t possible in some environments. I want to split a string using a regular expression instead of a static string. Will that be possible in SQL Server 2025, without CLR?</p>
  346. <p>The post <a rel="nofollow" href="https://www.sqlservercentral.com/articles/split-strings-by-regular-expressions-in-sql-server-2025">Split strings by Regular Expressions in SQL Server 2025</a> appeared first on <a rel="nofollow" href="https://www.sqlservercentral.com">SQLServerCentral</a>.</p>
  347. ]]></description>
  348. <content:encoded><![CDATA[<p>The post <a rel="nofollow" href="https://www.sqlservercentral.com/articles/split-strings-by-regular-expressions-in-sql-server-2025">Split strings by Regular Expressions in SQL Server 2025</a> appeared first on <a rel="nofollow" href="https://www.sqlservercentral.com">SQLServerCentral</a>.</p>
  349. ]]></content:encoded>
  350. </item>
  351. <item>
  352. <title>How to create your custom GPT SQL Expert</title>
  353. <link>https://www.sqlservercentral.com/articles/how-to-create-your-custom-gpt-sql-expert</link>
  354. <dc:creator><![CDATA[Daniel Calbimonte]]></dc:creator>
  355. <pubDate>Mon, 11 Aug 2025 09:00:45 +0000</pubDate>
  356. <category><![CDATA[Uncategorized]]></category>
  357. <guid isPermaLink="false">https://www.sqlservercentral.com/?post_type=ssc_article&#038;p=4625806</guid>
  358.  
  359. <description><![CDATA[<p>Introduction ChatGPT includes custom GPTs. You can create your own custom GPT. In this article, we will demonstrate how to create a custom GPT expert in SQL Server. Requirements To create your own GPT, you need to use the paid version of ChatGPT. First, go to ChatGPT. Secondly, if you don’t have the paid version, [&#8230;]</p>
  360. <p>The post <a rel="nofollow" href="https://www.sqlservercentral.com/articles/how-to-create-your-custom-gpt-sql-expert">How to create your custom GPT SQL Expert</a> appeared first on <a rel="nofollow" href="https://www.sqlservercentral.com">SQLServerCentral</a>.</p>
  361. ]]></description>
  362. <content:encoded><![CDATA[<h2>Introduction</h2>
  363. <p>ChatGPT includes custom GPTs. You can create your own custom GPT. In this article, we will demonstrate how to create a custom GPT expert in SQL Server.</p>
  364. <h2>Requirements</h2>
  365. <p>To create your own GPT, you need to use the paid version of ChatGPT.</p>
  366. <p>First, go to <a href="https://chatgpt.com/">ChatGPT.</a></p>
  367. <p>Secondly, if you don’t have the paid version, go to View plans.</p>
  368. <p><img loading="lazy" width="175" height="173" class="wp-image-4625812" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/view-plans-to-enable-custom-gpts.png" data-lazy-load alt="View plans to enable Custom GPTs" /></p>
  369. <p>Finally, upgrade your plan to a paid version in ChatGPT. You can use the Plus or the Pro version. The Business plan will work as well.</p>
  370. <p><img loading="lazy" width="682" height="792" class="wp-image-4625813" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/plus-plan-to-have-custom-gpts.png" data-lazy-load alt="Plus plan to have Custom GPTs" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/plus-plan-to-have-custom-gpts.png 682w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/plus-plan-to-have-custom-gpts-258x300.png 258w" sizes="(max-width: 682px) 100vw, 682px" /></p>
  371. <h2>Getting started</h2>
  372. <p>Let’s dive in.</p>
  373. <p>First, in ChatGPT, go to the GPTs section.</p>
  374. <p><img loading="lazy" width="208" height="78" class="wp-image-4625814" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/create-your-custom-gpts.png" data-lazy-load alt="Create your custom GPTs" /></p>
  375. <p>Secondly, at the top right, select the Create button.</p>
  376. <p>You will have two options to create your custom GPT:</p>
  377. <p><img loading="lazy" width="838" height="259" class="wp-image-4625815" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/create-button-to-create-a-custom-gpt-.png" data-lazy-load alt="Create button to create a custom GPT." data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/create-button-to-create-a-custom-gpt-.png 838w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/create-button-to-create-a-custom-gpt--300x93.png 300w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/create-button-to-create-a-custom-gpt--768x237.png 768w" sizes="(max-width: 838px) 100vw, 838px" /></p>
  378. <ul>
  379. <li>First, we have the Create option is a wizard with questions to create your GPT.</li>
  380. <li>Secondly, the Configure option, which is a faster method to create a GPT. In this example, we will focus on the configure option.</li>
  381. </ul>
  382. <p><img loading="lazy" width="838" height="259" class="wp-image-4625816" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/configure-option-for-the-gpt.png" data-lazy-load alt="Configure option for the GPT" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/configure-option-for-the-gpt.png 838w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/configure-option-for-the-gpt-300x93.png 300w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/configure-option-for-the-gpt-768x237.png 768w" sizes="(max-width: 838px) 100vw, 838px" /></p>
  383. <h2>Use the Configure add a logo for the custom GPT</h2>
  384. <p>First, press the plus button to create your logo.</p>
  385. <h1><img loading="lazy" width="807" height="137" class="wp-image-4625817" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/button-to-add-a-logo-.png" data-lazy-load alt="+ Button to add a logo." data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/button-to-add-a-logo-.png 807w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/button-to-add-a-logo--300x51.png 300w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/button-to-add-a-logo--768x130.png 768w" sizes="(max-width: 807px) 100vw, 807px" /></h1>
  386. <p>Secondly, you can upload a photo, create a new one using DALL·E (the ChatGPT image generator), or add your image.</p>
  387. <p><img loading="lazy" width="275" height="167" class="wp-image-4625818" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/use-dall-e-to-generate-a-logo.png" data-lazy-load alt="Use DALL-E to generate a logo" /></p>
  388. <p>Let’s try DALL·E.</p>
  389. <p>First, we will create the virtual assistant:</p>
  390. <p><strong>Daniel:</strong></p>
  391. <p>A young woman with fair skin and long brown hair styled in a high ponytail. She wears a black over-ear headset with a cushioned headband and an adjustable microphone. Her calm expression and natural beauty are complemented by a subtle, gentle smile that doesn't show her teeth. She is dressed in a simple, snug navy blue cropped T-shirt and high-waisted denim jeans. The background is a neutral gray, with soft, even lighting that highlights her features.</p>
  392. <h1><img loading="lazy" width="697" height="1046" class="wp-image-4625819" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/generated-image.jpeg" data-lazy-load alt="Generated image" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/generated-image.jpeg 697w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/generated-image-200x300.jpeg 200w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/generated-image-682x1024.jpeg 682w" sizes="(max-width: 697px) 100vw, 697px" /></h1>
  393. <p>Secondly, I will add our SQLServerCentral Logo (use any image editor of your preference):</p>
  394. <p><img loading="lazy" width="751" height="755" class="wp-image-4625820" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/assistant-logo.jpeg" data-lazy-load alt="Assistant logo" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/assistant-logo.jpeg 751w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/assistant-logo-298x300.jpeg 298w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/assistant-logo-150x150.jpeg 150w" sizes="(max-width: 751px) 100vw, 751px" /></p>
  395. <p>Once created, use the Upload Photo option in ChatGPT to add the image created.</p>
  396. <p><img loading="lazy" width="275" height="167" class="wp-image-4625821" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/upload-photo-for-custom-gpt.png" data-lazy-load alt="Upload photo for custom GPT" /></p>
  397. <h2>Add a name and a description to create your custom GPT</h2>
  398. <p>Once we have a logo, we will fill in the options.</p>
  399. <p>First, we need to add a name for the GPT. In this case, we will call it the SQL ServerCentral assistant.</p>
  400. <p><img loading="lazy" width="744" height="223" class="wp-image-4625822" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/name.png" data-lazy-load alt="Name" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/name.png 744w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/name-300x90.png 300w" sizes="(max-width: 744px) 100vw, 744px" /></p>
  401. <p>Secondly, we will need a description explaining what this GPT does. In this example, we will add the following description:</p>
  402. <p>SQL Server assistant GPT provides expert-level assistance on SQL Server topics, offering solutions for troubleshooting, query optimization. Leveraging knowledge from SQLServerCentral, it helps database administrators and developers with insights and solutions for SQL Server challenges.</p>
  403. <p>The description should clearly explain what this GPT does and how it can help you. This description supports only 300 characters at the time this article was written.</p>
  404. <p><img loading="lazy" width="742" height="75" class="wp-image-4625823" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/custom-gpt-description.png" data-lazy-load alt="Custom GPT description" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/custom-gpt-description.png 742w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/custom-gpt-description-300x30.png 300w" sizes="(max-width: 742px) 100vw, 742px" /></p>
  405. <h2>Add instructions and provide conversation starter information to the custom GPT</h2>
  406. <p>In this section, we will explain our GPT the tone to use, content focus, style, and ethical guidelines.</p>
  407. <p>Here we suggest some instructions:</p>
  408. <ul>
  409. <li>First, adopt a friendly, professional, and clear tone.</li>
  410. <li>Secondly, provide concise, informative, and actionable responses.</li>
  411. <li>Thirdly, maintain a formal or technical tone when answering questions related to specialized fields.</li>
  412. <li>Also, prioritize accuracy and clarity in all responses.</li>
  413. <li>In addition, offer explanations that are beginner-friendly but also include advanced details for experienced users.</li>
  414. <li>Focus on providing solutions, examples, and best practices.</li>
  415. <li>Moreover, provide in-depth knowledge on SQL Server, covering topics like optimization, troubleshooting, and query writing.</li>
  416. <li>In particular, answer questions based on authoritative sources and trusted community insights.</li>
  417. <li>To elaborate, respond to user queries with step-by-step solutions or clear explanations.</li>
  418. <li>If a solution is complex, break it down into digestible parts.</li>
  419. <li>Another key point is to include code snippets or diagrams where applicable for clarity.</li>
  420. <li>Specifically, offer practical, actionable advice that the user can implement immediately.</li>
  421. <li>Ask for clarification if a question is ambiguous, and suggest possible solutions when appropriate.</li>
  422. <li>Likewise, tailor your responses to the user's level of expertise, whether they are beginners or advanced users.</li>
  423. <li>On top of that, respond with SQL Server-centric solutions, prioritizing user needs based on their query.</li>
  424. <li>Ensure responses are ethical, respectful, and non-biased.</li>
  425. <li>Not to mention, do not provide harmful or illegal content.</li>
  426. </ul>
  427. <p><img loading="lazy" width="642" height="287" class="wp-image-4625824" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/instructions.png" data-lazy-load alt="Instructions" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/instructions.png 642w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/instructions-300x134.png 300w" sizes="(max-width: 642px) 100vw, 642px" /></p>
  428. <h2>Conversation starters</h2>
  429. <p>Also, you can create the conversation starter information; this option allows setting a tone to start the interaction with the users. Here you have an example of a conversation started:</p>
  430. <p>Hi there! I'm your SQL Server Expert GPT, here to help you with any SQL Server-related questions or challenges. Whether you're troubleshooting, optimizing queries, or exploring new features, I'm here to provide solutions, insights, and practical advice. How can I assist you today?</p>
  431. <p><img loading="lazy" width="942" height="229" class="wp-image-4625825" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/converstation-starters-for-custom-gpts.png" data-lazy-load alt="Converstation starters for custom GPTs" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/converstation-starters-for-custom-gpts.png 942w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/converstation-starters-for-custom-gpts-300x73.png 300w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/converstation-starters-for-custom-gpts-768x187.png 768w" sizes="(max-width: 942px) 100vw, 942px" /></p>
  432. <p>You can create multiple conversation starters. This will help you to set the main tasks that the GPT can do to help.</p>
  433. <h2>Add knowledge to the custom GPT</h2>
  434. <p>The Knowledge section is the most important part of the GPT creation. This section provides the knowledge to the GPT. Here you can add files from your knowledge base to the GPT. Usually, you will provide JSON files, XML files, or YAML files here.</p>
  435. <p>First, you will need to have some files with the information of the service that you want to provide, and then select the Upload files button and select the files to upload.</p>
  436. <p><img loading="lazy" width="913" height="430" class="wp-image-4625826" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/knowledge-files.png" data-lazy-load alt="knowledge files" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/knowledge-files.png 913w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/knowledge-files-300x141.png 300w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/knowledge-files-768x362.png 768w" sizes="(max-width: 913px) 100vw, 913px" /></p>
  437. <h2>Recommended model used by the custom GPT</h2>
  438. <p>There is also an option to select the recommended model for our GPT. The best option is to use No Recommended Model; users will use any model they prefer.</p>
  439. <p>We do not know which license plan the customer uses, so it is better to let the user decide.</p>
  440. <p><img loading="lazy" width="760" height="421" class="wp-image-4625827" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/custom-gpts-recommended-model.png" data-lazy-load alt="Custom GPTs recommended model" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/custom-gpts-recommended-model.png 760w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/custom-gpts-recommended-model-300x166.png 300w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/custom-gpts-recommended-model-128x72.png 128w" sizes="(max-width: 760px) 100vw, 760px" /></p>
  441. <p>First, we have GPT-4.1 is for deep reasoning and critical thinking.</p>
  442. <p>Secondly, GPT-4.1-mini is for general use and is faster. It does not require many computer resources.</p>
  443. <p>Thirdly, GPT-4.5 is complex and used for tech applications.</p>
  444. <p>Also, we have GPT-4o, which is used for real-time and multimodal tasks.</p>
  445. <p>Finally, o3, o4-mini are lightweight and cheaper versions</p>
  446. <h2>Capabilities</h2>
  447. <p>If you want, you can select the capabilities that you want to include in the model, like the following:</p>
  448. <ul>
  449. <li>First, we have a web Search that allows the GPT to navigate and find information on the web.</li>
  450. </ul>
  451. <p>Secondly, we can use Canvas to create images, interactive elements, or modify existing images.</p>
  452. <ul>
  453. <li>Thirdly, we can use 4o Image generation is used to create images using AI.</li>
  454. <li>Also, we can use the code Interpreter &amp; Data Analysis if we need to analyse data and code.</li>
  455. </ul>
  456. <p>Actions</p>
  457. <p><img loading="lazy" width="336" height="194" class="wp-image-4625828" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/capabilities.png" data-lazy-load alt="capabilities" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/capabilities.png 336w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/capabilities-300x173.png 300w" sizes="(max-width: 336px) 100vw, 336px" /></p>
  458. <h2>Create a new action</h2>
  459. <p>The actions are used to invoke REST API services. The REST API lets you connect with data from other places and exchange data. For example, you can invoke and get Facebook, LinkedIn data using the REST API.</p>
  460. <p>First, to create a new action, press the Create new action button.</p>
  461. <p><img loading="lazy" width="419" height="188" class="wp-image-4625829" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/create-new-action.png" data-lazy-load alt="Create new action" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/create-new-action.png 419w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/create-new-action-300x135.png 300w" sizes="(max-width: 419px) 100vw, 419px" /></p>
  462. <p>Secondly, you will have different options to add actions.</p>
  463. <p><img loading="lazy" width="957" height="757" class="wp-image-4625830" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/add-action.png" data-lazy-load alt="Add action" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/add-action.png 957w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/add-action-300x237.png 300w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/add-action-768x607.png 768w" sizes="(max-width: 957px) 100vw, 957px" /></p>
  464. <p>First, you have the authentication, which allows you to specify credentials to connect to the REST API. You can use an API key, which is a secret key used to connect to the REST API. Additionally, you can utilize OAuth, a more secure and advanced connection method to the REST API.</p>
  465. <p><img loading="lazy" width="368" height="160" class="wp-image-4625831" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/authentication.png" data-lazy-load alt="Authentication" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/authentication.png 368w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/authentication-300x130.png 300w" sizes="(max-width: 368px) 100vw, 368px" /></p>
  466. <p>Secondly, you have to import the URL of the REST API service</p>
  467. <h2>Additional Settings</h2>
  468. <p>Also, you have an option to use the data from the conversation. This option helps to improve the model.</p>
  469. <p><img loading="lazy" width="525" height="80" class="wp-image-4625832" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/additional-settings.png" data-lazy-load alt="Additional Settings" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/additional-settings.png 525w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/additional-settings-300x46.png 300w" sizes="(max-width: 525px) 100vw, 525px" /></p>
  470. <h2>Use your GPT</h2>
  471. <p>Once the options are set, press the create button to create your GPT.</p>
  472. <p><img loading="lazy" width="125" height="53" class="wp-image-4625833" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/create-button.png" data-lazy-load alt="Create button" /></p>
  473. <p>Also, go to My GPTs to use your custom GPT just created.</p>
  474. <p><img loading="lazy" width="257" height="83" class="wp-image-4625834" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/my-gpts-created.png" data-lazy-load alt="My GPTs created" /></p>
  475. <p>You will be able to use your GPT there. With the pencil, you can edit your GPT.</p>
  476. <p><img loading="lazy" width="1032" height="406" class="wp-image-4625835" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/edit-custom-gpts.png" data-lazy-load alt="Edit custom GPTs" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/edit-custom-gpts.png 1032w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/edit-custom-gpts-300x118.png 300w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/edit-custom-gpts-1024x403.png 1024w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/edit-custom-gpts-768x302.png 768w" sizes="(max-width: 1032px) 100vw, 1032px" /></p>
  477. <p>If you need to change something, you have to modify a property and press the update button.</p>
  478. <p><img loading="lazy" width="604" height="155" class="wp-image-4625836" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/word-image-1.png" data-lazy-load data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/word-image-1.png 604w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/word-image-1-300x77.png 300w" sizes="(max-width: 604px) 100vw, 604px" /></p>
  479. <p>Click on the model to use it.</p>
  480. <p><img loading="lazy" width="718" height="578" class="wp-image-4625837" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/07/word-image-2.png" data-lazy-load data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/07/word-image-2.png 718w, https://www.sqlservercentral.com/wp-content/uploads/2025/07/word-image-2-300x242.png 300w" sizes="(max-width: 718px) 100vw, 718px" /></p>
  481. <p>Let’s ask something to the SQL Server Central GPT.</p>
  482. <p><strong>Me:</strong> How can I automate the SQL Server access?</p>
  483. <p><strong>SQL Server Central Assistant:</strong></p>
  484. <p>You can automate SQL Server access reviews by following a structured process that involves collecting, storing, and reporting on user access information. Here's a concise breakdown of the steps you can take:</p>
  485. <h3>1. Create a Utility Database</h3>
  486. <p>Create a utility database (e.g., DBUtility) to store your access review data.</p>
  487. <h3>2. Create Tables</h3>
  488. <p>Set up the following tables:</p>
  489. <ul>
  490. <li>tbl_SysAdmins: Stores server-level sysadmin logins.</li>
  491. <li>tbl_DBRoleMembers: Stores database user roles.</li>
  492. <li>tbl_WindowsGroupMembers: (Optional) Stores Active Directory group memberships.</li>
  493. </ul>
  494. <h3>3. Create Stored Procedures</h3>
  495. <p>Develop stored procedures to gather access information:</p>
  496. <ul>
  497. <li>sp_CollectSysAdminMembers: Collects sysadmin-level access.</li>
  498. <li>sp_CollectDBRoleMembers: Collects database-level roles.</li>
  499. <li>sp_CollectWindowsGrpMembers: Collects AD group members (if applicable).</li>
  500. </ul>
  501. <h3>4. Data Collection Execution</h3>
  502. <p>Run the stored procedures to collect current access data into the tables.</p>
  503. <h3>5. Reporting Procedure</h3>
  504. <p>Create a stored procedure sp_SendUARReport to compile the collected data and send it via email in an HTML report format to the relevant stakeholders.</p>
  505. <h3>6. Automation via SQL Server Agent</h3>
  506. <p>Create a SQL Server Agent job with the following steps:</p>
  507. <ol>
  508. <li>First, execute sp_CollectSysAdminMembers.</li>
  509. <li>Secondly, execute sp_CollectDBRoleMembers.</li>
  510. <li>Execute sp_CollectWindowsGrpMembers (if using AD groups).</li>
  511. <li>Finally, execute sp_SendUARReport.</li>
  512. </ol>
  513. <p>Schedule this job according to your organization's review policy (quarterly, semi-annually, etc.).</p>
  514. <h3>Benefits</h3>
  515. <ul>
  516. <li>First, reduces manual efforts.</li>
  517. <li>Standardizes reporting.</li>
  518. <li>Provides a clear audit trail for compliance.</li>
  519. </ul>
  520. <p>You can find detailed scripts and examples here:</p>
  521. <p><a href="https://www.sqlservercentral.com/articles/automating-sql-server-access-review" target="_new" rel="noopener">SQLServerCentral: Automating SQL Server Access Review</a></p>
  522. <p>For more information, visit our site: <a href="https://www.sqlservercentral.com/" target="_new" rel="noopener">https://www.sqlservercentral.com/</a></p>
  523. <p>To conclude, we can say that creating a custom GPT is a straightforward process if you have the information ready to upload.</p>
  524. <h2>Next Steps</h2>
  525. <p>For more information about GPTs:</p>
  526. <ul>
  527. <li><a href="https://help.openai.com/en/articles/8554397-creating-a-gpt">Creating a GPT</a></li>
  528. <li><a href="https://platform.openai.com/docs/actions/introduction">GPT Actions</a></li>
  529. <li><a href="https://platform.openai.com/docs/actions/authentication">GPT Action authentication</a></li>
  530. </ul>
  531. <p>&nbsp;</p>
  532. <div id="ag-1753217978828"></div>
  533. <p>The post <a rel="nofollow" href="https://www.sqlservercentral.com/articles/how-to-create-your-custom-gpt-sql-expert">How to create your custom GPT SQL Expert</a> appeared first on <a rel="nofollow" href="https://www.sqlservercentral.com">SQLServerCentral</a>.</p>
  534. ]]></content:encoded>
  535. </item>
  536. <item>
  537. <title>Securing the Data Layer: Why SQL Developers Should Care About App-Level Vulnerabilities</title>
  538. <link>https://www.sqlservercentral.com/articles/securing-the-data-layer-why-sql-developers-should-care-about-app-level-vulnerabilities</link>
  539. <dc:creator><![CDATA[Karl Oscarsson]]></dc:creator>
  540. <pubDate>Thu, 12 Jun 2025 09:32:22 +0000</pubDate>
  541. <category><![CDATA[Database Development]]></category>
  542. <guid isPermaLink="false">https://www.sqlservercentral.com/?post_type=ssc_article&#038;p=4601851</guid>
  543.  
  544. <description><![CDATA[<p>Meta Description: App-level vulnerabilities can co...</p>
  545. <p>The post <a rel="nofollow" href="https://www.sqlservercentral.com/articles/securing-the-data-layer-why-sql-developers-should-care-about-app-level-vulnerabilities">Securing the Data Layer: Why SQL Developers Should Care About App-Level Vulnerabilities</a> appeared first on <a rel="nofollow" href="https://www.sqlservercentral.com">SQLServerCentral</a>.</p>
  546. ]]></description>
  547. <content:encoded><![CDATA[<p><span class="editor__editorial-note" style="color: red; font-family: monospace;">Editor: This is AI generated, which is against our policy.</span></p>
  548. <h2>The Hidden Risks Above the Database</h2>
  549. <p>In today’s increasingly complex tech stacks, securing the data layer is no longer just about firewalls, access permissions, and stored procedures. SQL developers often work under the assumption that as long as their database is configured correctly and queries are optimized, their job is done. However, this mindset overlooks a crucial threat vector: the application layer. Vulnerabilities in the code that interacts with the database—such as APIs, web apps, or microservices—can expose sensitive data even if the SQL server itself remains untouched.</p>
  550. <p>That’s why more organizations are turning to external validation methods, like a well-structured <a href="https://cantina.xyz/solutions/bounties" target="_blank" rel="noopener noreferrer">bug bounty program</a>, to catch issues that internal teams may miss. Platforms like <a href="https://cantina.xyz/" target="_blank" rel="noopener noreferrer">Cantina</a> are helping development teams bring ethical hackers into the fold, allowing them to test the real-world resilience of their infrastructure, including the endpoints that connect directly or indirectly to critical SQL resources.</p>
  551. <figure class="wp-caption alignnone"><img loading="lazy" class="size-wp-image-4601852 size- aligncenter wp-image-large" title="sql-developer-collaborating-with-frontend-on-security-fix" src="data:image/gif;base64,R0lGODlhAQABAPAAAPLy8v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://www.sqlservercentral.com/wp-content/uploads/2025/06/sqlservercentral-1-1024x683.jpg" data-lazy-load alt="sql-developer-collaborating-with-frontend-on-security-fix" width="1024" height="683" data-srcset="https://www.sqlservercentral.com/wp-content/uploads/2025/06/sqlservercentral-1-1024x683.jpg 1024w, https://www.sqlservercentral.com/wp-content/uploads/2025/06/sqlservercentral-1-300x200.jpg 300w, https://www.sqlservercentral.com/wp-content/uploads/2025/06/sqlservercentral-1-768x512.jpg 768w, https://www.sqlservercentral.com/wp-content/uploads/2025/06/sqlservercentral-1-1536x1024.jpg 1536w, https://www.sqlservercentral.com/wp-content/uploads/2025/06/sqlservercentral-1-2048x1365.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /> cantina-bug-bounty-dashboard-with-app-vulnerability-reports</p>
  552. <h2>Why SQL Isn’t an Island: The Interconnected Nature of Application Security</h2>
  553. <p>Securing the data layer requires acknowledging one fundamental truth: your SQL database is only as secure as the most vulnerable part of the system interacting with it. Whether it’s a poorly validated user input in a web form or an unpatched third-party library in your backend, any exploit in the upper layers of the stack can ultimately lead to <a href="https://www.sqlservercentral.com/forums/topic/whats-the-difference-between-the-data-reconciliation-layer-and-etl-processes" target="_blank" rel="noopener noreferrer">data exfiltration</a>, corruption, or even a total system compromise.</p>
  554. <p>For example, consider SQL injection—not a flaw in SQL itself, but a failure of input sanitization at the application level. While many development frameworks now include built-in protections, misconfigured routes or manually written query strings can still open doors to attackers. SQL developers, therefore, have a vested interest in collaborating with frontend and middleware developers to identify and remediate these gaps.</p>
  555. <h2>The Role of Bug Bounty Programs in End-to-End Security</h2>
  556. <p>To go beyond unit tests and static analysis, companies are increasingly investing in bug bounty programs. These programs invite vetted security researchers—also known as ethical hackers—to probe live systems for vulnerabilities under controlled and legal conditions. Unlike traditional penetration testing, bug bounty programs provide continuous feedback, adapting as your software stack evolves.</p>
  557. <p>Cantina, a trusted provider in the Web3 and software security space, has built an entire ecosystem around responsible disclosure and incentivized security. Their platform allows engineering teams to define scope, assess vulnerability reports, and apply fixes without the high costs or limited windows typical of one-time audits. In essence, Cantina transforms security into a shared, collaborative process, rather than an afterthought or compliance checkbox.</p>
  558. <h2>From Stored Procedures to Secure APIs: Where SQL Developers Fit In</h2>
  559. <p>You might wonder, what does this have to do with <a href="https://www.coursera.org/articles/sql-developer" target="_blank" rel="noopener noreferrer">SQL developers</a> specifically? Quite a lot, in fact. When an external researcher identifies a vulnerability—say, a flaw in an API call that mishandles authentication—it’s often the database that holds the compromised data. Thus, remediation efforts require full-stack collaboration: altering database permissions, creating audit logs, or even restructuring queries to mitigate data exposure.</p>
  560. <p>Moreover, SQL developers frequently build and maintain views, functions, and triggers that interface with user-generated data. These components, while powerful, can become liabilities if the application logic built around them is flawed. Participating in discussions around security disclosures and integrating fix recommendations is not only beneficial—it’s necessary.</p>
  561. <h2>Securing the Data Layer Is a Shared Responsibility</h2>
  562. <p>The push for better software security has expanded beyond CISOs and security engineers. Today, every member of a development team—including those focused exclusively on the backend—has a role to play. With frameworks and tools becoming more modular, attackers are increasingly looking for soft targets: loosely guarded entry points that allow lateral movement into more sensitive systems.</p>
  563. <p>By adopting a collaborative mindset and encouraging the use of platforms like Cantina, teams can reduce these attack surfaces significantly. When ethical hackers are actively testing the boundaries of your software stack, your internal team gains insights that might otherwise take months—or a breach—to uncover.</p>
  564. <h2>The Bottom Line: Proactive Security Starts with Awareness</h2>
  565. <p>In a world where cyberattacks are more sophisticated and frequent, securing the data layer cannot be siloed into the realm of database administrators or backend engineers. It must be a holistic, organization-wide effort that spans from the user interface down to the database schema.</p>
  566. <p>App-level vulnerabilities are real, and their consequences can be devastating. But by acknowledging this interdependence—and leveraging innovative solutions like bug bounty programs through platforms such as Cantina—SQL developers can become vital players in creating truly secure systems.</p>
  567. <p>Whether you're optimizing queries or designing schema logic, understanding what lies above your database is just as important as knowing what lies within.</p>
  568. <p>The post <a rel="nofollow" href="https://www.sqlservercentral.com/articles/securing-the-data-layer-why-sql-developers-should-care-about-app-level-vulnerabilities">Securing the Data Layer: Why SQL Developers Should Care About App-Level Vulnerabilities</a> appeared first on <a rel="nofollow" href="https://www.sqlservercentral.com">SQLServerCentral</a>.</p>
  569. ]]></content:encoded>
  570. </item>
  571. <item>
  572. <title>Common SQL Server Problems: Network Related or Instance Specific Error Occurred</title>
  573. <link>https://www.sqlservercentral.com/articles/common-sql-server-problems-network-related-or-instance-specific-error-occurred</link>
  574. <dc:creator><![CDATA[Additional Articles]]></dc:creator>
  575. <pubDate>Fri, 15 Aug 2025 00:00:15 +0000</pubDate>
  576. <category><![CDATA[Administration]]></category>
  577. <category><![CDATA[Database Administration]]></category>
  578. <guid isPermaLink="false">https://www.sqlservercentral.com/?post_type=ssc_article&#038;p=4634609</guid>
  579.  
  580. <description><![CDATA[<p>This is the first in a series of articles meant to provide practical solutions to common issues. In this post, we’ll talk about one of the most pervasive error messages out there:</p>
  581. <p>The post <a rel="nofollow" href="https://www.sqlservercentral.com/articles/common-sql-server-problems-network-related-or-instance-specific-error-occurred">Common SQL Server Problems: Network Related or Instance Specific Error Occurred</a> appeared first on <a rel="nofollow" href="https://www.sqlservercentral.com">SQLServerCentral</a>.</p>
  582. ]]></description>
  583. <content:encoded><![CDATA[<p>The post <a rel="nofollow" href="https://www.sqlservercentral.com/articles/common-sql-server-problems-network-related-or-instance-specific-error-occurred">Common SQL Server Problems: Network Related or Instance Specific Error Occurred</a> appeared first on <a rel="nofollow" href="https://www.sqlservercentral.com">SQLServerCentral</a>.</p>
  584. ]]></content:encoded>
  585. </item>
  586. <item>
  587. <title>Enable TDE for Databases in a SQL Server AlwaysOn Availability Group</title>
  588. <link>https://www.sqlservercentral.com/articles/enable-tde-for-databases-in-a-sql-server-alwayson-availability-group</link>
  589. <dc:creator><![CDATA[Additional Articles]]></dc:creator>
  590. <pubDate>Wed, 13 Aug 2025 00:00:35 +0000</pubDate>
  591. <category><![CDATA[Always On]]></category>
  592. <category><![CDATA[Availability Group (AG)]]></category>
  593. <category><![CDATA[Transparent Data Encryption (TDE)]]></category>
  594. <guid isPermaLink="false">https://www.sqlservercentral.com/?post_type=ssc_article&#038;p=4634604</guid>
  595.  
  596. <description><![CDATA[<p>A customer has a database that is already set up in a SQL Server Availability Group. Since this database hosts sensitive data, there is a need to encrypt the primary and all secondary replicas of the data. In this article, we will walk through how this can be done.</p>
  597. <p>The post <a rel="nofollow" href="https://www.sqlservercentral.com/articles/enable-tde-for-databases-in-a-sql-server-alwayson-availability-group">Enable TDE for Databases in a SQL Server AlwaysOn Availability Group</a> appeared first on <a rel="nofollow" href="https://www.sqlservercentral.com">SQLServerCentral</a>.</p>
  598. ]]></description>
  599. <content:encoded><![CDATA[<p>The post <a rel="nofollow" href="https://www.sqlservercentral.com/articles/enable-tde-for-databases-in-a-sql-server-alwayson-availability-group">Enable TDE for Databases in a SQL Server AlwaysOn Availability Group</a> appeared first on <a rel="nofollow" href="https://www.sqlservercentral.com">SQLServerCentral</a>.</p>
  600. ]]></content:encoded>
  601. </item>
  602. </channel>
  603. </rss>
  604.  
  605. <!--
  606. Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/
  607.  
  608. Page Caching using Redis (Page is feed)
  609.  
  610. Served from: sqlservercentral.com @ 2025-08-22 20:20:14 by W3 Total Cache
  611. -->

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid RSS" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

http://www.feedvalidator.org/check.cgi?url=https%3A//www.sqlservercentral.com/feed

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda