Моей ситуацией является то, что я отправляю запрос к хранимой процедуре для ее запуска, хотя код 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?
Людей, кажется, придумали волшебный убеждения в отношении SQL, которые каким-то образом строки будут волшебным образом превращаться в исполняемый код или в несколько отдельных значений. В SQL это не работает. Но меня удивляет то, что это не работает на большинстве других основных языков. Если вы вызовете метод на C#, который ожидает получить строку, и вы передадите ему буквенное '' System.Environment.MachineName'', вы ожидаете, что этот метод получит эту литеральную строку или имя вашей машины? Теперь посмотрим на ваш выше SQL. Какой из них вы ожидаете там? *Зачем*? –
[Параметрирование предложения SQL IN] (http://stackoverflow.com/questions/337704/parameterize-an-sql-in-clause). Совместный случай. ** 'актуальные значения'! =' строка/подзапрос' ** – lad2025