0 / 0 / 0
Регистрация: 02.03.2011
Сообщений: 51
1

Передача типа DataTable в качестве параметра в хранимой процедуры

27.08.2012, 22:48. Показов 4773. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго вечера. Прощу Вашей помощи. Проблема следующая: есть множество таблиц в базе данных, у таблиц есть 5 одинаковых полей, которые и нужно выбрать. Нужно создать хранимую процедуру, которая и будет выбирать эти поля из таблиц. Название таблицы изначально не известно, пользователь сам выбирает из списка таблицу, которую в последствии программа должна передать хранимой процедуре. Прелапатил уже кучу сайтов и форумов, но так и не нашёл нужного ответа. Помогите пожалуйста оч надо. Заранее огромное спс
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.08.2012, 22:48
Ответы с готовыми решениями:

Передача массива в Oracle в качестве входного параметра хранимой процедуры
Доброго времени суток. В Oracle (8i) у меня есть пакет (MyPackage) с процедурой procedure...

Передача типа Record в процедуру в качестве параметра процедуры
Вот такой код не работает: TGraph = Record Graf_Flag : boolean; Priyom_Flag :...

Delphi Fortran DLL передача процедуры в качестве параметра
Уважаемые Гуру, очень нужна Ваша помощь. Стоит задача переделать программу на Фортране в...

Не работает Command в качестве хранимой процедуры
Ne rabotaet Command v kachestve hranimoi prozeduri v VB6 & ADO & Access ... Dim cnn As New...

4
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
28.08.2012, 11:25 2
А база ваша или чья-то?
Просто если у нескольких таблиц одинаковая структура, то это наверное одна таблица должна быть с наследованием где нужно, нет?
Возможно, потому и решений не нашли, что при нормальной структуре базы такие костыли воротить не приходится.
0
0 / 0 / 0
Регистрация: 02.03.2011
Сообщений: 51
28.08.2012, 13:11  [ТС] 3
нет база не моя, но я тут в инете вычитал про динамический sql, но что то не получается:
вот хранимка
SQL
1
2
3
4
5
6
7
8
ALTER PROCEDURE WebRD_Admin_Double_Value_Check (@TABLE_NAME VARCHAR(MAX), @WHERE VARCHAR(MAX)) 
AS
BEGIN
    SET NOCOUNT ON
    DECLARE @SQL VARCHAR(MAX)
    SET @SQL = 'select idnum, object_id, sap_no, description, sub_system_id from ' + @TABLE_NAME + 'where' + @WHERE + 'order by sap_no'
    EXEC(@SQL)
END
но как её вызвать что бы можно было передать параметры и получить результат выборки, написал часть кода но что то опять не так

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using (SqlConnection sql_con = new SqlConnection())
                    {
                        SqlParameter param1 = new SqlParameter("@table_name", SqlDbType.VarChar);
                        SqlParameter param2 = new SqlParameter("@where", SqlDbType.VarChar);
                        param1.Value = buf_table1.TableName;
                        param2.Value = "suspended_rec='0'";
 
                        SqlCommand command = new SqlCommand("WebRD_Admin_Double_Value_Check", sql_con);
                        command.CommandType = CommandType.StoredProcedure;
                        command.Parameters.Add(param1);
                        command.Parameters.Add(param2);
 
                        try
                        {
                            sql_con.Open();
                            int rowsAffected = command.ExecuteNonQuery();
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show("Process failed: " + ex.Message, "Fatal error", MessageBoxButtons.OK);
                        }
                    }
Добавлено через 3 минуты
посмотреть структуру базы данных увы не могу, так как обращаюсь к таблицам базы исключительно через функции написаные ранее другими разработчиками расположенными в dll, база находится на сервере, я работаю с ней удалённо через эти функции.

