Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Хранимие функции в SQL Server2000 Добавлено: 02.04.04 09:44  

Автор вопроса:  danser | ICQ: 299287824 

В своей БД мне нужно обрабатывать в цикле некоторые даные вибраные по SQL-инструкции. Сначала я делал так(речь об VB .NET и SQL Server2000):

  1. VB .NET \ ServerExplorer \ MyServer \ MyDateBase \ StoredProcedureСоздаю хранимую процедуру в которой задаю нужную мне SQL-инструкцию;
  2. Проект VB .Net \ - C помощю следующих инструкций заполняем обект DataSet11:

·         DataGrid1.DataSource = DataSet11.MyProcedure

·         SqlCommand1.Parameters.Item(0).Value = MyValue

·         SqlDataAdapter1.SelectCommand = SqlCommandCodeR

·         SqlDataAdapter1.Fill(DataSet11)

  1. Отображаем обект DateSet11 в DataGrid1;
  2. Теперь через DataGrid1 (посредством строк и столбцов) я извлекаю нужние мне даные.

 Ответить

  Ответы Всего ответов: 14  

Номер ответа: 1
Автор ответа:
 danser



ICQ: 299287824 

Вопросов: 76
Ответов: 209
 Профиль | | #1 Добавлено: 02.04.04 11:04

(продолжение)
Но моя схема \\процедура>DataSet>DataGrid>переменная\\ мягко говоря „тежелая” для ее цикличного использования. Мне нужна схема:  //процедура>переменная//
Я думаю нужно использовать не хранимые процедуры а функции (inline function или table-valued function или scalar-valued function). Какую именно незнаю так как с функциями не работал. Интуитивно чувствую что нужно использовать table-valued function но не знаю что где:

CREATE FUNCTION dbo.Function1

       (

/*

это я понял- параметри аналогично как в процедуре */

       /*

       @parameter1 datatype = default value,

       @parameter2 datatype

       */

       )

RETURNS

/*???*/

 

/* @table_variable TABLE (column1 datatype, column2 datatype) */

AS

       BEGIN

Номер ответа: 2
Автор ответа:
 danser



ICQ: 299287824 

Вопросов: 76
Ответов: 209
 Профиль | | #2 Добавлено: 02.04.04 11:07

(продолжение)

BEGIN

/*Тут наверное формируется SQL инструкция*/

             /* INSERT INTO @table_variable

                           sql select statement  */

             /* alternative sql statement or statements */

       RETURN

END

 

Если кто может розясните что к чему, буду оченб благодарен

Ответить

Номер ответа: 3
Автор ответа:
 ol2003



Вопросов: 3
Ответов: 122
 Профиль | | #3 Добавлено: 02.04.04 18:31
Не думаю, что это так уж тяжеловато использовать процедуру с параметрами в цикле. Передавай их значение через массив. Если же тебя интересует получеиние возврата из процедуры/функции, то это возможно и в процедуре. Ты можешь один из параметров указать с ключевым словом output. Что касается функций, то принипиальное отличие от процедуры - обязательно возвращает то или ное значение. Ты обязан указать datatype возвращаемого значения. (это там где у тебя вопросы). Ты не можешь использовать некоторые встроенные функции. Если установлен SQL Server, - почитай в SQL Books On Line статью "functions, user-defined" (CREATE FUNCTION), там есть список и примеры.

Ответить

Номер ответа: 4
Автор ответа:
 Alex3



ICQ: 9481061 

Вопросов: 18
Ответов: 132
 Профиль | | #4 Добавлено: 05.04.04 09:31

Что-то я не совсем понял, что ты хочешь, ну ладно...

1. Зачем для извлечения данных ты загоняешь DataSet в DataGrid, если данные можно брать прямо из DataSet? Как раз на этапе загрузки DataSet'а в DataGrid у тебя и будет основной тормоз.

2. Ты можешь организовать цикл непосредственно в хранимой процедуре и вернуть только то, чно тебе нужно. Смотри в Books Online "DECLARE CURSOR". (Курсоры, если ты не знаешь, это те же циклы).

Ответить

Номер ответа: 5
Автор ответа:
 danser



ICQ: 299287824 

Вопросов: 76
Ответов: 209
 Профиль | | #5 Добавлено: 21.04.04 05:22
 Да ты прав! Но для организации непосредственно  цикла нужно использовать не SQL, а TSQL(котрый имеет оператори управления)?  

Ответить

Номер ответа: 6
Автор ответа:
 danser



ICQ: 299287824 

