Teradata存储过程中使用条件的动态SQL



我正在尝试在Teradata中创建一个用户友好的存储过程,该过程接受许多变量,并根据输入输出结果表。我正在SQL Assistant(提供者版本14.0.0.0)中构建查询。例如...

呼叫语句...

CALL spAddressLookup
 ('?AcctNum', '?LastName', '?FirstName'
  ,'?Address' , '?City', '?State', '?ZipCode'
  ,'?Company', '?Email', '?Balance', ReturnCode)  ;

创建语句...

CREATE PROCEDURE spAddressLookup(IN pAcctNum VARCHAR(25)
 ,IN pLastName VARCHAR(100), IN pFirstName VARCHAR(100), IN pAddress VARCHAR(255)
 ,IN pCity VARCHAR(255), IN pState VARCHAR(100), IN pZipCode VARCHAR(15)
 ,IN pCompany VARCHAR(255), IN pEmail VARCHAR(255), IN pBalance VARCHAR(10) , OUT ReturnCode CHAR(5))
BEGIN

我想动态构建一个仅包含用户输入值的变量的子句。我尝试使用在我的proc内部使用,但 set 语句似乎在内部效果不佳,如果

这是我正在尝试的...

IF TRIM(pLastName) IS NOT NULL 
 THEN 
   SET strWHERE = ' AND ( a.LastName LIKE ''%' || pAcctNum || '%'' )'
END IF; 

有什么想法吗?

您可以做一件事。首先为您的所有输入参数创建变量:

SET lv_pAcctNum  = CASE WHEN 'All' IN (''||pAcctNum ||'') THEN 1 ELSE (''||pAcctNum ||'') END;

在这里'All'sign'sign'签名用户未输入任何内容的整体(也可以按照您的过程设计为null)。

之后,在该子句的动态SQL中,使用这样的变量:

'WHERE CASE WHEN ''All'' IN ('''||pAcctNum||''') THEN 1 ELSE Route_to_Market END IN  ('''||lv_pAcctNum||''' )'

这将实现您的目标

您可以这样做:

IF pLastName IS NOT NULL
   SET strWHERE = ' AND ( a.LastName LIKE ''%' TRIM(pAcctNum) '%'' )'
END IF 

您不需要,然后在MSSQL中,以及类似的管道

最新更新