2014-09-26 133 views
1

我想在我的動態sql查詢中使用一個參數,但只是無法讓它工作。我簡化了代碼,只突出顯示了我正在努力的部分。參數和teradata動態SQL

我首先創建't1',我插入記錄。

創建易失性表t1爲(

選擇日期 '1900-01-01' 作爲date_col的

)上提交保存行的數據;

第一個程序正常工作,並插入給定日期(2014-01-01)。

替換過程mi_table.dynamic_param()

開始

CALL DBC.SYSEXECSQL(

'插入到T1

選擇日期 '||'''2014-01 -01'''||';'

);

end;

我真正想要做的,不工作,有幾分像這樣:

更換過程mi_table.dynamic_param() 開始

申報max_avail_date日期;

set max_avail_date =(從db.table中選擇period_dt);

CALL DBC.SYSEXECSQL(

'插入到T1 選擇 '||:max_avail_date ||';'

);

end;

哪個不起作用。看起來像'(從db.table選擇period_dt)'返回的是'yy/mm/dd'格式。感謝以下建議,我提出了以下(非優雅)解決方案:

每當我想使用max_avail_date,我使用 cast((cast('''||'20'||'' '||'''|| max_avail_date ||'''int)-19000000)作爲日期)。

它的工作,但我敢肯定有做:)

2014-09-27編輯一個更好的方式,6:50 PM

回答

0

這應該工作:

declare max_avail_date varchar(10); 
declare strSQL varchar(2000); 
set max_avail_date = '2014-01-01'; 
set strSQL = 'insert into t1 select (date''' || max_avail_date || ''')'; 
CALL DBC.SYSEXECSQL(:strSQL); 

我永遠無法按照您嘗試的方式工作。這一點在這裏是殺了我: set max_avail_date = date '2014-01-01' ;我認爲試圖在set語句中使用強制轉換將不起作用。

將其設置爲一個字符串並將其轉換爲select語句中的日期可以正常工作。

1

「不工作」是不是一個很精確的錯誤描述:-)

你可能患上了「無效的日期」的消息?

在STRSQL連接後的字符串必須是有效的SQL語句,你的導致

insert into t1 select date 2014-01-01 ; 

這將工作:

replace procedure mi_table.dynamic_param() begin 

declare max_avail_date date; 

set max_avail_date = date '2014-01-01' ; 

CALL DBC.SYSEXECSQL(
'insert into t1 select '''||:max_avail_date||''' ;' 

); 

end; 

編輯:

關於與問題'yy/mm/dd'格式,這可能是由於系統上的全局默認值。你最好隱含指定的格式:

CALL DBC.SYSEXECSQL(
'insert into t1 select '''|| (:max_avail_date (FORMAT 'yyyy-mm-dd'))||''' ;' 

); 
+0

奇怪,我不能得到'設置max_avail_date =日期「2014年1月1日」;'上班,想我必須有脂肪手指的東西。 – Andrew 2014-09-26 21:25:12

+0

非常感謝您的回答。另外,好的一點,我沒有說什麼不起作用。說實話,我並不瞭解自己。我做了更多的測試,現在我想我知道問題在哪裏。讓我編輯我的初始帖子。當簡化我的查詢時,我擺脫了我認爲我認爲是關鍵要素的東西。 – 2014-09-27 22:41:29