Stored procedures 雪花存储过程动态列透视

Stored procedures 雪花存储过程动态列透视,stored-procedures,snowflake-cloud-data-platform,Stored Procedures,Snowflake Cloud Data Platform,我试图在Snowflake中创建一个存储过程,该过程将数据透视到派生表中。轴心柱本质上是动态的。我已经找到了一种通过参数传递来实现这一点的方法。我试图在不传递任何参数的情况下执行相同的操作,但代码不起作用 我的方法是在表中应用一个循环,从中我将列提取到一个变量中。然后在枢轴中传递此变量。while循环本身似乎运行良好。将此变量传递给枢轴时会出现错误 我正在使用的代码: CREATE OR REPLACE PROCEDURE LOOP_EXMPL_5() returns varchar lang

我试图在Snowflake中创建一个存储过程,该过程将数据透视到派生表中。轴心柱本质上是动态的。我已经找到了一种通过参数传递来实现这一点的方法。我试图在不传递任何参数的情况下执行相同的操作,但代码不起作用

我的方法是在表中应用一个循环,从中我将列提取到一个变量中。然后在枢轴中传递此变量。while循环本身似乎运行良好。将此变量传递给枢轴时会出现错误

我正在使用的代码:

CREATE OR REPLACE PROCEDURE LOOP_EXMPL_5()
returns  varchar
language javascript
as
$$ 
var column1 = 'qwerty';
var command = `SELECT ATTR_NAME FROM TBL_DIM`;
var stmt = snowflake.createStatement({sqlText: command});
var rs = stmt.execute();
while (rs.next()) 
   {
     var column1 = column1.concat(",","'",rs.getColumnValue(1),"'"); 
   }
var column2 = column1
var command_1 = `CREATE OR REPLACE VIEW HIERARCHY_VIEW_2 AS SELECT * FROM (SELECT MSTR.PROD_CODE AS 
PROD_CODE,DIM.ATTR_NAME AS ATTR_NAME,MSTR.ATTR_VALUE AS ATTR_VALUE FROM TBL_DIM DIM INNER JOIN 
TBL_MSTR MSTR ON DIM.ATTR_KEY=MSTR.ATTR_KEY ) Q
              PIVOT (MAX (Q.ATTR_VALUE) FOR Q.ATTR_NAME IN ('${column2}'))
              AS P
              ORDER BY P.PROD_CODE;`;
 var stmt_1 = snowflake.createStatement({sqlText: command_1});
 var rs_1 = stmt_1.execute();
 return 'success'
 $$;   
我得到的错误是:

存储过程循环中的执行错误\u EXMPL\u 5:SQL编译错误:语法错误第2行位于位置73意外的“区域”。在Statement.execute,第16行第21位

正在传递的变量值:

qwerty、‘地区’、‘分区’、‘公司产品’、‘公司制造’、‘公司发货至客户’、‘业务单元’、‘类别’、‘分部’、‘子分部’、‘品牌’、‘集合品牌’、‘子品牌’、‘PPG’


我将以某种方式删除SQL中的qwerty部分。

有关您的目标,请参阅:

要调试当前问题:
column1.concat(“,”,“,”,rs.getColumnValue(1),“”)未正确转义和引用列名

设置UDF以返回该值,然后设置
var command_1
的值,以便进行适当的调试

一种逃离柱的好方法:

选择'\\''
||组内的listagg(不同的轴列“\\”、\\'')(按轴列排序)
|| '\\'' 
然后使用:

(${col_list})中的pivot_列的

有关您的目标,请参阅:

要调试当前问题:
column1.concat(“,”,“,”,rs.getColumnValue(1),“”)未正确转义和引用列名

设置UDF以返回该值,然后设置
var command_1
的值,以便进行适当的调试

一种逃离柱的好方法:

选择'\\''
||组内的listagg(不同的轴列“\\”、\\'')(按轴列排序)
|| '\\'' 
然后使用:

(${col_list})中的pivot_列的

您可以从空字符串开始:

var column1 = "";
然后可以按如下方式连接列列表:

if (column1 != "") column1 += ",";
column1 += `"${rs.getColumnValue(1)}"`);

出现SQL语法错误的原因是列名在单引号中,而它们应该在双引号中。

您可以从空字符串开始:

var column1 = "";
然后可以按如下方式连接列列表:

if (column1 != "") column1 += ",";
column1 += `"${rs.getColumnValue(1)}"`);

出现SQL语法错误的原因是列名在单引号中,而它们应该在双引号中。

以下是工作代码。非常感谢你的帮助,菲利佩和格雷格

