【问题标题】:Dynamic SQL in Teradata Stored Procedure using conditionals使用条件的 Teradata 存储过程中的动态 SQL
【发布时间】:2018-05-05 08:51:29
【问题描述】:

我正在尝试在 Teradata 中创建一个用户友好的存储过程,它接受多个变量并根据输入输出结果表。我正在 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; 

有什么想法吗?

【问题讨论】:

  • 你的意思是doesn't seem to play well inside the IF.有什么错误吗?还是没有输入if语句?你有没有放一些调试行来知道你的代码去哪里了?
  • 您想将此添加到现有的strWHERE 吗?然后你需要像这样编码SET strWHERE = strWHERE || ' AND ( a.LastName LIKE ''%' || pAcctNum || '%'' )'
  • 正如@dnoeth 所说,但初始化SET strWHERE = 'WHERE 1=1 ',以便您可以连接所有AND ...

标签: sql stored-procedures teradata dynamic-sql


【解决方案1】:

你可以这样做:

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

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

【讨论】:

  • 这是 Teradata 问题而不是 MSSQL
【解决方案2】:

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

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||''' )'

这将实现您的目标

【讨论】:

    猜你喜欢
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2019-10-04
    • 1970-01-01
    • 2015-01-28
    • 2011-02-27
    相关资源
    最近更新 更多