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

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

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

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

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



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

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

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

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


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



буду пробовать спс
...
Рейтинг: 0 / 0
Как передать имя таблицы в хранимую процедуру с курсором из VB
    #38265145
Ariess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как передать имя таблицы в хранимую процедуру с курсором из VB
    #38265458
Barkan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariess,

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

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

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

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

Версия SQL Server какая?
...
Рейтинг: 0 / 0
Как передать имя таблицы в хранимую процедуру с курсором из VB
    #38265808
Ariess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2005
...
Рейтинг: 0 / 0
Как передать имя таблицы в хранимую процедуру с курсором из VB
    #38266326
Ariess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
21 сообщений из 21, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как передать имя таблицы в хранимую процедуру с курсором из VB
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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