CREATE OR REPLACE PROCEDURE LOOP_EXMPL_9()
returns  varchar
language javascript
as
$$ 
  var column1 = "";
  var command = `SELECT ATTR_NAME FROM TBL_DIM`;
  var stmt = snowflake.createStatement({sqlText: command});
  var rs = stmt.execute();
  while (rs.next()) 
   {
     if (column1 != "") column1 += ",";
     column1 += `'${rs.getColumnValue (1)}'`;
   }
  var column2 = column1;
  var command_1 = `CREATE OR REPLACE VIEW HIERARCHY_VIEW_2 AS SELECT * FROM (SELECT 
  MSTR.PROD_CODE AS PROD_CODE,DIM.ATTR_NAME AS ATTR_NAME,MSTR.ATTR_VALUE AS ATTR_VALUE 
  FROM TBL_DIM DIM INNER JOIN TBL_MSTR MSTR ON DIM.ATTR_KEY=MSTR.ATTR_KEY ) Q
              PIVOT (MAX (Q.ATTR_VALUE) FOR Q.ATTR_NAME IN (${column2}))
              AS P
              ORDER BY P.PROD_CODE;`;
  var stmt_1 = snowflake.createStatement({sqlText: command_1});
  var rs_1 = stmt_1.execute();
  return 'success'   
$$;   

这是工作代码。非常感谢你的帮助,菲利佩和格雷格

CREATE OR REPLACE PROCEDURE LOOP_EXMPL_9()
returns  varchar
language javascript
as
$$ 
  var column1 = "";
  var command = `SELECT ATTR_NAME FROM TBL_DIM`;
  var stmt = snowflake.createStatement({sqlText: command});
  var rs = stmt.execute();
  while (rs.next()) 
   {
     if (column1 != "") column1 += ",";
     column1 += `'${rs.getColumnValue (1)}'`;
   }
  var column2 = column1;
  var command_1 = `CREATE OR REPLACE VIEW HIERARCHY_VIEW_2 AS SELECT * FROM (SELECT 
  MSTR.PROD_CODE AS PROD_CODE,DIM.ATTR_NAME AS ATTR_NAME,MSTR.ATTR_VALUE AS ATTR_VALUE 
  FROM TBL_DIM DIM INNER JOIN TBL_MSTR MSTR ON DIM.ATTR_KEY=MSTR.ATTR_KEY ) Q
              PIVOT (MAX (Q.ATTR_VALUE) FOR Q.ATTR_NAME IN (${column2}))
              AS P
              ORDER BY P.PROD_CODE;`;
  var stmt_1 = snowflake.createStatement({sqlText: command_1});
  var rs_1 = stmt_1.execute();
  return 'success'   
$$;   

看,看,谢谢你的回答,菲利佩。但是,在我进行列聚合的部分中,我想知道为什么要包含\\?另外,在查看反斜杠中使用的引号时,是否有理由在pivot Listag函数的开头和结尾都使用双引号张贴反斜杠?请进一步帮助,请粘贴函数为
列2
命令\u 1
打印的值。然后我们就可以正确地调试了。我们能够找到答案。我将在这里发布解决方案。我很高兴你解决了它。Felipe,请向上投票并接受任何对您有帮助的答案,作为对答案的堆栈溢出GratiudeThanks的展示。但是,在我进行列聚合的部分中,我想知道为什么要包含\\?另外,在查看反斜杠中使用的引号时,是否有理由在pivot Listag函数的开头和结尾都使用双引号张贴反斜杠?请进一步帮助,请粘贴函数为
列2
命令\u 1
打印的值。然后我们就可以正确地调试了。我们能够找到答案。我将在这里发布解决方案。我很高兴你解决了它。请向上投票并接受任何对您有帮助的答案,作为对堆栈溢出的一种表示感谢的方式,谢谢您,格雷格。我试过用双引号。获取以下错误。存储过程循环_EXMPL_9中的执行错误:SQL编译错误:语法错误第2行,位置63意外“”“区域”、“子区域”、“部门”、“公司产品”、“公司制造”、“公司发货至客户”、“业务单元”、“类别”、“子类别”、“分部”、“子分部”、“品牌”、“聚合品牌”、“子品牌”、“PPG”。在Statement.execute的第17行位置21PIVOT(在“${column2}”中Q.ATTR_名称的最大值(Q.ATTR_值))-->我认为添加的单引号可能会导致问题。但我可能错了。您可以转到“查询历史记录”选项卡,查看SP尝试运行的SQL语句。获取完整的语句使其更容易修复。如果不太长,还需要帮助的话,你可以把它贴在这里。让它工作吧!你看历史的想法帮助我调试。我会发布我正在使用的代码。谢谢你,格雷格。我试过用双引号。获取以下错误。存储过程循环_EXMPL_9中的执行错误:SQL编译错误:语法错误第2行,位置63意外“”“区域”、“子区域”、“部门”、“公司产品”、“公司制造”、“公司发货至客户”、“业务单元”、“类别”、“子类别”、“分部”、“子分部”、“品牌”、“聚合品牌”、“子品牌”、“PPG”。在Statement.execute的第17行位置21PIVOT(在“${column2}”中Q.ATTR_名称的最大值(Q.ATTR_值))-->我认为添加的单引号可能会导致问题。但我可能错了。您可以转到“查询历史记录”选项卡,查看SP尝试运行的SQL语句。获取完整的语句使其更容易修复。我可以把它贴在这里