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

C# 为什么包含查询的字符串在存储过程中不起作用,c#,sql,sql-server,stored-procedures,C#,Sql,Sql Server,Stored Procedures,我的情况是,我向存储过程发送一个查询以通过c#代码运行它 这个查询是通过c#代码生成的,当我直接复制并粘贴到StoredProcess并运行它时,它会成功运行 我的问题是: select acString from account_string where bstatus=1 and (dbo.getElementFromString(1,acstring) between 1000 and 4587) (我在运行代码后通过调试复制了它,因为它是动态生成的) 我通过如下参数向存储过程发送相同

我的情况是,我向存储过程发送一个查询以通过c#代码运行它

这个查询是通过c#代码生成的,当我直接复制并粘贴到StoredProcess并运行它时,它会成功运行

我的问题是:

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中):

但是当我通过复制和替换下面一行中的
@query
静态地尝试该查询时: 来自tbltransaction_详情,其中accountstring位于(@query)

然后我得到所有显示有数据的表格(请看这个)


为什么我使用@query时它不起作用?

您试图在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)              

人们似乎对SQL产生了神奇的信念,不知何故,字符串将神奇地变成执行的代码,或变成多个独立的值。它在SQL中不是这样工作的。但令我惊讶的是,它在大多数其他主流语言中都不是这样工作的。如果在C#中调用一个希望接收字符串的方法,并将文本
“System.Environment.MachineName”
传递给该方法,那么该方法是否希望接收该文本字符串或机器名称?现在看看上面的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)