为什么包含查询的字符串在存储过程中不起作用

时间:2016-04-15 09:02:53

标签: c# sql sql-server stored-procedures

我的情况是我通过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时为什么它不起作用?

1 个答案:

答案 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)