2016-04-15 2 views
1

Моей ситуацией является то, что я отправляю запрос к хранимой процедуре для ее запуска, хотя код C#.Почему моя строка, содержащая запрос, не работает в хранимой процедуре

Этот запрос сгенерирован с помощью кода C#, и он успешно выполняется, когда я напрямую копирую и вставляю его в хранимую процедуру и запускаю его.

Мой запрос состоит в следующем:

select acString from account_string where bstatus=1 and (dbo.getElementFromString(1,acstring) between 1000 and 4587) 

(я скопировал его после того, как работает мой код, отладки, как это genrated dynaimcally).

тот же запрос я посылаю хранимую процедуру с помощью параметров, как это:

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 

Это не работает во время работы. Он не посылает никаких данных в моем наборе данных (в йз ниже):

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 в (@query)

Тогда я получаю все таблицы отображаются с данными (см это http://prntscr.com/ashf14)

Почему это не работает, когда я использую @query?

+3

Людей, кажется, придумали волшебный убеждения в отношении SQL, которые каким-то образом строки будут волшебным образом превращаться в исполняемый код или в несколько отдельных значений. В SQL это не работает. Но меня удивляет то, что это не работает на большинстве других основных языков. Если вы вызовете метод на C#, который ожидает получить строку, и вы передадите ему буквенное '' System.Environment.MachineName'', вы ожидаете, что этот метод получит эту литеральную строку или имя вашей машины? Теперь посмотрим на ваш выше SQL. Какой из них вы ожидаете там? *Зачем*? –

+0

[Параметрирование предложения SQL IN] (http://stackoverflow.com/questions/337704/parameterize-an-sql-in-clause). Совместный случай. ** 'актуальные значения'! =' строка/подзапрос' ** – lad2025

ответ

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)    
Смежные вопросы