<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Variable referencing in EXECUTE IMMEDIATE in Data Engineering</title>
    <link>https://community.databricks.com/t5/data-engineering/variable-referencing-in-execute-immediate/m-p/61707#M31832</link>
    <description>&lt;P&gt;Hi all,&lt;/P&gt;&lt;P&gt;As part of an on-going exercise to refactor existing T-SQL code into Databricks, we've stumbled into an issue that we can't seem to overcome through Spark SQL.&lt;/P&gt;&lt;P&gt;Currently we use dynamic SQL to loop through a number of tables, where we use parameters to specify field names among other elements. We're attempting to use the EXECUTE IMMEDIATE functionality combined with session variables to achieve the same result.&lt;/P&gt;&lt;P&gt;However, when trying to achieve this in Databricks it does not seem to interpret the variables as expected. See example code below:&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;DECLARE&lt;/SPAN&gt;&lt;SPAN&gt; varfield_names1 STRING;&lt;/SPAN&gt;&lt;/P&gt;&lt;DIV&gt;&lt;DIV class="lia-indent-padding-left-30px"&gt;&lt;DIV&gt;&lt;SPAN&gt;SET&lt;/SPAN&gt;&lt;SPAN&gt; VAR varfield_names1 &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;'field1 STRING'&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;DECLARE&lt;/SPAN&gt;&lt;SPAN&gt; varsqlstring1 STRING;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;SET&lt;/SPAN&gt;&lt;SPAN&gt; VAR varsqlstring1 &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;'CREATE TEMPORARY VIEW AS&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;SELECT test as&amp;nbsp;(PrimaryKey STRING, Table STRING, VALUES(:varfield_names1))'&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;EXECUTE&lt;/SPAN&gt; &lt;SPAN&gt;IMMEDIATE&lt;/SPAN&gt;&lt;SPAN&gt; varsqlstring1 &lt;/SPAN&gt;&lt;SPAN&gt;USING&lt;/SPAN&gt;&lt;SPAN&gt; varfield_names1;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;The same issue exists when trying to use hive variables as well:&lt;/DIV&gt;&lt;DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;DIV class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;1) Set field variable&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;spark&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;sql&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;""" SET var.field_name= 'test1' """&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;2) Concat approach to define dynamic string:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;spark&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;sql&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;""" SET var.sql_string = CONCAT('CREATE OR REPLACE TABLE Table_1 (PrimaryKey STRING, Table STRING, ', ${var.field_name}, ')') """&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;3) Execute the string (fails)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;EXECUTE&lt;/SPAN&gt; &lt;SPAN&gt;IMMEDIATE&lt;/SPAN&gt;&lt;SPAN&gt; ${&lt;/SPAN&gt;&lt;SPAN&gt;var&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;sql_string&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;Does anyone have any idea how we can get this to work - in this example we're looking to be able to specify a field as a variable into an executable sql string. The rationale for this is the code is used as part of a loop, hence we require this to be dynamically defined.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;</description>
    <pubDate>Fri, 23 Feb 2024 12:51:08 GMT</pubDate>
    <dc:creator>Luke_H</dc:creator>
    <dc:date>2024-02-23T12:51:08Z</dc:date>
    <item>
      <title>Variable referencing in EXECUTE IMMEDIATE</title>
      <link>https://community.databricks.com/t5/data-engineering/variable-referencing-in-execute-immediate/m-p/61707#M31832</link>
      <description>&lt;P&gt;Hi all,&lt;/P&gt;&lt;P&gt;As part of an on-going exercise to refactor existing T-SQL code into Databricks, we've stumbled into an issue that we can't seem to overcome through Spark SQL.&lt;/P&gt;&lt;P&gt;Currently we use dynamic SQL to loop through a number of tables, where we use parameters to specify field names among other elements. We're attempting to use the EXECUTE IMMEDIATE functionality combined with session variables to achieve the same result.&lt;/P&gt;&lt;P&gt;However, when trying to achieve this in Databricks it does not seem to interpret the variables as expected. See example code below:&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;DECLARE&lt;/SPAN&gt;&lt;SPAN&gt; varfield_names1 STRING;&lt;/SPAN&gt;&lt;/P&gt;&lt;DIV&gt;&lt;DIV class="lia-indent-padding-left-30px"&gt;&lt;DIV&gt;&lt;SPAN&gt;SET&lt;/SPAN&gt;&lt;SPAN&gt; VAR varfield_names1 &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;'field1 STRING'&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;DECLARE&lt;/SPAN&gt;&lt;SPAN&gt; varsqlstring1 STRING;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;SET&lt;/SPAN&gt;&lt;SPAN&gt; VAR varsqlstring1 &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;'CREATE TEMPORARY VIEW AS&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;SELECT test as&amp;nbsp;(PrimaryKey STRING, Table STRING, VALUES(:varfield_names1))'&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;EXECUTE&lt;/SPAN&gt; &lt;SPAN&gt;IMMEDIATE&lt;/SPAN&gt;&lt;SPAN&gt; varsqlstring1 &lt;/SPAN&gt;&lt;SPAN&gt;USING&lt;/SPAN&gt;&lt;SPAN&gt; varfield_names1;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;The same issue exists when trying to use hive variables as well:&lt;/DIV&gt;&lt;DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;DIV class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;1) Set field variable&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;spark&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;sql&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;""" SET var.field_name= 'test1' """&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;2) Concat approach to define dynamic string:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;spark&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;sql&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;""" SET var.sql_string = CONCAT('CREATE OR REPLACE TABLE Table_1 (PrimaryKey STRING, Table STRING, ', ${var.field_name}, ')') """&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;3) Execute the string (fails)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;EXECUTE&lt;/SPAN&gt; &lt;SPAN&gt;IMMEDIATE&lt;/SPAN&gt;&lt;SPAN&gt; ${&lt;/SPAN&gt;&lt;SPAN&gt;var&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;sql_string&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;Does anyone have any idea how we can get this to work - in this example we're looking to be able to specify a field as a variable into an executable sql string. The rationale for this is the code is used as part of a loop, hence we require this to be dynamically defined.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;</description>
      <pubDate>Fri, 23 Feb 2024 12:51:08 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/variable-referencing-in-execute-immediate/m-p/61707#M31832</guid>
      <dc:creator>Luke_H</dc:creator>
      <dc:date>2024-02-23T12:51:08Z</dc:date>
    </item>
    <item>
      <title>Re: Variable referencing in EXECUTE IMMEDIATE</title>
      <link>https://community.databricks.com/t5/data-engineering/variable-referencing-in-execute-immediate/m-p/61739#M31835</link>
      <description>&lt;P&gt;&lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/82608"&gt;@SergeRielau&lt;/a&gt;&amp;nbsp; - appreciate you've been posting recently on EXECUTE IMMEDIATE - really insightful. Wonder if you'd be able to assist with the above!&lt;/P&gt;</description>
      <pubDate>Fri, 23 Feb 2024 15:49:44 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/variable-referencing-in-execute-immediate/m-p/61739#M31835</guid>
      <dc:creator>Luke_H</dc:creator>
      <dc:date>2024-02-23T15:49:44Z</dc:date>
    </item>
    <item>
      <title>Re: Variable referencing in EXECUTE IMMEDIATE</title>
      <link>https://community.databricks.com/t5/data-engineering/variable-referencing-in-execute-immediate/m-p/61994#M31867</link>
      <description>&lt;LI-CODE lang="markup"&gt;DECLARE OR REPLACE varfield_names1 STRING;

SET VAR varfield_names1 = 'field1 STRING';
DECLARE OR REPLACE varsqlstring1 STRING;
SET VAR varsqlstring1 = 'CREATE TABLE table1 (PrimaryKey STRING, Table STRING, ' || varfield_names1 || ')';
EXECUTE IMMEDIATE varsqlstring1;&lt;/LI-CODE&gt;
&lt;P&gt;I took some guess on your intent. It helps if you "print" I.e. SELECT varsqlstrin1 before trying to execute it, so you know you glued together the right statement.&lt;/P&gt;</description>
      <pubDate>Mon, 26 Feb 2024 15:54:04 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/variable-referencing-in-execute-immediate/m-p/61994#M31867</guid>
      <dc:creator>SergeRielau</dc:creator>
      <dc:date>2024-02-26T15:54:04Z</dc:date>
    </item>
  </channel>
</rss>

