Вызов хранимой процедуры SQL Server с помощью службы linq через С#. Вызов sql процедуры


sql-server - Процедура вызова другой процедуры в t-sql

У меня есть эта процедура T-SQL в SQL Server 2008:

create procedure rolledback as begin set nocount on ; declare @min int declare @max int declare @I INT IF OBJECT_ID ('TEMDB..#TempTable') IS NOT NULL begin drop table #TempTable end create table #TempTable ( TempOrderNumber int ) SELECT @min = ( SELECT MIN (numero) from controlanum with (nolock)) SELECT @max = ( SELECT Max (numero) from controlanum with (nolock)) select @I = @min while @I <= @max begin insert into #TempTable select @I select @I = @I + 1 end select tempordernumber from #TempTable left join controlanum O with (nolock) on TempOrderNumber = o.numero where o.numero is null end

Это отлично работает с контролем viewanum, но мне нужно выбрать интервал дат

Я написал две другие процедуры для фильтрации этого периода

create proc maxiN (@emp int, @mes int, @ano int) as select Max (numero) from ctrc WHERE (EMITENTE = @emp) AND (MONTH(EMISSAODATA) = @mes) AND (YEAR(EMISSAODATA) = @ano) create proc Minix (@emp int, @mes int, @ano int) as select Min (numero) from ctrc WHERE (EMITENTE = @emp) AND (MONTH(EMISSAODATA) = @mes) AND (YEAR(EMISSAODATA) = @ano)

Я вставляю эти процедуры в процедуру rolledback, но теперь что-то не так. Rolledback2 возвращает 0, как процедуры max и min возвращают что-либо.

create procedure rolledback2 ( @emp int, @mes int, @ano int) as begin set nocount on ; declare @min int declare @max int declare @I INT IF OBJECT_ID ('TEMDB..#TempTable') IS NOT NULL begin drop table #TempTable end create table #TempTable ( TempOrderNumber int ) exec @min = min2 @emp,@mes ,@ano exec @min = min2 @emp,@mes ,@ano select @I = @min while @I <= @max begin insert into #TempTable select @I select @I = @I + 1 end select tempordernumber from #TempTable left join controlanum O with (nolock) on TempOrderNumber = o.numero where o.numero is null end

и с функцией ничего не вернуть

declare @min int select @min = fmin 504,2,2013

работает только так

fmin 504,2,2013

Спасибо за любую ориентацию

Alejandro

qaru.site

c# - Вызов хранимой процедуры SQL Server с помощью службы linq через С#

Я новичок в Linq и пытаюсь преобразовать эту хранимую процедуру SQL Server в Linq, я создаю бизнес-приложение Silverlight и должен вызвать эту процедуру, чтобы вернуть сетку результатов.

У меня есть несколько параметров, которые пользователи могут использовать для поиска определенных частей. Они сужают свой поиск через пользовательский интерфейс, и когда они нажимают кнопку поиска, код позади принимает все аргументы и отправляет его в мою службу Linq, которая затем должна вызвать хранимую процедуру.

Вот хранимая процедура.