Добавлено через 1 час 2 минуты
вот ещё написал один вариант, но как получить результат не знаю:
SQL
1
2
3
4
5
6
ALTER PROCEDURE WebRD_Admin_Double_Value_Check (@SQL VARCHAR(MAX)) 
AS
BEGIN
    SET NOCOUNT ON
    EXEC(@SQL)
END
Добавлено через 1 минуту
где в sql есть запрос
C#
1
sql_query = "select idnum, object_id, sap_no, description, sub_system_id from " + db_name.ToString() + " where suspended_rec='0' order by sap_no"
Добавлено через 1 минуту
где db_name.ToString() - название таблици
0
136 / 136 / 46
Регистрация: 21.04.2009
Сообщений: 178
28.08.2012, 14:16 4
Такой должна быть хранимая процедура
SQL
1
2
3
4
5
6
7
8
CREATE PROCEDURE PROC001
@TBL_NAME NVARCHAR(MAX),
@WHERE_CLAUSE NVARCHAR(MAX)
AS
EXEC(N'SELECT idnum, object_id, sap_no, description, sub_system_id' + 
       ' FROM ''' + @TBL_NAME + '''' +
       ' WHERE ''' + @WHERE_CLAUSE + '''' +
       ' ORDER BY sap_no')
Так ее можно вызвать:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            DataTable dt = new DataTable()
            SqlConnection con = new SqlConnection(constr);
            SqlCommand cmd = new SqlCommand("PROC001", con);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@TBL_NAME", SqlDbType.NVarChar));
            cmd.Parameters.Add(new SqlParameter("@WHERE_CLAUSE", SqlDbType.NVarChar));
            //Здесь нужно быть уверенным, что такая таблица существует
            //а еще лучше передавать этот параметр как [ИМЯ БАЗЫ].[dbo].[ИМЯ ТАБЛИЦЫ]
            cmd.Parameters["@TBL_NAME"].Value = buf_table1.TableName;
            //Не уверен, что это одинарные кавычки не помешают -> '0' 
            cmd.Parameters["@WHERE_CLAUSE"].Value = "suspended_rec='0'";
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            con.Open();
            da.Fill(dt);
            con.Close();
А может даже лучше разделить параметр @WHERE_CLAUSE на несколько
@FIELD_NAME - имя поля
@FIELD_VALUE - значение
и посылать в хранимку без одинарных кавычек, просто как string.

P.S. При написании динамических запросов, нужно быть очень внимательным с кавычками, пробелами и.д. так как визуально очень легко ошибиться. И перед тем как EXEC(...) лучше выполнить PRINT(...) и посмотреть внимательно на всю строку запроса. Например в вашей первой хранимке я заметил, что перед и после условия where нет пробелов
SQL
1
SET @SQL = 'select idnum, object_id, sap_no, description, sub_system_id from ' + @TABLE_NAME + 'where' + @WHERE + 'order by sap_no'
1
0 / 0 / 0
Регистрация: 02.03.2011
Сообщений: 51
28.08.2012, 14:56  [ТС] 5
спс огромное очень помогли
0
28.08.2012, 14:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2012, 14:56
Помогаю со студенческими работами здесь

Использование имени процедуры в качестве параметра другой процедуры
Предложите, пожалуйста, пример решения след. задачи с использованием вышеуказанного условия: ...

Использование имени процедуры в качестве параметра другой процедуры
Составить программу по заданному условию.Первая часть условия является заданием на разработку...

Использование имени процедуры в качестве параметра другой процедуры
Help! Для массива С из n элементов составить процедуру, которая находит значения m наименьших его...

Использование имени процедуры в качестве параметра другой процедуры
Составить программу по заданному условию. Первая часть условия является заданием на разработку...

Использование имени процедуры в качестве параметра другой процедуры
Составить программу по заданному условию. Первая часть условия является заданием на разработку...

Использование имени процедуры в качестве параметра другой процедуры
Для заданного массива В составить процедуру, определяющую отрезок, на который попадают заданного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru