{"id":472,"date":"2021-01-22T20:40:30","date_gmt":"2021-01-22T20:40:30","guid":{"rendered":"https:\/\/snowflake.pavlik.us\/?p=472"},"modified":"2021-01-22T20:55:45","modified_gmt":"2021-01-22T20:55:45","slug":"running-dynamic-sql-in-snowflake","status":"publish","type":"post","link":"https:\/\/snowflake.pavlik.us\/index.php\/2021\/01\/22\/running-dynamic-sql-in-snowflake\/","title":{"rendered":"Running Dynamic SQL in Snowflake"},"content":{"rendered":"\n<h4 class=\"wp-block-heading\">Use Cases for Dynamic SQL<\/h4>\n\n\n\n<p>Dynamic SQL allows you to create and manipulate a string, and then run the resulting string as a SQL statement. Snowflake supports dynamic SQL using the <a href=\"https:\/\/docs.snowflake.com\/en\/sql-reference\/identifier-literal.html#string-literals-session-variables-bind-variables-as-identifiers\" target=\"_blank\" rel=\"noreferrer noopener\">identifier<\/a> keyword and <a href=\"https:\/\/docs.snowflake.com\/en\/sql-reference\/literals-table.html#table-literals\" target=\"_blank\" rel=\"noreferrer noopener\">table()<\/a> function. There are some notable exceptions; however, where the Snowflake SQL parser currently does not support dynamic SQL.<\/p>\n\n\n\n<p>For example, suppose you want to unload data to stage on a daily basis. To keep the data organized, you decide to put the unloaded data into paths with the current date, like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@my_stage\/2021-01-22\/data.csv  -- Data unloaded daily, organized by date\n@my_stage\/2021-01-23\/data.csv<\/code><\/pre>\n\n\n\n<p>To accomplish this, you want a single line of SQL to run on a daily basis with the date dynamically generated. The problem is the path in a stage is a string literal that currently does not support using the identifier keyword, variables, or other dynamic SQL methods.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Snowflake Stored Procedures for Dynamic SQL<\/h4>\n\n\n\n<p>Writing a stored procedure is one option to run dynamic SQL along these lines. External calls from something like Python or Java can generate and run dynamic SQL. One disadvantage of external code to run dynamic SQL is that it requires external dependencies to schedule and run the code. Stored procedures elimination of any external dependencies offers a major advantage. Because Snowflake tasks also require no external dependencies, it&#8217;s possible schedule and run dynamic SQL with no external dependencies.<\/p>\n\n\n\n<p>There are two options for stored procedures to run dynamic SQL. One option is to build the SQL statement inside the stored procedure code. While this approach has advantages, it has a major disadvantage. It requires the creation and maintenance of a new stored procedure for each dynamic SQL statement to run. The other approach is to generate SQL statements outside the stored procedure that a single general-purpose stored procedure runs.<\/p>\n\n\n\n<p>That is the approach the following stored procedure uses. It&#8217;s intended to run general-purpose dynamic SQL generated outside the procedure and passed in as a parameter. <\/p>\n\n\n\n<p>For example in the previously cited example, this allows running the daily data offload like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>call run_dynamic_sql('copy into @mystage\/' || current_date || \n     '\/data.csv from SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.NATION file_format = (type = CSV)');<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">A General-Purpose Stored Procedure to Run Dynamic SQL<\/h4>\n\n\n\n<p>This stored procedure will run any SQL statement that can be run in a Snowflake stored procedure. The procedure will return a JSON object, either an error indication of a JSON document containing the rows from the execution. Since Snowflake JSON documents have a 16 Mb limit, the stored procedure should return only small result sets. Although intended to execute non-query statements, because it returns a JSON you can use it to convert select query results to JSON.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><a href=\"https:\/\/snowflake.pavlik.us\/wp-content\/uploads\/2021\/01\/Snowflake_Run_Dynamic_SQL.txt\"><img loading=\"lazy\" decoding=\"async\" width=\"230\" height=\"48\" src=\"https:\/\/snowflake.pavlik.us\/wp-content\/uploads\/2021\/01\/DownloadSQL.png\" alt=\"\" class=\"wp-image-479\"\/><\/a><\/figure>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\ncreate or replace procedure RUN_DYNAMIC_SQL(&quot;sqlStatement&quot; string)\nreturns variant\nlanguage javascript\nexecute as caller\nas\n$$\n\nclass Query{\n    constructor(statement){\n        this.statement = statement;\n    }\n}\n\nvar out = {};\nvar query = getQuery(sqlStatement);\nif (query.error == null) {\n    return rsToJSON(query);\n} else {\n    return {&quot;error&quot;: query.error};\n}\n\nfunction rsToJSON(query) {\n    var i;\n    var row = {};\n    var table = &#x5B;];\n    while (query.resultSet.next()) {\n        for(col = 1; col &lt;= query.statement.getColumnCount(); col++) {\n            row&#x5B;query.statement.getColumnName(col)] = query.resultSet.getColumnValue(col);\n        }\n        table.push(row);\n    }\n    return table;\n}\n\nfunction getQuery(sql){\n    var cmd = {sqlText: sql};\n    var query = new Query(snowflake.createStatement(cmd));\n    try {\n        query.resultSet = query.statement.execute();\n    } catch (e) {\n        query.error = e.message;\n    }\n    return query;\n}\n$$;\n\n-- Usage samples:\n\n-- Create a table. Note the use of $$ to define strings to avoid problems with single quotes\ncall run_dynamic_sql($$ create or replace temp table foo(v variant) $$);\n\n-- Run a select statement. While this SP is intended to execute non queries, it will also\n-- Return a query&#039;s result set as a JSON as long as the JSON is under 16 MB in size.\ncall run_dynamic_sql($$ select * from &quot;SNOWFLAKE_SAMPLE_DATA&quot;.&quot;TPCH_SF1&quot;.&quot;NATION&quot; $$);\n\n-- Show an example copying into a dynamically-named path in a stage:\n-- Create a scratch stage for the test\ncreate or replace stage my_stage;\n\n-- Set a variable for the path\nset today = current_date;\n\nselect $today;\n\n-- Build the copy command. Use &#039; or $$ to terminate strings as convenient.\nset copycommand = &#039;copy into @my_stage\/&#039; || $TODAY || &#039;\/data.csv&#039; ||\n$$ from &quot;SNOWFLAKE_SAMPLE_DATA&quot;.&quot;TPCH_SF1&quot;.&quot;NATION&quot; file_format = (type = CSV, field_optionally_enclosed_by = &#039;&quot;&#039;) $$;\n\n-- Examine the statement to make sure it looks okay\nselect $copycommand;\n\n-- Copy the file to the dynamic path\ncall run_dynamic_sql($copycommand);\n\ncreate stage mystage;\ncall run_dynamic_sql(&#039;copy into @mystage\/&#039; || current_date || &#039;\/data.csv from SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.NATION file_format = (type = CSV)&#039;);\n\n<\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>Use Cases for Dynamic SQL Dynamic SQL allows you to create and manipulate a string, and then run the resulting string as a SQL statement. Snowflake supports dynamic SQL using the identifier keyword and table() function. There are some notable exceptions; however, where the Snowflake SQL parser currently does not support dynamic SQL. For example, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,13,1],"tags":[],"class_list":["post-472","post","type-post","status-publish","format-standard","hentry","category-sql","category-stored-procedures-sql","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\r\n<title>Running Dynamic SQL in Snowflake - Snowflake in the Carolinas<\/title>\r\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\r\n<link rel=\"canonical\" href=\"https:\/\/snowflake.pavlik.us\/index.php\/2021\/01\/22\/running-dynamic-sql-in-snowflake\/\" \/>\r\n<meta property=\"og:locale\" content=\"en_US\" \/>\r\n<meta property=\"og:type\" content=\"article\" \/>\r\n<meta property=\"og:title\" content=\"Running Dynamic SQL in Snowflake - Snowflake in the Carolinas\" \/>\r\n<meta property=\"og:description\" content=\"Use Cases for Dynamic SQL Dynamic SQL allows you to create and manipulate a string, and then run the resulting string as a SQL statement. Snowflake supports dynamic SQL using the identifier keyword and table() function. There are some notable exceptions; however, where the Snowflake SQL parser currently does not support dynamic SQL. For example, [&hellip;]\" \/>\r\n<meta property=\"og:url\" content=\"https:\/\/snowflake.pavlik.us\/index.php\/2021\/01\/22\/running-dynamic-sql-in-snowflake\/\" \/>\r\n<meta property=\"og:site_name\" content=\"Snowflake in the Carolinas\" \/>\r\n<meta property=\"article:published_time\" content=\"2021-01-22T20:40:30+00:00\" \/>\r\n<meta property=\"article:modified_time\" content=\"2021-01-22T20:55:45+00:00\" \/>\r\n<meta property=\"og:image\" content=\"https:\/\/snowflake.pavlik.us\/wp-content\/uploads\/2021\/01\/DownloadSQL.png\" \/>\r\n<meta name=\"author\" content=\"Greg Pavlik\" \/>\r\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\r\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Greg Pavlik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\r\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2021\\\/01\\\/22\\\/running-dynamic-sql-in-snowflake\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2021\\\/01\\\/22\\\/running-dynamic-sql-in-snowflake\\\/\"},\"author\":{\"name\":\"Greg Pavlik\",\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/#\\\/schema\\\/person\\\/019455f4675665b6cf5edea31ec44d7b\"},\"headline\":\"Running Dynamic SQL in Snowflake\",\"datePublished\":\"2021-01-22T20:40:30+00:00\",\"dateModified\":\"2021-01-22T20:55:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2021\\\/01\\\/22\\\/running-dynamic-sql-in-snowflake\\\/\"},\"wordCount\":425,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2021\\\/01\\\/22\\\/running-dynamic-sql-in-snowflake\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/snowflake.pavlik.us\\\/wp-content\\\/uploads\\\/2021\\\/01\\\/DownloadSQL.png\",\"articleSection\":[\"SnowSQL\",\"Stored Procedures\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2021\\\/01\\\/22\\\/running-dynamic-sql-in-snowflake\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2021\\\/01\\\/22\\\/running-dynamic-sql-in-snowflake\\\/\",\"url\":\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2021\\\/01\\\/22\\\/running-dynamic-sql-in-snowflake\\\/\",\"name\":\"Running Dynamic SQL in Snowflake - Snowflake in the Carolinas\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2021\\\/01\\\/22\\\/running-dynamic-sql-in-snowflake\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2021\\\/01\\\/22\\\/running-dynamic-sql-in-snowflake\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/snowflake.pavlik.us\\\/wp-content\\\/uploads\\\/2021\\\/01\\\/DownloadSQL.png\",\"datePublished\":\"2021-01-22T20:40:30+00:00\",\"dateModified\":\"2021-01-22T20:55:45+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/#\\\/schema\\\/person\\\/019455f4675665b6cf5edea31ec44d7b\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2021\\\/01\\\/22\\\/running-dynamic-sql-in-snowflake\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2021\\\/01\\\/22\\\/running-dynamic-sql-in-snowflake\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2021\\\/01\\\/22\\\/running-dynamic-sql-in-snowflake\\\/#primaryimage\",\"url\":\"https:\\\/\\\/snowflake.pavlik.us\\\/wp-content\\\/uploads\\\/2021\\\/01\\\/DownloadSQL.png\",\"contentUrl\":\"https:\\\/\\\/snowflake.pavlik.us\\\/wp-content\\\/uploads\\\/2021\\\/01\\\/DownloadSQL.png\",\"width\":230,\"height\":48},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2021\\\/01\\\/22\\\/running-dynamic-sql-in-snowflake\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/snowflake.pavlik.us\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Running Dynamic SQL in Snowflake\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/#website\",\"url\":\"https:\\\/\\\/snowflake.pavlik.us\\\/\",\"name\":\"Snowflake in the Carolinas\",\"description\":\"Random thoughts on all things Snowflake in the Carolinas\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/snowflake.pavlik.us\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/#\\\/schema\\\/person\\\/019455f4675665b6cf5edea31ec44d7b\",\"name\":\"Greg Pavlik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d81df729eebf37a042922b17d4a4c834b1e0ccfa9fea1c2c78cb8e95c7e91701?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d81df729eebf37a042922b17d4a4c834b1e0ccfa9fea1c2c78cb8e95c7e91701?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d81df729eebf37a042922b17d4a4c834b1e0ccfa9fea1c2c78cb8e95c7e91701?s=96&d=mm&r=g\",\"caption\":\"Greg Pavlik\"},\"description\":\"Greg is a Senior Sales Engineer at Snowflake Computing, in the Raleigh-Durham area. He's been in data management and security for the twenty years.\"}]}<\/script>\r\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Running Dynamic SQL in Snowflake - Snowflake in the Carolinas","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:\/\/snowflake.pavlik.us\/index.php\/2021\/01\/22\/running-dynamic-sql-in-snowflake\/","og_locale":"en_US","og_type":"article","og_title":"Running Dynamic SQL in Snowflake - Snowflake in the Carolinas","og_description":"Use Cases for Dynamic SQL Dynamic SQL allows you to create and manipulate a string, and then run the resulting string as a SQL statement. Snowflake supports dynamic SQL using the identifier keyword and table() function. There are some notable exceptions; however, where the Snowflake SQL parser currently does not support dynamic SQL. For example, [&hellip;]","og_url":"https:\/\/snowflake.pavlik.us\/index.php\/2021\/01\/22\/running-dynamic-sql-in-snowflake\/","og_site_name":"Snowflake in the Carolinas","article_published_time":"2021-01-22T20:40:30+00:00","article_modified_time":"2021-01-22T20:55:45+00:00","og_image":[{"url":"https:\/\/snowflake.pavlik.us\/wp-content\/uploads\/2021\/01\/DownloadSQL.png","type":"","width":"","height":""}],"author":"Greg Pavlik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Greg Pavlik","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/snowflake.pavlik.us\/index.php\/2021\/01\/22\/running-dynamic-sql-in-snowflake\/#article","isPartOf":{"@id":"https:\/\/snowflake.pavlik.us\/index.php\/2021\/01\/22\/running-dynamic-sql-in-snowflake\/"},"author":{"name":"Greg Pavlik","@id":"https:\/\/snowflake.pavlik.us\/#\/schema\/person\/019455f4675665b6cf5edea31ec44d7b"},"headline":"Running Dynamic SQL in Snowflake","datePublished":"2021-01-22T20:40:30+00:00","dateModified":"2021-01-22T20:55:45+00:00","mainEntityOfPage":{"@id":"https:\/\/snowflake.pavlik.us\/index.php\/2021\/01\/22\/running-dynamic-sql-in-snowflake\/"},"wordCount":425,"commentCount":0,"image":{"@id":"https:\/\/snowflake.pavlik.us\/index.php\/2021\/01\/22\/running-dynamic-sql-in-snowflake\/#primaryimage"},"thumbnailUrl":"https:\/\/snowflake.pavlik.us\/wp-content\/uploads\/2021\/01\/DownloadSQL.png","articleSection":["SnowSQL","Stored Procedures"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/snowflake.pavlik.us\/index.php\/2021\/01\/22\/running-dynamic-sql-in-snowflake\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/snowflake.pavlik.us\/index.php\/2021\/01\/22\/running-dynamic-sql-in-snowflake\/","url":"https:\/\/snowflake.pavlik.us\/index.php\/2021\/01\/22\/running-dynamic-sql-in-snowflake\/","name":"Running Dynamic SQL in Snowflake - Snowflake in the Carolinas","isPartOf":{"@id":"https:\/\/snowflake.pavlik.us\/#website"},"primaryImageOfPage":{"@id":"https:\/\/snowflake.pavlik.us\/index.php\/2021\/01\/22\/running-dynamic-sql-in-snowflake\/#primaryimage"},"image":{"@id":"https:\/\/snowflake.pavlik.us\/index.php\/2021\/01\/22\/running-dynamic-sql-in-snowflake\/#primaryimage"},"thumbnailUrl":"https:\/\/snowflake.pavlik.us\/wp-content\/uploads\/2021\/01\/DownloadSQL.png","datePublished":"2021-01-22T20:40:30+00:00","dateModified":"2021-01-22T20:55:45+00:00","author":{"@id":"https:\/\/snowflake.pavlik.us\/#\/schema\/person\/019455f4675665b6cf5edea31ec44d7b"},"breadcrumb":{"@id":"https:\/\/snowflake.pavlik.us\/index.php\/2021\/01\/22\/running-dynamic-sql-in-snowflake\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/snowflake.pavlik.us\/index.php\/2021\/01\/22\/running-dynamic-sql-in-snowflake\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/snowflake.pavlik.us\/index.php\/2021\/01\/22\/running-dynamic-sql-in-snowflake\/#primaryimage","url":"https:\/\/snowflake.pavlik.us\/wp-content\/uploads\/2021\/01\/DownloadSQL.png","contentUrl":"https:\/\/snowflake.pavlik.us\/wp-content\/uploads\/2021\/01\/DownloadSQL.png","width":230,"height":48},{"@type":"BreadcrumbList","@id":"https:\/\/snowflake.pavlik.us\/index.php\/2021\/01\/22\/running-dynamic-sql-in-snowflake\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/snowflake.pavlik.us\/"},{"@type":"ListItem","position":2,"name":"Running Dynamic SQL in Snowflake"}]},{"@type":"WebSite","@id":"https:\/\/snowflake.pavlik.us\/#website","url":"https:\/\/snowflake.pavlik.us\/","name":"Snowflake in the Carolinas","description":"Random thoughts on all things Snowflake in the Carolinas","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/snowflake.pavlik.us\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/snowflake.pavlik.us\/#\/schema\/person\/019455f4675665b6cf5edea31ec44d7b","name":"Greg Pavlik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/d81df729eebf37a042922b17d4a4c834b1e0ccfa9fea1c2c78cb8e95c7e91701?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/d81df729eebf37a042922b17d4a4c834b1e0ccfa9fea1c2c78cb8e95c7e91701?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d81df729eebf37a042922b17d4a4c834b1e0ccfa9fea1c2c78cb8e95c7e91701?s=96&d=mm&r=g","caption":"Greg Pavlik"},"description":"Greg is a Senior Sales Engineer at Snowflake Computing, in the Raleigh-Durham area. He's been in data management and security for the twenty years."}]}},"_links":{"self":[{"href":"https:\/\/snowflake.pavlik.us\/index.php\/wp-json\/wp\/v2\/posts\/472","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/snowflake.pavlik.us\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/snowflake.pavlik.us\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/snowflake.pavlik.us\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/snowflake.pavlik.us\/index.php\/wp-json\/wp\/v2\/comments?post=472"}],"version-history":[{"count":7,"href":"https:\/\/snowflake.pavlik.us\/index.php\/wp-json\/wp\/v2\/posts\/472\/revisions"}],"predecessor-version":[{"id":483,"href":"https:\/\/snowflake.pavlik.us\/index.php\/wp-json\/wp\/v2\/posts\/472\/revisions\/483"}],"wp:attachment":[{"href":"https:\/\/snowflake.pavlik.us\/index.php\/wp-json\/wp\/v2\/media?parent=472"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/snowflake.pavlik.us\/index.php\/wp-json\/wp\/v2\/categories?post=472"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/snowflake.pavlik.us\/index.php\/wp-json\/wp\/v2\/tags?post=472"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}