Teradata 问题。那么目标表将从源表中获取CustomerID和CustomerName,而最后一个字段SQL\u RESULT将从存储在源表中的SQL语句中获取结果?这意味着源表中的SQL Query字段中保存的SQL语句将只生成一条带有单个字段的记录,对吗?表中有
Teradata 问题。那么目标表将从源表中获取CustomerID和CustomerName,而最后一个字段SQL\u RESULT将从存储在源表中的SQL语句中获取结果?这意味着源表中的SQL Query字段中保存的SQL语句将只生成一条带有单个字段的记录,对吗?表中有,teradata,Teradata,问题。那么目标表将从源表中获取CustomerID和CustomerName,而最后一个字段SQL\u RESULT将从存储在源表中的SQL语句中获取结果?这意味着源表中的SQL Query字段中保存的SQL语句将只生成一条带有单个字段的记录,对吗?表中有select语句或insert语句吗?表中有存储的SQL语句。在多个列中?你能分享这个表格的布局和一些样本数据吗?我猜光标在这个表中循环并动态执行这些语句就可以了。@Andrew:是的,我在表中有SELECT语句。我想运行这些sql查询并用查询
问题。那么目标表将从源表中获取CustomerID和CustomerName,而最后一个字段
SQL\u RESULT
将从存储在源表中的SQL语句中获取结果?这意味着源表中的SQL Query
字段中保存的SQL语句将只生成一条带有单个字段的记录,对吗?表中有select语句或insert语句吗?表中有存储的SQL语句。在多个列中?你能分享这个表格的布局和一些样本数据吗?我猜光标在这个表中循环并动态执行这些语句就可以了。@Andrew:是的,我在表中有SELECT语句。我想运行这些sql查询并用查询结果填充另一个表。@JNevill:sql语句只存储在表的一列中。例如:带有查询的表类似于此CustomerID CustomerName SQL查询“101”“Xi Houng”选择MAX(ORDR_AMT)作为来自客户销售的MAX_ORDR_AMT,其中ORDR_DT=''01-03-2017''102''Fran Lombard''选择MAX(PAY_DT)由于CUST_TRANS的MAX_PAY_DT,其中ORDR_ID=''TS9821'',并且目标表看起来像CustomerID CustomerName SQL_RESULT,所以我在Teradata存储过程方面没有太多经验。请帮助我如何实现目标表中填充的结果。建议我如何解决这个问题。那么目标表将从源表中获取CustomerID和CustomerName,最后一个字段SQL\u RESULT
将从存储在源表中的SQL语句中获取结果?这意味着在源表的SQL Query
字段中保存的SQL语句将只生成一条带有单个字段的记录,对吗?感谢您提供此解决方案。我在您开发时创建了存储过程。我无法理解SQL语句如何运行以及如何在sqlResults中获得结果。我想知道“PREPARE S1 FROM sqlQuery;”是如何从查询中获取结果的。sqlQuery
是一个varchar/字符串,它使用SQL语句填充第一个游标(从表中)中的记录。我们创建了一个从语句S1
创建的游标S1
是根据sqlQuery
中的sql语句“准备”的。一旦该语句被“准备好”,我们就可以打开C1
光标,并用sqlQuery
字符串中与s1
语句相对应的记录填充它。为了动态执行存储在列中的sql语句,需要进行大量的跳转。sqlQuery列中的某些行是空的。当游标尝试执行它时,它将无法获取SQL结果。我不知道cursor中跳转到NULL sqlQuery列的逻辑应该是什么。我将使用WHERE语句(如WHERE sqlQuery NOT NULL
)调整用于加载source\u table\u cursor
游标的SQL查询,以避免这些记录进入游标。或者,您可以在游标的循环中添加一个IF语句进行检查(但这将比WHERE解决方案更昂贵)。感谢您提供此解决方案。我在您开发时创建了存储过程。我无法理解SQL语句如何运行以及如何在sqlResults中获得结果。我想知道“PREPARE S1 FROM sqlQuery;”是如何从查询中获取结果的。sqlQuery
是一个varchar/字符串,它使用SQL语句填充第一个游标(从表中)中的记录。我们创建了一个从语句S1
创建的游标S1
是根据sqlQuery
中的sql语句“准备”的。一旦该语句被“准备好”,我们就可以打开C1
光标,并用sqlQuery
字符串中与s1
语句相对应的记录填充它。为了动态执行存储在列中的sql语句,需要进行大量的跳转。sqlQuery列中的某些行是空的。当游标尝试执行它时,它将无法获取SQL结果。我不知道cursor中跳转到NULL sqlQuery列的逻辑应该是什么。我将使用WHERE语句(如WHERE sqlQuery NOT NULL
)调整用于加载source\u table\u cursor
游标的SQL查询,以避免这些记录进入游标。或者,您可以在游标的循环中添加一个IF语句来进行检查(但这将比WHERE解决方案更昂贵)。
CREATE PROCEDURE <yourdatbase>.MyNewProcedure()
BEGIN
--Declare variables to hold the three fields as we loop through them with the cursor
--You'll need to change these types to match your table's data type so we can fetch
-- them without error inside the cursor loop
DECLARE customerID INT;
DECLARE customerName VARCHAR(50);
DECLARE sqlQUERY as VARCHAR(10000);
DECLARE source_table_cursor CURSOR FOR SELECT customerID, customerName, SQLQuery FROM <yourdatabase>.yoursourcetable FOR READ ONLY;
OPEN source_table_cursor;
looplabel:
LOOP
--We'll need a cursor for a dynamic statement
--And we'll also need an integer to catch your query
--results (Assuming they are all like (Sum(<somefield>) or some
--type of INT
DECLARE C1 CURSOR FOR S1;
DECLARE sqlResults as INT;
FETCH source_table_cursor INTO customerID, customerName, sqlQuery;
--WOAH THERE! Cursor issues something went wrong die die die
IF (SQLSTATE ='02000') THEN
LEAVE label1;
END IF;
--Now that we have a record and a sql statement we will need another cursor
--where we will execute, dynamically, the SQL statement and then fetch the
--single record result to update our target table
PREPARE S1 FROM sqlQuery;
OPEN C1;
FETCH C1 INTO sqlResults;
--Now we can INsert into your target table
INSERT INTO <yourdatabase>.yourtargettable (customerID, customerName SQL_RESULT)
VALUES (customerID, customerName, sqlResults);
CLOSE C1;
END LOOP looplabel;
CLOSE demographic_cursor;
END