{"id":1169,"date":"2020-10-08T11:36:29","date_gmt":"2020-10-08T18:36:29","guid":{"rendered":"http:\/\/3.209.169.194\/blogs\/erin\/?p=1169"},"modified":"2021-02-17T18:45:28","modified_gmt":"2021-02-18T02:45:28","slug":"alter-procedures-when-using-query-store","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/erin\/alter-procedures-when-using-query-store\/","title":{"rendered":"ALTER Procedures When Using Query Store"},"content":{"rendered":"\n<p>When I talk about Plan Forcing I always discuss how users should ALTER procedures when using Query Store, and not use DROP and CREATE.  This is valid beyond Plan Forcing cases; it&#8217;s a best practice I recommend <em>however<\/em> you are using Query Store.  Every query stored in Query Store has an object_id associated with it, which ties it back to its object (stored procedure, function, etc.).  This is critical not just for plan forcing, but also when you want to look at historical performance for a query <em>after<\/em> a change to the object.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Setup <\/h2>\n\n\n\n<p>Within the WideWorldImporters database, create a stored procedure with multiple statements:<\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<p><code>USE [WideWorldImporters];<br>GO<\/code><\/p>\n\n\n\n<p><code>CREATE OR ALTER PROCEDURE [Sales].[usp_GetCustomerDetail]<br>@CustomerName NVARCHAR(100)<br>AS<\/code><\/p>\n\n\n\n<p><code>CREATE TABLE #CustomerList (<br>[RowID] INT IDENTITY (1,1),<br>[CustomerID] INT,<br>[CustomerName] NVARCHAR (100)<br>);<\/code><\/p>\n\n\n\n<p><code>INSERT INTO #CustomerList (<br>[CustomerID],<br>[CustomerName]<br>)<br>SELECT<br>[CustomerID],<br>[Customername]<br>FROM [Sales].[Customers]<br>WHERE [CustomerName] LIKE @CustomerName<br>UNION<br>SELECT<br>[CustomerID],<br>[CustomerName]<br>FROM [Sales].[Customers_Archive]<br>WHERE [CustomerName] LIKE @CustomerName;<\/code><\/p>\n\n\n\n<p><code>SELECT<br>[o].[CustomerID],<br>[o].[OrderID],<br>[il].[InvoiceLineID],<br>[o].[OrderDate],<br>[i].[InvoiceDate],<br>[ol].[StockItemID],<br>[ol].[Quantity],<br>[ol].[UnitPrice],<br>[il].[LineProfit]<br>INTO #CustomerOrders<br>FROM [Sales].[Orders] [o]<br>INNER JOIN [Sales].[OrderLines] [ol]<br>ON [o].[OrderID] = [ol].[OrderID]<br>INNER JOIN [Sales].[Invoices] [i]<br>ON [o].[OrderID] = [i].[OrderID]<br>INNER JOIN [Sales].[InvoiceLines] [il]<br>ON [i].[InvoiceID] = [il].[InvoiceID]<br>AND [il].[StockItemID] = [ol].[StockItemID]<br>AND [il].[Quantity] = [ol].[Quantity]<br>AND [il].[UnitPrice] = [ol].[UnitPrice]<br>WHERE [o].[CustomerID] IN (SELECT [CustomerID] FROM #CustomerList);<\/code><\/p>\n\n\n\n<p><code>SELECT<br>[cl].[CustomerName],<br>[si].[StockItemName],<br>SUM([co].[Quantity]) AS [QtyPurchased],<br>SUM([co].[Quantity]*[co].[UnitPrice]) AS [TotalCost],<br>[co].[LineProfit],<br>[co].[OrderDate],<br>DATEDIFF(DAY,[co].[OrderDate],[co].[InvoiceDate]) AS [DaystoInvoice]<br>FROM #CustomerOrders [co]<br>INNER JOIN #CustomerList [cl]<br>ON [co].[CustomerID] = [cl].[CustomerID]<br>INNER JOIN [Warehouse].[StockItems] [si]<br>ON [co].[StockItemID] = [si].[StockItemID]<br>GROUP BY [cl].[CustomerName], [si].[StockItemName],[co].[InvoiceLineID],<br>[co].[LineProfit], [co].[OrderDate], DATEDIFF(DAY,[co].[OrderDate],[co].[InvoiceDate])<br>ORDER BY [co].[OrderDate];<\/code><\/p>\n\n\n\n<p><code>GO<\/code><\/p>\n<\/div><\/div>\n\n\n\n<p>Enable Query Store with most of the default settings; this is a demo, I&#8217;m not worried about configuration.  This is <strong>not <\/strong>what I would do for production, see <a href=\"https:\/\/www.sqlskills.com\/blogs\/erin\/query-store-settings\/\">this post<\/a> for more details on settings..  I also would not remove all data from Query Store in production, but again&#8230;this is a demo.<\/p>\n\n\n\n<p><code>ALTER DATABASE [WideWorldImporters]<br>SET QUERY_STORE = ON;<br>GO<\/code><\/p>\n\n\n\n<p><code>ALTER DATABASE [WideWorldImporters]<br>SET QUERY_STORE (<br>OPERATION_MODE = READ_WRITE,<br>INTERVAL_LENGTH_MINUTES = 10<br>);<br>GO<\/code><\/p>\n\n\n\n<p><code>\/*<br>Do not run in a Production database unless you want<br>to remove all Query Store data<br>*\/<\/code><\/p>\n\n\n\n<p><code>ALTER DATABASE [WideWorldImporters]<br>SET QUERY_STORE CLEAR;<br>GO<\/code><\/p>\n\n\n\n<p>Then, execute the stored procedure a few times:<\/p>\n\n\n\n<p><code>EXEC [Sales].[usp_GetCustomerDetail] N'Alvin Bollinger';<br>GO 10<\/code><\/p>\n\n\n\n<p><code>EXEC [Sales].[usp_GetCustomerDetail] N'Tami Braggs';<br>GO 10<\/code><\/p>\n\n\n\n<p><code>EXEC [Sales].[usp_GetCustomerDetail] N'Logan Dixon';<br>GO 10<\/code><\/p>\n\n\n\n<p><code>EXEC [Sales].[usp_GetCustomerDetail] N'Tara Kotadia';<br>GO 10<\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Understanding the Data<\/h2>\n\n\n\n<p>It&#8217;s critical to understand what data exists in Query Store for this stored procedure.  The query below interrogates the Query Store views to list all the statements in this stored procedure (note that there is no way to see this with any of the default reports):<\/p>\n\n\n\n<p><code>SELECT<br>[qsq].[query_text_id],<br>[qsq].[query_id],<br>[qsq].[object_id],<br>[qsq].[context_settings_id],<br>[qst].[query_sql_text]<br>FROM [sys].[query_store_query] [qsq]<br>JOIN [sys].[query_store_query_text] [qst]<br>ON [qsq].[query_text_id] = [qst].[query_text_id]<br>WHERE [qsq].[object_id] = OBJECT_ID(N'Sales.usp_GetCustomerDetail');<br>GO<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2020\/10\/QueryInfo3-1024x108.jpg\" alt=\"Query Information in QS\" class=\"wp-image-1174\" width=\"580\" height=\"61\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2020\/10\/QueryInfo3-1024x108.jpg 1024w, https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2020\/10\/QueryInfo3-300x32.jpg 300w, https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2020\/10\/QueryInfo3-768x81.jpg 768w, https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2020\/10\/QueryInfo3.jpg 1147w\" sizes=\"(max-width: 580px) 100vw, 580px\" \/><figcaption>Query Information in QS<\/figcaption><\/figure>\n\n\n\n<p>There are multiple columns that, when combined, create a unique query in Query Store.  Three of those columns are query_text_id, context_settings_id, and object_id.  <\/p>\n\n\n\n<p>Drop and recreate the stored procedure, using:<\/p>\n\n\n\n<p><code>DROP PROCEDURE IF EXISTS [Sales].[usp_GetCustomerDetail];<br>GO<\/code><\/p>\n\n\n\n<p>Then execute the <strong>exact same<\/strong> CREATE OR REPLACE code from the previous section, and run the stored procedure again.  Check the data in Query Store with the previous query:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"108\" src=\"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2020\/10\/QueryInfo4-1024x108.jpg\" alt=\"Query Information in QS after DROP AND CREATE\" class=\"wp-image-1175\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2020\/10\/QueryInfo4-1024x108.jpg 1024w, https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2020\/10\/QueryInfo4-300x32.jpg 300w, https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2020\/10\/QueryInfo4-768x81.jpg 768w, https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2020\/10\/QueryInfo4.jpg 1147w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption>Query Information in QS after DROP AND CREATE<\/figcaption><\/figure>\n\n\n\n<p>Notice that the <span class=\"has-inline-color has-vivid-purple-color\">query_id<\/span> and <span class=\"has-inline-color has-vivid-purple-color\">object_id<\/span> have changed.  The query_text_id is the same for all three queries (as is the context_settings_id), but the object_id changed &#8211; because we DROPPED the stored procedure, rather than ALTERing it &#8211; and therefore the query_id <em>also<\/em> changed.<\/p>\n\n\n\n<p>The good news is that the original queries (and their plans and runtime statistics) are still in Query Store; they&#8217;re just harder to find:<\/p>\n\n\n\n<p><code>SELECT<br>[qsq].[query_text_id],<br>[qsq].[query_id],<br>[qsq].[object_id],<br>OBJECT_NAME([qsq].[object_id]) AS [ObjectName],<br>[qsq].[context_settings_id],<br>[qst].[query_sql_text]<br>FROM [sys].[query_store_query] [qsq]<br>JOIN [sys].[query_store_query_text] [qst]<br>ON [qsq].[query_text_id] = [qst].[query_text_id]<br>WHERE [qsq].[object_id] > 0;<br>GO<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"157\" src=\"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2020\/10\/QueryInfo7-1024x157.jpg\" alt=\"All queries in QS after DROP AND CREATE\" class=\"wp-image-1178\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2020\/10\/QueryInfo7-1024x157.jpg 1024w, https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2020\/10\/QueryInfo7-300x46.jpg 300w, https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2020\/10\/QueryInfo7-768x118.jpg 768w, https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2020\/10\/QueryInfo7.jpg 1376w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption>All queries in QS after DROP AND CREATE<\/figcaption><\/figure>\n\n\n\n<p>Unless the object_id for the queries is saved\/noted somewhere <em>before<\/em> the procedure is dropped and created, the only way to find the original queries is to query for object_id > 0 (which likely returns <em>a lot<\/em> of data) or search by the query_sql_text (which is not going to be fast):<\/p>\n\n\n\n<p><code>SELECT<br>[qsq].[query_text_id],<br>[qsq].[query_id],<br>[qsq].[object_id],<br>OBJECT_NAME([qsq].[object_id]) AS [ObjectName],<br>[qsq].[context_settings_id],<br>[qst].[query_sql_text]<br>FROM [sys].[query_store_query] [qsq]<br>JOIN [sys].[query_store_query_text] [qst]<br>ON [qsq].[query_text_id] = [qst].[query_text_id]<br>WHERE [qst].[query_sql_text] LIKE '%INTO #CustomerOrders%';<br>GO<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"75\" src=\"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2020\/10\/QueryInfo6-1024x75.jpg\" alt=\"Queries returned based on a search of query_sql_text\" class=\"wp-image-1177\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2020\/10\/QueryInfo6-1024x75.jpg 1024w, https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2020\/10\/QueryInfo6-300x22.jpg 300w, https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2020\/10\/QueryInfo6-768x56.jpg 768w, https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2020\/10\/QueryInfo6.jpg 1249w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption>Queries returned based on a search of query_sql_text<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Action Item: Use ALTER<\/h2>\n\n\n\n<p>If you&#8217;re using Query Store, or planning to use it, you really need to ALTER procedures, rather than running DROP and CREATE statements.  Note: You need to use ALTER PROCEDURE specifically.  If you use CREATE OR ALTER procedure, while the object_id stays the same&#8230;a new query_id shows up in Query Store (even with no change to the query text).  This is something I&#8217;m following up on &#8211; I don&#8217;t think this is expected behavior.<\/p>\n\n\n","protected":false},"excerpt":{"rendered":"<p>When I talk about Plan Forcing I always discuss how users should ALTER procedures when using Query Store, and not use DROP and CREATE. This is valid beyond Plan Forcing cases; it&#8217;s a best practice I recommend however you are using Query Store. Every query stored in Query Store has an object_id associated with it, [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":1176,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[46],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.9.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>ALTER Procedures When Using Query Store - Erin Stellato<\/title>\n<meta name=\"description\" content=\"If you use Query Store, it&#039;s important to use ALTER when changing objects - like stored procedures - instead of using DROP and CREATE.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.sqlskills.com\/blogs\/erin\/alter-procedures-when-using-query-store\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ALTER Procedures When Using Query Store - Erin Stellato\" \/>\n<meta property=\"og:description\" content=\"If you use Query Store, it&#039;s important to use ALTER when changing objects - like stored procedures - instead of using DROP and CREATE.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/erin\/alter-procedures-when-using-query-store\/\" \/>\n<meta property=\"og:site_name\" content=\"Erin Stellato\" \/>\n<meta property=\"article:published_time\" content=\"2020-10-08T18:36:29+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-02-18T02:45:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2020\/10\/QueryInfo5.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1376\" \/>\n\t<meta property=\"og:image:height\" content=\"211\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Erin Stellato\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Erin Stellato\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/alter-procedures-when-using-query-store\/\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/alter-procedures-when-using-query-store\/\",\"name\":\"ALTER Procedures When Using Query Store - Erin Stellato\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/#website\"},\"datePublished\":\"2020-10-08T18:36:29+00:00\",\"dateModified\":\"2021-02-18T02:45:28+00:00\",\"author\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/#\/schema\/person\/76170223ffffa1df03fd9be5b66cb158\"},\"description\":\"If you use Query Store, it's important to use ALTER when changing objects - like stored procedures - instead of using DROP and CREATE.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/alter-procedures-when-using-query-store\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqlskills.com\/blogs\/erin\/alter-procedures-when-using-query-store\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/alter-procedures-when-using-query-store\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ALTER Procedures When Using Query Store\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/#website\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/\",\"name\":\"Erin Stellato\",\"description\":\"The SQL Sequel\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/#\/schema\/person\/76170223ffffa1df03fd9be5b66cb158\",\"name\":\"Erin Stellato\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0c8b485bd54ea26b57e99f79b525f409?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0c8b485bd54ea26b57e99f79b525f409?s=96&d=mm&r=g\",\"caption\":\"Erin Stellato\"},\"sameAs\":[\"http:\/\/3.209.169.194\/blogs\/erin\"],\"url\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/author\/erin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"ALTER Procedures When Using Query Store - Erin Stellato","description":"If you use Query Store, it's important to use ALTER when changing objects - like stored procedures - instead of using DROP and CREATE.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.sqlskills.com\/blogs\/erin\/alter-procedures-when-using-query-store\/","og_locale":"en_US","og_type":"article","og_title":"ALTER Procedures When Using Query Store - Erin Stellato","og_description":"If you use Query Store, it's important to use ALTER when changing objects - like stored procedures - instead of using DROP and CREATE.","og_url":"https:\/\/www.sqlskills.com\/blogs\/erin\/alter-procedures-when-using-query-store\/","og_site_name":"Erin Stellato","article_published_time":"2020-10-08T18:36:29+00:00","article_modified_time":"2021-02-18T02:45:28+00:00","og_image":[{"width":1376,"height":211,"url":"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2020\/10\/QueryInfo5.jpg","type":"image\/jpeg"}],"author":"Erin Stellato","twitter_misc":{"Written by":"Erin Stellato","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.sqlskills.com\/blogs\/erin\/alter-procedures-when-using-query-store\/","url":"https:\/\/www.sqlskills.com\/blogs\/erin\/alter-procedures-when-using-query-store\/","name":"ALTER Procedures When Using Query Store - Erin Stellato","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/erin\/#website"},"datePublished":"2020-10-08T18:36:29+00:00","dateModified":"2021-02-18T02:45:28+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/erin\/#\/schema\/person\/76170223ffffa1df03fd9be5b66cb158"},"description":"If you use Query Store, it's important to use ALTER when changing objects - like stored procedures - instead of using DROP and CREATE.","breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/erin\/alter-procedures-when-using-query-store\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/erin\/alter-procedures-when-using-query-store\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/erin\/alter-procedures-when-using-query-store\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/erin\/"},{"@type":"ListItem","position":2,"name":"ALTER Procedures When Using Query Store"}]},{"@type":"WebSite","@id":"https:\/\/www.sqlskills.com\/blogs\/erin\/#website","url":"https:\/\/www.sqlskills.com\/blogs\/erin\/","name":"Erin Stellato","description":"The SQL Sequel","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.sqlskills.com\/blogs\/erin\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.sqlskills.com\/blogs\/erin\/#\/schema\/person\/76170223ffffa1df03fd9be5b66cb158","name":"Erin Stellato","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqlskills.com\/blogs\/erin\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0c8b485bd54ea26b57e99f79b525f409?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0c8b485bd54ea26b57e99f79b525f409?s=96&d=mm&r=g","caption":"Erin Stellato"},"sameAs":["http:\/\/3.209.169.194\/blogs\/erin"],"url":"https:\/\/www.sqlskills.com\/blogs\/erin\/author\/erin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-json\/wp\/v2\/posts\/1169"}],"collection":[{"href":"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-json\/wp\/v2\/comments?post=1169"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-json\/wp\/v2\/posts\/1169\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-json\/wp\/v2\/media\/1176"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-json\/wp\/v2\/media?parent=1169"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-json\/wp\/v2\/categories?post=1169"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-json\/wp\/v2\/tags?post=1169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}