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

Dynamic SQL in Teradata Stored Procedure using conditionals

我正在尝试在 Teradata 中创建一个用户友好的存储过程,它接受大量变量并根据输入输出结果 table。我正在 SQL 助手(提供商版本 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

我想动态构建一个 WHERE 子句,该子句仅包含用户为其输入值的那些变量。我尝试在我的 proc 中使用 IF 条件语句,但 SET 语句似乎在 IF

这就是我正在尝试的...

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

有什么想法吗?

你可以这样做:

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

您不需要在 MSSQL 中使用 THEN,也不需要在 LIKE 中使用管道

你只能做一件事。首先为所有输入参数创建变量,如下所示:

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

这里的'全部'表示用户没有输入任何内容的全部(根据您的程序设计,它也可以为空)。

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

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

这将实现您的目标