2014-12-11 81 views
0

如何在SQL查詢中使用變量而不使用使用動態SQL和concat方法?在沒有動態SQL的表名中使用變量SQL

我很想能夠在一個腳本的開頭聲明變量,然後用它們在整個腳本(如表名)

這裏是想我做的一個例子:

declare variables 
Set @Table1 = 'WhatsOn_20141208' 

-- drop and re-create table 
drop table if exists @Table1; 
CREATE TABLE @Table1 (
rac_account_no varchar(100), 
addressLine2 varchar(100) 
); 

-- load data into table 
LOAD DATA LOCAL INFILE 'C:/Example.txt' 
INTO TABLE @Table1 
FIELDS TERMINATED BY '|' 
ENCLOSED BY '"' LINES TERMINATED BY '\n' 
IGNORE 1 LINES; 

-- update addressLine2 column 
Update @Table1 
set addressLine2 = REPLACE(addressLine2,"*UNKNOWN*",""); 

如果表名更改,我希望能夠在變量中更改一次,而不是執行查找和替換所有事件。

到目前爲止,我發現是使用動態SQL和連接字符串像本例中的唯一的解決辦法:

SET @s = CONCAT('select * from ', @Cat, ' where ID = ', @ID_1); 

PREPARE stmt1 FROM @s; 
EXECUTE stmt1; 
DEALLOCATE PREPARE stmt1; 

是否有更簡單的方法?

乾杯, 盧卡斯

+1

你不能,你必須使用'動態sql'爲此... – sgeddes 2014-12-11 02:16:02

+1

你可以有一個配置文件中的表名,並在.sql文件中有宏表名,有一個Python程序讀取配置文件並修改sql文件並使用修改的sql來達到您的目的。 – radar 2014-12-11 02:17:27

+0

數據庫結構中有多個表具有相同列的表經常是數據庫中存在問題的標誌。很少有任何理由有多個相同的表。你應該重新訪問你的數據庫設計。 – 2014-12-11 02:20:02

回答

1

你問,我如何使用一個變量在SQL查詢不使用動態SQL和concat方法

對不起,你不能。動態SQL是在MySQL中完成的方式。

這適用於模式,表和列的名稱 - 即數據字典名稱 - 而不是值。

大多數需要數據字典項目變量名稱的應用程序開發人員使用其主機語言構建查詢。也就是說,他們使用PHP或Java或類似的東西把字符串像

SELECT xxx FROM yyy WHERE zzz 

成字符串像

SELECT id,name,value FROM transaction WHERE id=? 

隨後,他們繼續使用綁定變量的數據值。

MySQL準備好的語句只是在MySQL服務器內完成這種工作的一種方式,而不是主機語言。但是(在我看來)準備好的語句很難進行單元測試和故障排除,所以使用你的宿主語言更有效率的軟件工程。

當應用程序的數據源不可信時有點危險,因此檢查每個輸入的有效性是很重要的。

+0

夠公平的。因此,如果你有變量從表單或外部源提供並傳遞到MySQL,你會使用動態SQL?你會爲你正在做的每個查詢編寫單獨的準備/執行/解除分配,還是將多個查詢合併爲一個準備/執行/解除分配? – Lucas 2014-12-11 02:20:47

+1

我編輯了我的答案來解決您的問題。 – 2014-12-11 13:15:47

+0

感謝Ollie。很有幫助 :) – Lucas 2014-12-11 23:06:28