我的情况是我通过c#代码向存储过程发送查询以运行它。
此查询是通过c#代码生成的,当我直接将其复制并粘贴到storedprocedure并运行它时,它会成功运行。
我的疑问是:
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
运行时不起作用。它不会向我的数据集发送任何数据(在下面的ds中):
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
时静态地尝试该查询时:
来自tbltransaction_detail其中accountstring in(@query)
然后我会显示包含数据的所有表格(请参阅此http://prntscr.com/ashf14)
当我使用@query时为什么它不起作用?
答案 0 :(得分: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)