Вопросов: 76
Ответов: 209
 Профиль | | #6 Добавлено: 21.04.04 05:23
Да ты прав! Но как я слышал для управления процедурой нужно использовать TSQL? 

Ответить

Номер ответа: 7
Автор ответа:
 danser



ICQ: 299287824 

Вопросов: 76
Ответов: 209
 Профиль | | #7 Добавлено: 21.04.04 05:24
Да ты прав! Но как я слышал для управления процедурой нужно использовать TSQL?

Ответить

Номер ответа: 8
Автор ответа:
 Alex3



ICQ: 9481061 

Вопросов: 18
Ответов: 132
 Профиль | | #8 Добавлено: 21.04.04 12:23

Ну, да TSQL. А тебе не пофигу как Microsoft называет реализацию SQL в MS SQL Server?

Ответить

Номер ответа: 9
Автор ответа:
 danser



ICQ: 299287824 

Вопросов: 76
Ответов: 209
 Профиль | | #9 Добавлено: 23.04.04 07:45

  если у меня есть некая процедура:

ALTER PROCEDURE dbo.CityPoCountry

@Country varchar(250)

AS

SELECT City, CodeZW

FROM ZW

WHERE (Country = @Country)

RETURN

она возвратит два столбика City, CodeZW, а как мне допустим получить(return) третье значения стобика CodeZW?

Ответить

Номер ответа: 10
Автор ответа:
 Иной



Вопросов: 19
Ответов: 50
 Профиль | | #10 Добавлено: 23.04.04 09:57

самый элементарный и надежный способ это в твоем запросе в разделе
WHERE однозначно идентифицировать нужную запись. К примеру, у тебя
есть идентификатор в твоей таблице (поле ID) и у третьей записи ID=3.
Тогда раздел Where тебе нужно переделать на:
WHERE Country = @Country AND ID=3

Ответить

Номер ответа: 11
Автор ответа:
 Alex3



ICQ: 9481061 

Вопросов: 18
Ответов: 132
 Профиль | | #11 Добавлено: 23.04.04 10:43

Результат выполнения хранимой процедуры пишешь в DataTable или DataSet, потмом:

ds.Tables(0).Rows(2)("CodeZW") или

tbl.Rows(2)("CodeZW")

Ответить

Номер ответа: 12
Автор ответа:
 Иной



Вопросов: 19
Ответов: 50
 Профиль | | #12 Добавлено: 23.04.04 10:53

2 Alex3
Если я правильно понял, речь не идет об ADO.Net. Речь о хранимых
процедурах, там есть только T-SQL.
Вообще, правильнее было бы процедуру оформить так:

create procedure CityPoCountry @Country varchar(250), @Result <тип>
output
as
begin
select @Result=CodeZW
from ZW
where Country=@Country and ID=3
end

Здесь ID взят из предыдущего примера, полагаю, его появление понятно?

Ответить

Номер ответа: 13
Автор ответа:
 Иной



Вопросов: 19
Ответов: 50
 Профиль | | #13 Добавлено: 23.04.04 11:07

2 Alex3
Нда, прошу прощения, так получилось, что я не сначала читал топик. Так
что вариант с DataSet верен. Но, имхо, возвращать нужный результат из
хранимой процедуры все таки лучше, т.к. это во многом влияет на
производительность.

Ответить

Номер ответа: 14
Автор ответа:
 danser



ICQ: 299287824 

Вопросов: 76
Ответов: 209
 Профиль | | #14 Добавлено: 23.04.04 23:23

 Я не понял что имелось под словом идентификатор(ID), это номер сроки в полученом запросе, или уникальний номер записи(ключ)- как я понял имелось ввиду последнее- если да то в этом и проблема: я ж и незнаю какие значения(записи) или ID будут выданы по моему запросу в этих двух столбиках.
Если заполнить хранимой процедурой обект DataSet то с DataSet как с таблицы можно что-то вибирать(по столбиках и строках),а мне надо решения (хранимая процедура или функция) которая возвращает одно значения не в DataSet а непосредственноt в определенную переменную что-то типа:
x=f(Arg), где: х-некоторое искомое значения, f() -механизм которий возвращает результат по аргументу(строка и столбик зафиксированы- например хранимая процедура для 1-й строки 2-го столбика), Arg-наш параметр;
или:
x=f(Arg,Row,Col) ,где х-некоторое искомое значения, f() -механизм которий возвращает результат по аргументу(строка и столбик - Row,Col),Arg-наш параметр.

 

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам