{"id":4713,"date":"2017-04-26T12:36:11","date_gmt":"2017-04-26T19:36:11","guid":{"rendered":"http:\/\/3.209.169.194\/blogs\/paul\/?p=4713"},"modified":"2017-04-26T18:37:26","modified_gmt":"2017-04-27T01:37:26","slug":"how-are-default-column-values-stored","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/paul\/how-are-default-column-values-stored\/","title":{"rendered":"How are default column values stored?"},"content":{"rendered":"<p>An interesting question came up in class yesterday:\u00a0<em>how is a\u00a0default column\u00a0value stored, and what if some rows exist when a column is added and then the default value changes?<\/em><\/p>\n<p>An example scenario is this:<\/p>\n<ul>\n<li>Step 1: Create a table with two columns<\/li>\n<li>Step 2: Add 10 rows<\/li>\n<li>Step 3: Add a third column to the table with a non-null default<\/li>\n<li>Step 4: Drop the default for the third column<\/li>\n<li>Step 5: Add a new default for the third column<\/li>\n<\/ul>\n<p>And selecting the initial 10 rows can be demonstrated to return the 3rd column using the initial default set in step 3. (It makes no difference if any rows are added between steps 3 and 4.)<\/p>\n<p>This means that there *must* be two default values stored when a new column is added: one for the set of already-existing rows that don&#8217;t have the new column and one for any new rows. Initially these two default values will be the same, but the one for new rows can change (e.g. in steps 4 and 5 above) with breaking the old rows. This works because after the new column is added (step 3 above), it&#8217;s impossible to add any more rows that *don&#8217;t* have the new column.<\/p>\n<p>And this is exactly how it works. Let&#8217;s investigate!<\/p>\n<p>Firstly I&#8217;ll create a simple database and test table and insert 10 rows. I&#8217;ll use the simple recovery model so I can clear the log by doing a checkpoint:<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nCREATE DATABASE &#x5B;Company];\r\nALTER DATABASE &#x5B;Company] SET RECOVERY SIMPLE;\r\nGO\r\nUSE &#x5B;Company];\r\nGO\r\n\r\n-- Create a test table to use\r\nCREATE TABLE &#x5B;Test] (&#x5B;c1] INT IDENTITY, &#x5B;c2] INT AS (&#x5B;c1]));\r\nGO\r\nINSERT INTO &#x5B;Test] DEFAULT VALUES;\r\nGO 10\r\nSELECT * FROM &#x5B;Test];\r\nGO\r\n<\/pre>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nc1          c2\r\n----------- -----------\r\n1           1\r\n2           2\r\n3           3\r\n4           4\r\n5           5\r\n6           6\r\n7           7\r\n8           8\r\n9           9\r\n10          10\r\n<\/pre>\n<p>Now I&#8217;ll clear the log, add the third column with the default, and look to see which system tables were added to because of addition:<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nCHECKPOINT;\r\nGO\r\n\r\n-- Add column with default value\r\nALTER TABLE &#x5B;Test] ADD &#x5B;c3] CHAR (6) NOT NULL CONSTRAINT &#x5B;OriginalDefault] DEFAULT 'BEFORE';\r\nGO\r\n\r\nSELECT &#x5B;AllocUnitName] FROM fn_dblog (NULL, NULL)\r\nWHERE &#x5B;Operation] = 'LOP_INSERT_ROWS';\r\nGO\r\n<\/pre>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nAllocUnitName\r\n-----------------------\r\nsys.syscolpars.clst\r\nsys.syscolpars.nc\r\nsys.sysrscols.clst\r\nsys.sysseobjvalues.clst\r\nsys.sysschobjs.clst\r\nsys.sysschobjs.nc1\r\nsys.sysschobjs.nc2\r\nsys.sysschobjs.nc3\r\nsys.sysobjvalues.clst\r\n<\/pre>\n<p>Cool. These system tables have the following functions:<\/p>\n<ul>\n<li><em>sys.syscolpars<\/em>: table column definitions (relational metadata)<\/li>\n<li><em>sys.sysrscols<\/em>: rowset column definitions (Storage Engine metadata &#8211;\u00a0info to allow interpretation of record structures on pages)<\/li>\n<li><em>sys.seobjvalues<\/em>: various Storage Engine values of different uses<\/li>\n<li><em>sys.sysschobjs<\/em>: relational objects (e.g. tables, constraints)<\/li>\n<li><em>sys.sysobjvalues<\/em>: various relational values of different uses<\/li>\n<\/ul>\n<p>I&#8217;m going to look in these to find how the inserted rows relate to our table. I&#8217;m going to need a few IDs first (using my <a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/inside-the-storage-engine-sp_allocationmetadata-putting-undocumented-system-catalog-views-to-work\/\" target=\"_blank\" rel=\"noopener noreferrer\">handy procedure<\/a> to do that):<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nEXEC sp_allocationmetadata N'Test';\r\nGO\r\n<\/pre>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nObject Name Index ID Partition ID      Alloc Unit ID     Alloc Unit Type First Page Root Page First IAM Page\r\n----------- -------- ----------------- ----------------- --------------- ---------- --------- --------------\r\nTest        0        72057594040549376 72057594045792256 IN_ROW_DATA     (1:247)    (0:0)     (1:288)\r\n<\/pre>\n<p>And now I can query those system tables. Note that they&#8217;re &#8216;hidden&#8217; system tables so you can&#8217;t query them unless you connect using the Dedicated Admin Connection. Easiest way to do that is to prefix your SSMS connection string with &#8216;admin:&#8217; (and if you&#8217;re connecting to a remote server, the server needs to have <a href=\"https:\/\/docs.microsoft.com\/en-us\/sql\/database-engine\/configure-windows\/remote-admin-connections-server-configuration-option\" target=\"_blank\" rel=\"noopener noreferrer\"><em>sp_configure<\/em> option <em>remote admin connections<\/em><\/a> enabled). Make sure you use the correct database after connecting, as the DAC drops you into <em>master<\/em>.<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nSELECT * FROM sys.syscolpars WHERE &#x5B;id] = OBJECT_ID (N'Test');\r\nGO\r\n<\/pre>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nid        number colid name xtype utype length prec scale collationid status maxinrow xmlns dflt        chk idtval\r\n--------- ------ ----- ---- ----- ----- ------ ---- ----- ----------- ------ -------- ----- ----------- --- ---------\r\n245575913 0      1     c1   56    56    4      10   0     0           5      4        0     0           0   0x0A000000010000000100000000\r\n245575913 0      2     c2   56    56    4      10   0     0           209    4        0     0           0   NULL\r\n245575913 0      3     c3   175   175   6      0    0     872468488   3      6        0     261575970   0   NULL\r\n<\/pre>\n<p>These are the relational definitions of the columns in the table, and you can see that <em>c3<\/em> is listed as having a default constraint, with ID 261575970.<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nSELECT * FROM sys.sysschobjs WHERE &#x5B;id] = 261575970;\r\nGO\r\n<\/pre>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nid          name            nsid nsclass status type pid       pclass intprop created                 modified                status2\r\n----------- --------------- ---- ------- ------ ---- --------- ------ ------- ----------------------- ----------------------- -------\r\n261575970   OriginalDefault 1    0       131072 D    245575913 1      3       2017-04-26 13:37:42.463 2017-04-26 13:37:42.463 0\r\n<\/pre>\n<p>This is the constraint named <em>OriginalDefault<\/em> with type <em>D<\/em> (default) and the default value has ID 245575913.<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nSELECT * FROM sys.sysobjvalues WHERE &#x5B;objid] = 261575970;\r\nGO\r\n<\/pre>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nvalclass objid     subobjid valnum value imageval\r\n-------- --------- -------- ------ ----- ----------------------\r\n1        261575970 0        0      2     0x28274245464F52452729\r\n<\/pre>\n<p>And the <em>imageval<\/em> column has the default value as hex-encoded ASCII values. Using the <a href=\"https:\/\/en.wikipedia.org\/wiki\/ASCII#Printable_characters\" target=\"_blank\" rel=\"noopener noreferrer\">ASCII map on Wikipedia<\/a>, the value is <em>(&#8216;BEFORE&#8217;)<\/em>, including the parentheses.<\/p>\n<p>So that&#8217;s the default value for new rows. What about the default value for rows that already exist?<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nSELECT * FROM sys.sysrscols WHERE &#x5B;rsid] = 72057594040549376;\r\nGO\r\n<\/pre>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nrsid              rscolid hbcolid rcmodified ti   cid       ordkey maxinrowlen status offset nullbit bitpos colguid\r\n----------------- ------- ------- ---------- ---- --------- ------ ----------- ------ ------ ------- ------ -------\r\n72057594040549376 1       1       10         56   0         0      0           128    4      1       0      NULL\r\n72057594040549376 2       2       10         56   0         0      0           128    8      2       0      NULL\r\n72057594040549376 3       3       0          1711 872468488 0      0           640    12     3       0      NULL\r\n<\/pre>\n<p>These are the Storage Engine definitions of the columns in the table. The <em>status<\/em> value indicates that the value may not be in the row, and where to get the default value from.<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nSELECT * FROM sys.sysseobjvalues WHERE &#x5B;id] = 72057594040549376;\r\nGO\r\n<\/pre>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nvalclass id                subid valnum value  imageval\r\n-------- ----------------- ----- ------ ------ --------\r\n1        72057594040549376 3     0      BEFORE NULL\r\n<\/pre>\n<p>And there is the Storage Engine storage for the default value for the <em>c3<\/em> column for those rows that existed before <em>c3<\/em> was added.<\/p>\n<p>Now I&#8217;ll checkpoint, drop the default constraint, and look to see what happened in the log:<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nCHECKPOINT;\r\nGO\r\n\r\nALTER TABLE &#x5B;Test] DROP CONSTRAINT &#x5B;OriginalDefault];\r\nGO\r\n\r\nSELECT &#x5B;AllocUnitName] FROM fn_dblog (NULL, NULL)\r\nWHERE &#x5B;Operation] = 'LOP_DELETE_ROWS';\r\nGO\r\n<\/pre>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nAllocUnitName\r\n---------------------\r\nsys.sysobjvalues.clst\r\nsys.sysschobjs.nc1\r\nsys.sysschobjs.nc2\r\nsys.sysschobjs.nc3\r\nsys.sysschobjs.clst\r\n<\/pre>\n<p>So that&#8217;s the relational default value being deleted, in the reverse order from how it was added. Note that the Storage Engine default value wasn&#8217;t deleted.<\/p>\n<p>Now I&#8217;ll create a new default constraint for the <em>c3<\/em> column:<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nCHECKPOINT;\r\nGO\r\n\r\nALTER TABLE &#x5B;Test] ADD CONSTRAINT &#x5B;NewDefault] DEFAULT 'AFTER' FOR &#x5B;c3];\r\nGO\r\n\r\nSELECT &#x5B;AllocUnitName] FROM fn_dblog (NULL, NULL)\r\nWHERE &#x5B;Operation] = 'LOP_INSERT_ROWS';\r\nGO\r\n<\/pre>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nAllocUnitName\r\n---------------------\r\nsys.sysschobjs.clst\r\nsys.sysschobjs.nc1\r\nsys.sysschobjs.nc2\r\nsys.sysschobjs.nc3\r\nsys.sysobjvalues.clst\r\n<\/pre>\n<p>And doing the various queries again gets us to the new relational column stored default value of <em>(&#8216;AFTER&#8217;)<\/em>, including the parentheses.<\/p>\n<p>So just to prove what I said before investigating, I&#8217;ll add ten new rows, which will have the <em>c3<\/em> value <em>AFTER<\/em>, and then query the table and I&#8217;ll see that the initial ten rows that don&#8217;t have <em>c3<\/em> in will be given the original default value of <em>BEFORE<\/em>:<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nINSERT INTO &#x5B;Test] DEFAULT VALUES;\r\nGO 10\r\n\r\nSELECT * FROM &#x5B;Test];\r\nGO\r\n<\/pre>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nc1          c2          c3\r\n----------- ----------- ------\r\n1           1           BEFORE\r\n2           2           BEFORE\r\n3           3           BEFORE\r\n4           4           BEFORE\r\n5           5           BEFORE\r\n6           6           BEFORE\r\n7           7           BEFORE\r\n8           8           BEFORE\r\n9           9           BEFORE\r\n10          10          BEFORE\r\n11          11          AFTER \r\n12          12          AFTER \r\n13          13          AFTER \r\n14          14          AFTER \r\n15          15          AFTER \r\n16          16          AFTER \r\n17          17          AFTER \r\n18          18          AFTER \r\n19          19          AFTER \r\n20          20          AFTER \r\n<\/pre>\n<p>Hope you found this interesting! (And don&#8217;t forget to drop your DAC connection.)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>An interesting question came up in class yesterday:\u00a0how is a\u00a0default column\u00a0value stored, and what if some rows exist when a column is added and then the default value changes? An example scenario is this: Step 1: Create a table with two columns Step 2: Add 10 rows Step 3: Add a third column to the [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[48,62],"tags":[],"class_list":["post-4713","post","type-post","status-publish","format-standard","hentry","category-inside-the-storage-engine","category-on-disk-structures"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How are default column values stored? - Paul S. Randal<\/title>\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\/paul\/how-are-default-column-values-stored\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How are default column values stored? - Paul S. Randal\" \/>\n<meta property=\"og:description\" content=\"An interesting question came up in class yesterday:\u00a0how is a\u00a0default column\u00a0value stored, and what if some rows exist when a column is added and then the default value changes? An example scenario is this: Step 1: Create a table with two columns Step 2: Add 10 rows Step 3: Add a third column to the [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/paul\/how-are-default-column-values-stored\/\" \/>\n<meta property=\"og:site_name\" content=\"Paul S. Randal\" \/>\n<meta property=\"article:published_time\" content=\"2017-04-26T19:36:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-04-27T01:37:26+00:00\" \/>\n<meta name=\"author\" content=\"Paul Randal\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Paul Randal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/how-are-default-column-values-stored\/\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/how-are-default-column-values-stored\/\",\"name\":\"How are default column values stored? - Paul S. Randal\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#website\"},\"datePublished\":\"2017-04-26T19:36:11+00:00\",\"dateModified\":\"2017-04-27T01:37:26+00:00\",\"author\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/how-are-default-column-values-stored\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqlskills.com\/blogs\/paul\/how-are-default-column-values-stored\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/how-are-default-column-values-stored\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How are default column values stored?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#website\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/\",\"name\":\"Paul S. Randal\",\"description\":\"In Recovery...\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce\",\"name\":\"Paul Randal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g\",\"caption\":\"Paul Randal\"},\"sameAs\":[\"http:\/\/3.209.169.194\/blogs\/paul\"],\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/author\/paul\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How are default column values stored? - Paul S. Randal","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\/paul\/how-are-default-column-values-stored\/","og_locale":"en_US","og_type":"article","og_title":"How are default column values stored? - Paul S. Randal","og_description":"An interesting question came up in class yesterday:\u00a0how is a\u00a0default column\u00a0value stored, and what if some rows exist when a column is added and then the default value changes? An example scenario is this: Step 1: Create a table with two columns Step 2: Add 10 rows Step 3: Add a third column to the [&hellip;]","og_url":"https:\/\/www.sqlskills.com\/blogs\/paul\/how-are-default-column-values-stored\/","og_site_name":"Paul S. Randal","article_published_time":"2017-04-26T19:36:11+00:00","article_modified_time":"2017-04-27T01:37:26+00:00","author":"Paul Randal","twitter_misc":{"Written by":"Paul Randal","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/how-are-default-column-values-stored\/","url":"https:\/\/www.sqlskills.com\/blogs\/paul\/how-are-default-column-values-stored\/","name":"How are default column values stored? - Paul S. Randal","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#website"},"datePublished":"2017-04-26T19:36:11+00:00","dateModified":"2017-04-27T01:37:26+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce"},"breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/how-are-default-column-values-stored\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/paul\/how-are-default-column-values-stored\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/how-are-default-column-values-stored\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/paul\/"},{"@type":"ListItem","position":2,"name":"How are default column values stored?"}]},{"@type":"WebSite","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#website","url":"https:\/\/www.sqlskills.com\/blogs\/paul\/","name":"Paul S. Randal","description":"In Recovery...","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.sqlskills.com\/blogs\/paul\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce","name":"Paul Randal","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g","caption":"Paul Randal"},"sameAs":["http:\/\/3.209.169.194\/blogs\/paul"],"url":"https:\/\/www.sqlskills.com\/blogs\/paul\/author\/paul\/"}]}},"_links":{"self":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts\/4713","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/comments?post=4713"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts\/4713\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/media?parent=4713"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/categories?post=4713"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/tags?post=4713"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}