2016-04-15 15 views
1

私の状況は、ストアドプロシージャにクエリを送信してC#コードで実行することです。クエリを含む文字列がストアドプロシージャで機能しない理由

このクエリはC#コードで生成され、ストアドプロシージャに直接コピー&ペーストして実行すると正常に実行されます。 (私はそれがdynaimcally genratedされると、デバッグで自分のコードを実行した後、それをコピーした)

select acString from account_string where bstatus=1 and (dbo.getElementFromString(1,acstring) between 1000 and 4587) 

私のクエリはこれです。

私はこのようなパラメータによってストアドプロシージャに送信し、同じクエリ:

ALTER PROCEDURE [dbo].[sp_shekharSheetDisplay]       
@action varchar(50)='',                                         
@query varchar(max)='' //here i send my query through parameter 
AS   
BEGIN     
SET NOCOUNT ON;    
BEGIN TRY  
    if(@action='sheet')      
begin    
    select accountstring, 
    isnull(sum(case when amttype='dr' then (amount) end),'0.00') DR, 
    isnull(sum(case when amttype='cr' then (amount) end),'0.00') CR, 
    isnull(sum(case when amttype='dr' then (amount) end),'0.00')-isnull(sum(case when amttype='cr' then (amount) end),'0.00') amt 
    from tbltransaction_detail where accountstring in (@query) 
    group by accountstring     

end 
END TRY   
BEGIN CATCH   
    EXECUTE sp_ErrorDB_AddNew   
SELECT 3,'SQL Exception'   
END CATCH   
END 

実行中にそれが動作しません。

をtbltransaction_detailから (@query)にaccountstring場所:

Cls_budget objBudget = new Cls_budget(); 
    DataSet ds = new DataSet(); 
    objBudget.Action = "sheet"; 
    objBudget.Query = query; 
    ds = objBudget.ManageSheet();// I found no data in ds here in my table 

をしかし、私はコピーして下の行に@queryを交換することにより、静的にそのクエリをしようとすると:それは(以下DSで)私のデータセットに任意のデータを送信しません。私は@queryを使用する場合、それは動作しませんなぜ

は、その後、私は

(このhttp://prntscr.com/ashf14を参照してください)データで表示されるすべてのテーブルを取得しますか?

+3

人々が魔法を考え出すように見えます何らかの形で文字列が魔法のように実行されたコードに変換される、あるいは複数の別々の値になるというSQLに関する信念です。それはSQLのようには動作しません。しかし、私が驚いているのは、他のほとんどの主流言語ではそうではないということです。文字列を受け取ることを期待するC#のメソッドを呼び出し、文字列 '' System.Environment.MachineName "'を渡すと、そのリテラル文字列またはマシンの名前を受け取るメソッドがあると思いますか?今あなたの上記のSQLを見てください。どちらがあなたがそこで起こることを期待していますか? *なぜ*? –

+0

[SQL IN句のパラメータ化](http://stackoverflow.com/questions/337704/parameterize-an-sql-in-clause)単純なケース。 ** '実際の値'!= '文字列/サブクエリ' ** – lad2025

答えて

1

IN句の中で渡された問合せを直接使用しようとしています。これはうまくいきません...

動的SQLで試してみることができます:これは、文を文字列として作成し、渡されたクエリを直接そこに書き込まれたように記入して、動的にコマンドを実行します。

しかし、私は、私はあなたがあなたの「内部」クエリで使用して、動的SQLなしでこれを解決するためのパラメータを渡すために良かったと思うことを、認めなければならない...

DECLARE @cmd NVARCHAR(MAX)=   
N'select accountstring, 
isnull(sum(case when amttype=''dr'' then (amount) end),''0.00'') DR, 
isnull(sum(case when amttype=''cr'' then (amount) end),''0.00'') CR, 
isnull(sum(case when amttype=''dr'' then (amount) end),''0.00'')-isnull(sum(case when amttype=''cr'' then (amount) end),''0.00'') amt 
from tbltransaction_detail where accountstring in (' + @query + ') 
group by accountstring'; 
EXEC (@cmd)    
関連する問題