2013-02-27 41 views
0

我當前正在嘗試將sql查詢轉換爲存儲過程,但在轉換字符串比較時遇到困難。比較字符串 - 從C#上的SQL轉換爲存儲過程

下面是我的C#應用​​程序的SQL代碼:

String Query = @"select label 
, marking 
from 
(
select count(equipment) as num_equipments 
from CS_PM_EQUI_INFO 
where " + Perspective + " = '" + Workcenter + @"' 
) 

下面是我試圖轉換到存儲過程:

begin 
    stmt := ' 
    select label 
    , marking 
      from 
    ( 
    select count(equipment) as num_equipments   
    from CS_PM_EQUI_INFO   
    where '|| perspective ||' = '||' Workcenter '||' 
    ) 

我是不是做正確嗎?我試圖比較角度和工作中心,都是字符串參數。示例:Workcenter值爲ABC,其中perspective ='ABC'。

由於返回的結果不是我們所期望的,請請幫助我。

非常感謝。

+2

什麼是你的數據庫服務器(sql-server/mysql/oracle)?子查詢不會返回您試圖從主查詢中獲取的列。爲什麼不在數據庫服務器本身中創建存儲過程並從代碼中傳遞參數? – Kaf 2013-02-27 09:25:42

+0

我不太確定列「標記」和「標記」中的SELECT是否只在列「num_equipments」時才能正常工作。 – Sebastian 2013-02-27 09:28:01

+0

嗨Kaf,即時通訊使用甲骨文現在。 – Wil50n 2013-02-27 09:38:38

回答

1

首先,您現有代碼中存在SQL注入漏洞:變量Workcenter的值嵌入在SQL語句中,而您應該使用綁定變量。另外Perspective包含一個列的名稱,您應該確保它不包含SQL注入嘗試(dbms_assert包適用於此)。

其次,我不確定當您在外部查詢中選擇不在子查詢中的列時,現有查詢是如何工作的。

作爲一個實際的解決方案,在Oracle的存儲過程,你可以做類似如下:

function my_func(my_column in varchar2, my_value in varchar2) return varchar2 is 
    q varchar2(1000); 
    return_value varchar2(1000); 
begin 
    q := 'select other_column from my_table where ' || my_column || ' = :my_value'; 

    execute immediate q into return_value using my_value; 

    return return_value; 
end my_func; 

如果my_column可由最終用戶指定(即不從代碼常量),那麼你應該使用dbms_assert.simple_sql_name來聲明該字符串可以安全使用。