ALTER PROCEDURE dbo.spSearchResults @PieceType nvarchar(6) = '', @FileType nvarchar(3) = '', @Market nvarchar(6) = '', @PieceNumber nvarchar(6) = '', @Header1 nvarchar(50) = '', @Header2 nvarchar(50) = '', @Header3 nvarchar(50) = '', @Header4 nvarchar(50) = '', @JobNumber nvarchar(50)=' ', @bShowInActive BIT = 0, @UDAC1 nvarchar(50) = '', @UDAC2 nvarchar(50) = '', @UDAC3 nvarchar(50) = '', @UDAC4 nvarchar(50) = '' AS BEGIN SET NOCOUNT ON SELECT J.* FROM Job J LEFT JOIN JobHeading h2 (NOLOCK) ON J.[JobNumber] = h2.[JobID] LEFT JOIN JobHeading h3 (NOLOCK) ON J.[JobNumber] = h3.[JobID] LEFT JOIN JobHeading h4 (NOLOCK) ON J.[JobNumber] = h4.[JobID] LEFT JOIN JobHeading h5 (NOLOCK) ON J.[JobNumber] = h5.[JobID] LEFT JOIN JobUDAC udac1 (NOLOCK) ON J.[JobNumber] = udac1.[JobID] LEFT JOIN JobUDAC udac2 (NOLOCK) ON J.[JobNumber] = udac2.[JobID] LEFT JOIN JobUDAC udac3 (NOLOCK) ON J.[JobNumber] = udac3.[JobID] LEFT JOIN JobUDAC udac4 (NOLOCK) ON J.[JobNumber] = udac4.[JobID] WHERE ((@PieceType = '') OR (PieceType = @PieceType)) AND ((@FileType = '') OR (FileType = @FileType)) AND ((@Market = '') OR (Market = @Market)) AND ((@PieceNumber = '') OR (PieceNumber = @PieceNumber)) AND ((@JobNumber = '') OR (JobNumber = @JobNumber)) AND (J.IsActive=1 OR @bShowInActive = 1) AND (((@Header1 = '' AND @Header2 = '' AND @Header3 = '' AND @Header4 = '') OR h2.HeadingRowID = @Header1) OR (--@Header2=0 OR h3.HeadingRowID = @Header2 ) OR (--@Header3=0 OR h4.HeadingRowID = @Header3) OR (--@Header4=0 OR h5.HeadingRowID = @Header4)) AND (((@UDAC1 = '' AND @UDAC2 = '' AND @UDAC3 = '' AND @UDAC4 = '') OR udac1.UDACRowID = @UDAC1) OR (--@Header2=0 OR udac2.UDACRowID = @UDAC2 ) OR (--@Header3=0 OR udac3.UDACRowID = @UDAC3) OR (--@Header4=0 OR udac4.UDACRowID = @UDAC4))

В Linq я обнаружил, что есть определенные преобразования, и это моя попытка.

var query = from j in Job join JobHeading h2 in Job on headingRowID1 equals h2 join JobHeading h3 in Job on headingRowID2 equals h3 join JobHeading h4 in Job on headingRowID3 equals h4 join JobHeading h5 in Job on headingRowID4 equals h5 join JobUDAC udac1 in Job on udacRowID1 equals udac1 join JobUDAC udac2 in Job on udacRowID2 equals udac2 join JobUDAC udac3 in Job on udacRowID3 equals udac3 join JobUDAC udac4 in Job on udacRowID4 equals udac4 join PieceType in db on piece equals PieceType join JobFileType in db on filetype equals JobFileType join Book in db on market equals Book join PieceNumber in db on pieceNumber equals PieceNumber join JobNumber in db on jobNumber equals JobNumber join Job in db on FindJobs equals db where ((piece = string.Empty) || (PieceType = piece)) && ((filetype = string.Empty) || (JobFileType = filetype)) && ((market = string.Empty) || (Book = market)) && ((pieceNumber = string.Empty) || (PieceNumber = pieceNumber)) && ((jobNumber = string.Empty) || (JobNumber = jobNumber)) && (showInActive = true) && ((((headingRowID1 = string.Empty) + (headingRowID2 = string.Empty) + (headingRowID3 = string.Empty) + (headingRowID4 = string.Empty)) || h2.HeadingRowID = headingRowID1) || (h3.HeadingRowID = headingRowID2) || (h4.HeadingRowID = headingRowID3) || (h5.HeadingRowID = headingRowID4)) && ((((udacRowID1 = string.Empty) + (udacRowID2 = string.Empty) + (udacRowID3 = string.Empty) + (udacRowID4 = string.Empty)) || udac1.UDACRowID = udacRowID1) || (udac2.UDACRowID = udacRowID2) || (udac3.UDACRowID = udacRowID3) || (udac4.UDACRowID = udacRowID4)) select j.Job; return query;

Однако начало "Job" имеет ошибку и говорит "не удалось найти реализацию..." join "not found" Может ли кто-нибудь помочь перевести? Или предложить лучший способ вызвать хранимую процедуру с кодом? Благодаря

qaru.site

tsql - SQL хранимые процедуры Вызов против нескольких записей

Как всегда, есть случай для обоих способов.

