C# 为什么包含查询的字符串在存储过程中不起作用
我的情况是,我向存储过程发送一个查询以通过c#代码运行它 这个查询是通过c#代码生成的,当我直接复制并粘贴到StoredProcess并运行它时,它会成功运行 我的问题是: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) (我在运行代码后通过调试复制了它,因为它是动态生成的) 我通过如下参数向存储过程发送相同
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)