Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как передать имя таблицы в хранимую процедуру с курсором из VB / 21 сообщений из 21, страница 1 из 1
20.05.2013, 17:59
    #38264997
Ariess
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать имя таблицы в хранимую процедуру с курсором из VB
Есть програмка которая строит график пуляя в процедуру параметры. Проблема в том что если из двух копий программы запускать построение графика то ругается что временная таблица уже создана.

В процедуре перед запуском курсора приходится создавать таблицу через EXEC.

EXEC ('create table ##t (price float,shops varchar(50),time smalldatetime)')
Далее опять же через EXEC заполняю временную таблицу потому что не получилось передать строковую переменную в запрос IN

значение переменной выглядит так : 'Moscow','Tver' вб по моему добавляет толи кавычки толи еще что-то и запрос пустой получается. По этому пришлось делать через EXEC и туда вставлять (shops in ('+@shops+')) так оно работает.

Далее курсор должен бегать по временной табличке

DECLARE db_cursor CURSOR FOR
select price,shops,time from ##t order by time

Но как я уже писал выше при одновременном запуске из двух приложений он кричит что табличка ##t уже создана.
Если использоваться #t то после EXEC ее конечно не видно.

Курсор через EXEC я так понял работать не будет.



Помогите уже неделю бьюсь (((
...
Рейтинг: 0 / 0
20.05.2013, 18:04
    #38265010
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать имя таблицы в хранимую процедуру с курсором из VB
Код: sql
1.
EXEC ('if OBJECT_ID(''tempdb..##t'') is null create table ##t (price float,shops varchar(50),time smalldatetime)')
...
Рейтинг: 0 / 0
20.05.2013, 18:05
    #38265011
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать имя таблицы в хранимую процедуру с курсором из VB
что мешает делать рандомное имя у временной таблички?

черт побери, я даже делал рекурсивную процедуру с динамическими курсорами
...
Рейтинг: 0 / 0
20.05.2013, 18:08
    #38265014
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать имя таблицы в хранимую процедуру с курсором из VB
Ariess, правда как вы будете различать чьи данные обрабатывать при одновременном запуске из двух приложений?
...
Рейтинг: 0 / 0
20.05.2013, 18:13
    #38265023
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать имя таблицы в хранимую процедуру с курсором из VB
AriessЕсли использоваться #t то после EXEC ее конечно не видно.А еще я загонял в контекст exec всю логику, завязанную на временную таблицу, и в этой же самой ситуации спокойно юзал #t.
...
Рейтинг: 0 / 0
20.05.2013, 18:14
    #38265028
Ariess
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать имя таблицы в хранимую процедуру с курсором из VB
Antonariyчто мешает делать рандомное имя у временной таблички?

черт побери, я даже делал рекурсивную процедуру с динамическими курсорами

Как сделать рандомное имя ? )
...
Рейтинг: 0 / 0
20.05.2013, 18:16
    #38265031
Ariess
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать имя таблицы в хранимую процедуру с курсором из VB
skyANA
Код: sql
1.
EXEC ('if OBJECT_ID(''tempdb..##t'') is null create table ##t (price float,shops varchar(50),time smalldatetime)')



Этот вариант рассматривал но как потом подсунуть курсору нужное имя таблички ?
...
Рейтинг: 0 / 0
20.05.2013, 18:19
    #38265037
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать имя таблицы в хранимую процедуру с курсором из VB
AriessAntonariyчто мешает делать рандомное имя у временной таблички?

черт побери, я даже делал рекурсивную процедуру с динамическими курсорами

Как сделать рандомное имя ? )
Код: sql
1.
select 't_' + substring(cast(NEWID() as varchar(36)),1,8)
...
Рейтинг: 0 / 0
20.05.2013, 18:23
    #38265048
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать имя таблицы в хранимую процедуру с курсором из VB
Ariess, ты точно уверен что тебе нужна глобальная временная таблица (##имя)? Попробуй использовать локальные временные таблицы (#имя) и тогда проблема отпадет т.к. эти таблицы будут теперь разными для разных сессий.
...
Рейтинг: 0 / 0
20.05.2013, 18:29
    #38265066
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать имя таблицы в хранимую процедуру с курсором из VB
Ariessкак потом подсунуть курсору нужное имя таблички ?Вот пример такой процедуры. Временной таблицы там нет, но принцип работы с ней такой же как с курсором.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
ALTER PROCEDURE [dbo].[mp_TreeRecalc]
@Table varchar(50),
@RefID int,
@Level int,
@LeftKey int OUTPUT,
@RightKey int OUTPUT,
@RecCount int OUTPUT
as
SET @Level = @Level + 1

DECLARE @Qry nvarchar(4000), @s varchar(20), @pk varchar(50)

select	top 1  @pk = c.column_name
from	INFORMATION_SCHEMA.KEY_COLUMN_USAGE c 
inner join INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS b on c.constraint_name = b.unique_constraint_name
where	c.table_name = @Table

select @s = cast(@RefID as varchar(20))

SET @Qry = '
DECLARE @' + @pk + ' int, @LeftKey int, @RightKey int, @Level int, @RK int, @RecCount int
SET @LeftKey = ' + cast(@LeftKey as varchar(10)) + '
SET @RightKey = ' + cast(@RightKey as varchar(10)) + '
SET @Level = ' + cast(@Level as varchar(10)) + '

DECLARE treecursor' + @s + ' CURSOR fast_forward FOR
SELECT ' + @pk + '
FROM  ' + @Table + ' 
WHERE (RefID = ' + @s + ')
ORDER BY LeftKey

OPEN treecursor' + @s + '

FETCH next FROM treecursor' + @s + ' INTO @' + @pk + '

WHILE @@FETCH_STATUS = 0 BEGIN
	SET @LeftKey = @RightKey + 1
	SET @RightKey = @LeftKey + 1

	UPDATE ' + @Table + '
	SET [Level] = @Level, LeftKey = @LeftKey
	WHERE (' + @pk + ' = @' + @pk + ')
	SET @RK = @RightKey - 1
	EXEC mp_TreeRecalc ''' + @Table + ''', @' + @pk + ', @Level, @LeftKey out, @RK out, @RecCount out
	IF (@RK = @RightKey - 1) 
		SET @RightKey = @RK + 1 
	ELSE 
		SET @RightKey = @RK 
	UPDATE ' + @Table + '
	SET RightKey = @RightKey, ChildCount = @RecCount
	WHERE (' + @pk + ' = @' + @pk + ')
	FETCH next FROM treecursor' + @s + ' INTO @' + @pk + '
END

CLOSE treecursor' + @s + '
DEALLOCATE treecursor' + @s 
EXEC (@Qry)

set @Qry = 'SELECT @RecCount = COUNT(' + @pk + ') FROM ' + @Table + ' WHERE RefID = ' + cast(@RefID as varchar(50))
exec sp_executesql @Qry, N'@RecCount int out', @RecCount = @RecCount out

IF @RecCount > 0 BEGIN
	set @Qry = 'SELECT @LeftKey = MAX(LeftKey) + 1, @RightKey = MAX(RightKey) + 1
		FROM ' + @Table +  ' WHERE RefID = ' + cast(@RefID as varchar(50))
	--print @Qry
	exec sp_executesql @Qry, N'@LeftKey int out, @RightKey int out', 
		@LeftKey = @LeftKey out, @RightKey = @RightKey out

END

...
Рейтинг: 0 / 0
20.05.2013, 19:09
    #38265131
Ariess
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать имя таблицы в хранимую процедуру с курсором из VB
bazileAriess, ты точно уверен что тебе нужна глобальная временная таблица (##имя)? Попробуй использовать локальные временные таблицы (#имя) и тогда проблема отпадет т.к. эти таблицы будут теперь разными для разных сессий.

Да уверен я же создаю и заполняю времянку через EXEC следовательно ниже курсор уже не увидит ее
...
Рейтинг: 0 / 0
20.05.2013, 19:09
    #38265134
Ariess
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать имя таблицы в хранимую процедуру с курсором из VB
AntonariyAriessпропущено...


Как сделать рандомное имя ? )
Код: sql
1.
select 't_' + substring(cast(NEWID() as varchar(36)),1,8)



буду пробовать спс
...
Рейтинг: 0 / 0
20.05.2013, 19:20
    #38265145
Ariess
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать имя таблицы в хранимую процедуру с курсором из VB
AntonariyAriessкак потом подсунуть курсору нужное имя таблички ?Вот пример такой процедуры. Временной таблицы там нет, но принцип работы с ней такой же как с курсором.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
ALTER PROCEDURE [dbo].[mp_TreeRecalc]
@Table varchar(50),
@RefID int,
@Level int,
@LeftKey int OUTPUT,
@RightKey int OUTPUT,
@RecCount int OUTPUT
as
SET @Level = @Level + 1

DECLARE @Qry nvarchar(4000), @s varchar(20), @pk varchar(50)

select	top 1  @pk = c.column_name
from	INFORMATION_SCHEMA.KEY_COLUMN_USAGE c 
inner join INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS b on c.constraint_name = b.unique_constraint_name
where	c.table_name = @Table

select @s = cast(@RefID as varchar(20))

SET @Qry = '
DECLARE @' + @pk + ' int, @LeftKey int, @RightKey int, @Level int, @RK int, @RecCount int
SET @LeftKey = ' + cast(@LeftKey as varchar(10)) + '
SET @RightKey = ' + cast(@RightKey as varchar(10)) + '
SET @Level = ' + cast(@Level as varchar(10)) + '

DECLARE treecursor' + @s + ' CURSOR fast_forward FOR
SELECT ' + @pk + '
FROM  ' + @Table + ' 
WHERE (RefID = ' + @s + ')
ORDER BY LeftKey

OPEN treecursor' + @s + '

FETCH next FROM treecursor' + @s + ' INTO @' + @pk + '

WHILE @@FETCH_STATUS = 0 BEGIN
	SET @LeftKey = @RightKey + 1
	SET @RightKey = @LeftKey + 1

	UPDATE ' + @Table + '
	SET [Level] = @Level, LeftKey = @LeftKey
	WHERE (' + @pk + ' = @' + @pk + ')
	SET @RK = @RightKey - 1
	EXEC mp_TreeRecalc ''' + @Table + ''', @' + @pk + ', @Level, @LeftKey out, @RK out, @RecCount out
	IF (@RK = @RightKey - 1) 
		SET @RightKey = @RK + 1 
	ELSE 
		SET @RightKey = @RK 
	UPDATE ' + @Table + '
	SET RightKey = @RightKey, ChildCount = @RecCount
	WHERE (' + @pk + ' = @' + @pk + ')
	FETCH next FROM treecursor' + @s + ' INTO @' + @pk + '
END

CLOSE treecursor' + @s + '
DEALLOCATE treecursor' + @s 
EXEC (@Qry)

set @Qry = 'SELECT @RecCount = COUNT(' + @pk + ') FROM ' + @Table + ' WHERE RefID = ' + cast(@RefID as varchar(50))
exec sp_executesql @Qry, N'@RecCount int out', @RecCount = @RecCount out

IF @RecCount > 0 BEGIN
	set @Qry = 'SELECT @LeftKey = MAX(LeftKey) + 1, @RightKey = MAX(RightKey) + 1
		FROM ' + @Table +  ' WHERE RefID = ' + cast(@RefID as varchar(50))
	--print @Qry
	exec sp_executesql @Qry, N'@LeftKey int out, @RightKey int out', 
		@LeftKey = @LeftKey out, @RightKey = @RightKey out

END




Смысл уловил интересный вариант
...
Рейтинг: 0 / 0
21.05.2013, 05:36
    #38265458
Barkan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать имя таблицы в хранимую процедуру с курсором из VB
Ariess,

А если пойти от противного?
Зачем вообще создавать в базе временные таблицы, дёргать процедуры?
Для построения графика, по моему, этого и не надо. Или я совсем Вас не понял!
...
Рейтинг: 0 / 0
21.05.2013, 09:54
    #38265586
Ariess
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать имя таблицы в хранимую процедуру с курсором из VB
BarkanAriess,

А если пойти от противного?
Зачем вообще создавать в базе временные таблицы, дёргать процедуры?
Для построения графика, по моему, этого и не надо. Или я совсем Вас не понял!
Чтоб нарисовать график нужны данные не так ли ?
Чтобы получить данные приходится делать запрос из запроса во времянку по которой курсор делает расчет. А на прямую запрос подключить к курсору немогу потому что передаю из VB длинную строковую переменную для IN из за этого пришлось все делать через EXEC. Отсуда и весь гемор собственно
...
Рейтинг: 0 / 0
21.05.2013, 10:02
    #38265608
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать имя таблицы в хранимую процедуру с курсором из VB
AriessНо как я уже писал выше при одновременном запуске из двух приложений он кричит что табличка ##t уже создана.

учите оракл
глобалтемпораритэйбл вас спасёт
...
Рейтинг: 0 / 0
21.05.2013, 10:20
    #38265664
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать имя таблицы в хранимую процедуру с курсором из VB
pationAriessНо как я уже писал выше при одновременном запуске из двух приложений он кричит что табличка ##t уже создана.

учите оракл
глобалтемпораритэйбл вас спасёторакл не нужен.
## и есть глобал темпорари, а # — локал темпорари.
...
Рейтинг: 0 / 0
21.05.2013, 10:24
    #38265675
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать имя таблицы в хранимую процедуру с курсором из VB
AriessА на прямую запрос подключить к курсору немогу потому что передаю из VB длинную строковую переменную для IN из за этого пришлось все делать через EXEC.Даже по описанию похоже на говнокод. Можете показать текст процедуры? Ее наверняка можно переписать красиво.
...
Рейтинг: 0 / 0
21.05.2013, 10:30
    #38265691
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать имя таблицы в хранимую процедуру с курсором из VB
AriessА на прямую запрос подключить к курсору немогу потому что передаю из VB длинную строковую переменную для IN из за этого пришлось все делать через EXEC. Отсуда и весь гемор собственноСтроковую переменную можно распарсить в табличку. А можно передать в процедуру не строку а Table-Valued параметр, или XML.

Версия SQL Server какая?
...
Рейтинг: 0 / 0
21.05.2013, 11:32
    #38265808
Ariess
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать имя таблицы в хранимую процедуру с курсором из VB
2005
...
Рейтинг: 0 / 0
21.05.2013, 14:05
    #38266326
Ariess
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать имя таблицы в хранимую процедуру с курсором из VB
AriessAntonariyпропущено...
Вот пример такой процедуры. Временной таблицы там нет, но принцип работы с ней такой же как с курсором.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
ALTER PROCEDURE [dbo].[mp_TreeRecalc]
@Table varchar(50),
@RefID int,
@Level int,
@LeftKey int OUTPUT,
@RightKey int OUTPUT,
@RecCount int OUTPUT
as
SET @Level = @Level + 1

DECLARE @Qry nvarchar(4000), @s varchar(20), @pk varchar(50)

select	top 1  @pk = c.column_name
from	INFORMATION_SCHEMA.KEY_COLUMN_USAGE c 
inner join INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS b on c.constraint_name = b.unique_constraint_name
where	c.table_name = @Table

select @s = cast(@RefID as varchar(20))

SET @Qry = '
DECLARE @' + @pk + ' int, @LeftKey int, @RightKey int, @Level int, @RK int, @RecCount int
SET @LeftKey = ' + cast(@LeftKey as varchar(10)) + '
SET @RightKey = ' + cast(@RightKey as varchar(10)) + '
SET @Level = ' + cast(@Level as varchar(10)) + '

DECLARE treecursor' + @s + ' CURSOR fast_forward FOR
SELECT ' + @pk + '
FROM  ' + @Table + ' 
WHERE (RefID = ' + @s + ')
ORDER BY LeftKey

OPEN treecursor' + @s + '

FETCH next FROM treecursor' + @s + ' INTO @' + @pk + '

WHILE @@FETCH_STATUS = 0 BEGIN
	SET @LeftKey = @RightKey + 1
	SET @RightKey = @LeftKey + 1

	UPDATE ' + @Table + '
	SET [Level] = @Level, LeftKey = @LeftKey
	WHERE (' + @pk + ' = @' + @pk + ')
	SET @RK = @RightKey - 1
	EXEC mp_TreeRecalc ''' + @Table + ''', @' + @pk + ', @Level, @LeftKey out, @RK out, @RecCount out
	IF (@RK = @RightKey - 1) 
		SET @RightKey = @RK + 1 
	ELSE 
		SET @RightKey = @RK 
	UPDATE ' + @Table + '
	SET RightKey = @RightKey, ChildCount = @RecCount
	WHERE (' + @pk + ' = @' + @pk + ')
	FETCH next FROM treecursor' + @s + ' INTO @' + @pk + '
END

CLOSE treecursor' + @s + '
DEALLOCATE treecursor' + @s 
EXEC (@Qry)

set @Qry = 'SELECT @RecCount = COUNT(' + @pk + ') FROM ' + @Table + ' WHERE RefID = ' + cast(@RefID as varchar(50))
exec sp_executesql @Qry, N'@RecCount int out', @RecCount = @RecCount out

IF @RecCount > 0 BEGIN
	set @Qry = 'SELECT @LeftKey = MAX(LeftKey) + 1, @RightKey = MAX(RightKey) + 1
		FROM ' + @Table +  ' WHERE RefID = ' + cast(@RefID as varchar(50))
	--print @Qry
	exec sp_executesql @Qry, N'@LeftKey int out, @RightKey int out', 
		@LeftKey = @LeftKey out, @RightKey = @RightKey out

END




Смысл уловил интересный вариант


Даааа нагнул таки. Спасибо за дельный совет. И всем спасибо за внимание )
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как передать имя таблицы в хранимую процедуру с курсором из VB / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]