Чтобы оптимизировать объем выполненной работы, как сказал Блам, вам следует сделать один большой звонок, чтобы сократить время в оба конца. Не только для латентности сети, но и для всех сетевых накладных расходов для сборки пакетов и управляющих сокетов.

Однако это будет означать, что ваша страница не получает данных, пока все обращения к базе данных не будут выполнены. Чтобы улучшить время отклика, вы можете рассмотреть возможность создания конвейера, где есть некоторые вызовы базы данных, но вы также обрабатываете некоторые результаты базы данных, когда выполняются другие вызовы. Это довольно необычный случай, поскольку большую часть времени обработка довольно светлая.

Общей причиной разрыва хранимой процедуры является повторное использование. Если у вас есть одна большая хранимая процедура, то для повторного использования какой-либо части хранимой процедуры вы должны ее повторно использовать. (Если вы не используете грязные ветки и условия внутри вашей хранимой процедуры, которые, вероятно, ухудшают производительность из-за оптимизации плана запроса.) Если у вас есть несколько страниц, которые могут совместно использовать некоторые из кода, вы, вероятно, захотите его разбить.

В типичной веб-ферме база данных и серверы страниц довольно близки друг к другу, так что латентность сети не так уж плоха. Я профилировал некоторые из наших производственных нагрузок, и есть несколько мест, где мы последовательно вызываем несколько запросов к базе данных, принимаем менее 1 мс за 10 запросов к базе данных.

Если ваша латентность сети базы данных значительна, возможно, стоит выполнять вызовы базы данных параллельно. Таким образом, вы можете разбить свою хранимую процедуру для повторного использования кода и не беспокоиться о латентности сети.

Как правило, сделайте свой код чистым и красивым, не беспокоясь о производительности. Бросьте больше аппаратного обеспечения на проблему, пока вы не сможете сделать это быстрее, заплатив больше денег. Как правило, оборудование намного дешевле, чем разработчики.

qaru.site

sql-server - Способ динамического вызова хранимой процедуры SQL (динамические параметры в sp_executesql)?

Список параметров может быть отправлен как список с разделителями-запятыми (или специальный разделитель символов), тогда список может быть проанализирован в таблицу. В этом примере я использовал "," и "=".

Это было мое первоначальное решение:

DECLARE @List VARCHAR(MAX) = 'a=1,b=3,c=hey,d=12/05/10,val5=' DECLARE @Delimiter1 VARCHAR(1) = ',' DECLARE @Delimiter2 VARCHAR(1) = '=' ---- SELECT y.i.value('(./text())[1]', 'nvarchar(4000)') pass1 INTO #Buffer FROM ( SELECT x = CONVERT(XML, '<i>' + REPLACE(@List, @Delimiter1, '</i><i>') + '</i>').query('.') ) a CROSS APPLY x.nodes('i') y(i) SELECT ROW_NUMBER()OVER(ORDER BY(SELECT 1)) rn,y.i.value('(./text())[1]', 'nvarchar(4000)') pass2 INTO #PreResult FROM ( SELECT x = CONVERT(XML, '<i>' + REPLACE(b.pass1, @Delimiter2, '</i><i>') + '</i>').query('.') FROM #Buffer b WHERE b.pass1 LIKE '%=%' AND b.pass1 NOT LIKE '%=%=%' -- to make sure assignment has place and there is no double or more assignments ) a CROSS APPLY x.nodes('i') y(i) SELECT @List '@List' --SELECT '' '#Buffer',* FROM #Buffer b --SELECT '' '#PreResult',* FROM #PreResult p SELECT p.pass2 [Variable],p2.pass2 [Value] FROM #PreResult p INNER JOIN #PreResult p2 ON p2.rn = p.rn + 1 WHERE p.rn%2 > 0 DROP TABLE #Buffer DROP TABLE #PreResult

Более умный:

DECLARE @List VARCHAR(MAX) = 'a=1,b=3,c=hey,d=12/05/10,val5=' DECLARE @Delimiter1 VARCHAR(1) = ',' DECLARE @Delimiter2 VARCHAR(1) = '=' SELECT v.v.value('(./text())[1]', 'nvarchar(4000)') [Variable],n.n.value('(./text())[1]', 'nvarchar(4000)') [Value] FROM ( SELECT x = CONVERT(XML, '<a><v>' + REPLACE(REPLACE(@List,@Delimiter1,'</n></a><a><v>'),@Delimiter2,'</v><n>') + '</n></a>' ).query('.') ) a CROSS APPLY x.nodes('a') y(a) CROSS APPLY y.a.nodes('v') v(v) CROSS APPLY y.a.nodes('n') n(n)

Лучше всего отправить XML со списком параметров, а затем проанализировать этот XML в таблице.

Пожалуйста, дайте мне знать, если у вас есть вопросы.

Обновление: Поэтому здесь вам нужно предоставить только одно значение - список параметров и их значений. Внутри запроса вы можете делать с ними все, что хотите.

DECLARE @sql NVARCHAR(MAX),@paramlist NVARCHAR(MAX) SET @sql = N' DECLARE @Delimiter1 VARCHAR(1) = '','' DECLARE @Delimiter2 VARCHAR(1) = ''='' SELECT v.v.value(''(./text())[1]'', ''NVARCHAR(4000)'') [Variable],n.n.value(''(./text())[1]'', ''NVARCHAR(4000)'') [Value] INTO #Values FROM ( SELECT x = CONVERT(XML, ''<a><v>'' + REPLACE(REPLACE(@List,@Delimiter1,''</n></a><a><v>''),@Delimiter2,''</v><n>'') + ''</n></a>'' ).query(''.'') ) a CROSS APPLY x.nodes(''a'') y(a) CROSS APPLY y.a.nodes(''v'') v(v) CROSS APPLY y.a.nodes(''n'') n(n) /*Do whatever you want with the values*/ /*There even could be a stored proc call based on parameters provided*/ SELECT v.Value FROM #Values v WHERE v.Variable = ''c'' DROP TABLE #Values ' SET @paramlist = '@list nvarchar(max)' DECLARE @List VARCHAR(MAX) = 'a=1,b=3,c=hey,d=12/05/10,val5=' EXEC sp_executesql @sql, @paramlist, @list=@List

qaru.site

Удаленный вызов процедур - Microsoft sql server (MS SQL) - Информатика

Удаленный вызов процедур. Основу этой системы удаленного вызова процедур положила статья, которая появилась в 1980 – м году и в ней был предложен новый способ сообщений между машинами. Предложенная идея сводилась к следующему разрешить процедуре находящейся на машине А использовать процедуру находящейся на машине В. Взаимодействие предполагалось сделать следующим образом: процесс запускается на  машине А, и вызывает программу находящиеся на машине В, после вызова процесс на машине А приостанавливается и начинает работать на машине В информация передается через параметры. После того как процедура на машине В отработает процесс на машине А возобновляется. Удаленный вызов процедур был реализован с появлением персоналок.

Основные проблемы возникающие при удаленном вызове процедур: 1) Т.к. процессы выполняются на разных машинах, то они выполняются в разных адресных пространствах, и нужно было согласовать эти пространства. 2) Параметры процедур то же передаются от машины к машине виде сообщений. По протоколам, которые не гарантируют доставку сообщения. 3) Машины на которых находятся процедуры могут иметь свои, поэтому необходимо прогнозировать ситуации в этом случае. Заглушки для клиента и сервера. (STUB). Все эти проблемы на практике решили с помощью механизма заглушек. Заглушка – это программный код, вызываемой процедуры, но которая работает локально.

Алгоритм удаленного вызова процедур: 1) Процедура клиента вызывает клиентскую заглушку. 2) Клиентская заглушка создает сообщение и вызывает локальную о.с. 3) Локальная о.с. пересылает сообщение о.с. сервера. 4) О.с. сервера извлекает сообщение и передаёт результат северной заглушке. 5) Серверная заглушка извлекает параметры процедуры и запускает сервер. 6) Сервер выполняет процедуры результаты возвращаются заглушке сервера. 7) Сервер загружает результаты сообщения и вызывает совою локальную о.с. 8) О.с. сервера пересылает сообщение о.с. клиента 9) О.с. активирует клиентскую заглушку. 10) Заглушка извлекает результаты передает их клиенту.          

www.wddb.ru