私の状況は、ストアドプロシージャにクエリを送信して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を参照してください)データで表示されるすべてのテーブルを取得しますか?
人々が魔法を考え出すように見えます何らかの形で文字列が魔法のように実行されたコードに変換される、あるいは複数の別々の値になるというSQLに関する信念です。それはSQLのようには動作しません。しかし、私が驚いているのは、他のほとんどの主流言語ではそうではないということです。文字列を受け取ることを期待するC#のメソッドを呼び出し、文字列 '' System.Environment.MachineName "'を渡すと、そのリテラル文字列またはマシンの名前を受け取るメソッドがあると思いますか?今あなたの上記のSQLを見てください。どちらがあなたがそこで起こることを期待していますか? *なぜ*? –
[SQL IN句のパラメータ化](http://stackoverflow.com/questions/337704/parameterize-an-sql-in-clause)単純なケース。 ** '実際の値'!= '文字列/サブクエリ' ** – lad2025