powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / ХП с параметром имя таблицы
17 сообщений из 17, страница 1 из 1
ХП с параметром имя таблицы
    #38341944
bamper78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Друзья, подскажите как правильно реализовать ХП с параметром имя таблици. Рекомендации только создавать табличную переменную. Пытаюсь реализовать...
Код: 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.
CREATE PROCEDURE left_Right_Top_Bottom  @TableName varchar (100)
AS
BEGIN 

DECLARE @Table varchar (100)
--SET @Table = ???
EXECUTE('SELECT * FROM'+ @TableName)

DECLARE @bindata VARBINARY(8000), @r_left FLOAT, @r_top FLOAT, @r_right FLOAT, @r_bottom FLOAT
DECLARE @wkt VARCHAR(1000)
DECLARE @wkb VARBINARY(8000), @geom_type TINYINT, @left FLOAT, @top FLOAT, @right FLOAT, @bottom FLOAT

DECLARE MyCursor CURSOR 
   FOR SELECT [Geometry], [Left], [Right], [Top], [Bottom] FROM @TableName
   FOR UPDATE OF [Left], [Right], [Top], [Bottom]

OPEN MyCursor
WHILE(1=1)BEGIN
   FETCH NEXT FROM MyCursor INTO @bindata, @r_left, @r_top, @r_right, @r_bottom
IF @@FETCH_STATUS != 0 BREAK;
   EXEC [master].dbo.xp_gb_get_wkt_from_binary 
      @bindata, 
      @wkt OUTPUT
   EXEC [master].dbo.xp_gb_get_binary_from_wktext 
      @wkt, 
      @wkb OUTPUT, @geom_type OUTPUT, @left OUTPUT, @top OUTPUT, @right OUTPUT, @bottom OUTPUT
   IF @left!=@r_left OR @top!=@r_top OR @right!=@r_right OR @bottom!=@r_bottom 
   BEGIN
      UPDATE @TableName
         SET [Left]=@left, [Right]=@right, [Top]=@top, [Bottom]=@bottom
         WHERE CURRENT OF MyCursor
   END
END
CLOSE MyCursor
DEALLOCATE MyCursor
--SELECT * FROM [dbo].[Test::L1]
END



как корректно это сделать ?
...
Рейтинг: 0 / 0
ХП с параметром имя таблицы
    #38341951
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bamper78как корректно это сделать ?
Прочитать FAQ
...
Рейтинг: 0 / 0
ХП с параметром имя таблицы
    #38342062
bamper78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glory,

Сделал в соответствиис FAQ

Код: 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.
CREATE PROCEDURE left_Right_Top_Bottom  @TableName varchar (100)
AS
BEGIN 

DECLARE @SQL varchar (100)
SET @SQL =  'select * from ' + @TableName
EXECUTE (@SQL)

DECLARE @bindata VARBINARY(8000), @r_left FLOAT, @r_top FLOAT, @r_right FLOAT, @r_bottom FLOAT
DECLARE @wkt VARCHAR(1000)
DECLARE @wkb VARBINARY(8000), @geom_type TINYINT, @left FLOAT, @top FLOAT, @right FLOAT, @bottom FLOAT

DECLARE MyCursor CURSOR 
   FOR SELECT [Geometry], [Left], [Right], [Top], [Bottom] FROM @TableName
   FOR UPDATE OF [Left], [Right], [Top], [Bottom]

OPEN MyCursor
WHILE(1=1)BEGIN
   FETCH NEXT FROM MyCursor INTO @bindata, @r_left, @r_top, @r_right, @r_bottom
IF @@FETCH_STATUS != 0 BREAK;
   EXEC [master].dbo.xp_gb_get_wkt_from_binary 
      @bindata, 
      @wkt OUTPUT
   EXEC [master].dbo.xp_gb_get_binary_from_wktext 
      @wkt, 
      @wkb OUTPUT, @geom_type OUTPUT, @left OUTPUT, @top OUTPUT, @right OUTPUT, @bottom OUTPUT
   IF @left!=@r_left OR @top!=@r_top OR @right!=@r_right OR @bottom!=@r_bottom 
   BEGIN
      UPDATE @SQL
         SET [Left]=@left, [Right]=@right, [Top]=@top, [Bottom]=@bottom
         WHERE CURRENT OF MyCursor
   END
END
CLOSE MyCursor
DEALLOCATE MyCursor
--SELECT * FROM [dbo].[Test::L1]
END



Ошибка - Необходимо объявить табличную переменную "@SQL".
Код: sql
1.
   FOR SELECT [Geometry], [Left], [Right], [Top], [Bottom] FROM @SQL
...
Рейтинг: 0 / 0
ХП с параметром имя таблицы
    #38342068
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bamper78Сделал в соответствиис FAQ
Да что вы говорите. Вы наверное использовали FAQ какого то другого ресурса, а не местный
...
Рейтинг: 0 / 0
ХП с параметром имя таблицы
    #38342117
Гость333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
ХП с параметром имя таблицы
    #38342119
bamper78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glory,

Если не трудно, укажите, где я делаю ошибку
Код: 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.
REATE PROCEDURE left_Right_Top_Bottom  @TableName varchar (100)
AS
BEGIN 

DECLARE @SQL varchar (100), @Table varchar(100)
SET @SQL =  ('select * from ' + @Table)
EXECUTE (@SQL)

DECLARE @bindata VARBINARY(8000), @r_left FLOAT, @r_top FLOAT, @r_right FLOAT, @r_bottom FLOAT
DECLARE @wkt VARCHAR(1000)
DECLARE @wkb VARBINARY(8000), @geom_type TINYINT, @left FLOAT, @top FLOAT, @right FLOAT, @bottom FLOAT

DECLARE MyCursor CURSOR 
   FOR SELECT [Geometry], [Left], [Right], [Top], [Bottom] FROM @SQL
   FOR UPDATE OF [Left], [Right], [Top], [Bottom]

OPEN MyCursor
WHILE(1=1)BEGIN
   FETCH NEXT FROM MyCursor INTO @bindata, @r_left, @r_top, @r_right, @r_bottom
IF @@FETCH_STATUS != 0 BREAK;
   EXEC [master].dbo.xp_gb_get_wkt_from_binary 
      @bindata, 
      @wkt OUTPUT
   EXEC [master].dbo.xp_gb_get_binary_from_wktext 
      @wkt, 
      @wkb OUTPUT, @geom_type OUTPUT, @left OUTPUT, @top OUTPUT, @right OUTPUT, @bottom OUTPUT
   IF @left!=@r_left OR @top!=@r_top OR @right!=@r_right OR @bottom!=@r_bottom 
   BEGIN
      UPDATE @SQL
         SET [Left]=@left, [Right]=@right, [Top]=@top, [Bottom]=@bottom
         WHERE CURRENT OF MyCursor
   END
END
CLOSE MyCursor
DEALLOCATE MyCursor
--SELECT * FROM [dbo].[Test::L1]
END



Ошибка та же
...
Рейтинг: 0 / 0
ХП с параметром имя таблицы
    #38342158
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bamper78,

Код: sql
1.
FOR SELECT [Geometry], [Left], [Right], [Top], [Bottom] FROM @SQL


здесь вы пытаетесь произвести выборку из скалярной переменной, а нужен объект табличного типа
...
Рейтинг: 0 / 0
ХП с параметром имя таблицы
    #38342169
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а это вообще тут зачем?

Код: sql
1.
2.
3.
DECLARE @SQL varchar (100), @Table varchar(100)
SET @SQL =  ('select * from ' + @Table)
EXECUTE (@SQL)
...
Рейтинг: 0 / 0
ХП с параметром имя таблицы
    #38342173
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
DECLARE @SQL varchar (100), @Table varchar(100)
SET @SQL =  ('select * from ' + @Table)


а здесь вообще бред NULL ведь в переменной
...
Рейтинг: 0 / 0
ХП с параметром имя таблицы
    #38342251
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bamper78Если не трудно, укажите, где я делаю ошибку
Не можете прочитать и использовать пример
...
Рейтинг: 0 / 0
ХП с параметром имя таблицы
    #38342752
bamper78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glory,

Код: 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.
CREATE PROCEDURE left_Right_Top_Bottom @TableName varchar(100)
AS
BEGIN 

DECLARE 
@SQL NVARCHAR(100)
DECLARE @TAB TABLE ([x_2] float,[x_3] float,[x_4] float,[x_5] float,[x_8] image)

SET @SQL = N'INSERT INTO @TAB SELECT [x_2],[x_3],[x_4],[x_5],[x_8] FROM ' + @TableName
 
EXEC @SQL

DECLARE @bindata VARBINARY(8000), @r_x_2 FLOAT, @r_x_4 FLOAT, @r_x_3 FLOAT, @r_x_5 FLOAT
DECLARE @wkt VARCHAR(1000)
DECLARE @wkb VARBINARY(8000), @geom_type TINYINT, @x_2 FLOAT, @x_4 FLOAT, @x_3 FLOAT, @x_5 FLOAT

DECLARE MyCursor CURSOR 
   FOR SELECT [x_8], [x_2], [x_3], [x_4], [x_5] FROM @TAB
   FOR UPDATE OF [x_2], [x_3], [x_4], [x_5]

OPEN MyCursor
WHILE(1=1)BEGIN
   FETCH NEXT FROM MyCursor INTO @bindata, @r_x_2, @r_x_4, @r_x_3, @r_x_5
IF @@FETCH_STATUS != 0 BREAK;
   EXEC [master].dbo.xp_gb_get_wkt_from_binary 
      @bindata, 
      @wkt OUTPUT
   EXEC [master].dbo.xp_gb_get_binary_from_wktext 
      @wkt, 
      @wkb OUTPUT, @geom_type OUTPUT, @x_2 OUTPUT, @x_4 OUTPUT, @x_3 OUTPUT, @x_5 OUTPUT
   IF @x_2!=@r_x_2 OR @x_4!=@r_x_4 OR @x_3!=@r_x_3 OR @x_5!=@r_x_5 
   BEGIN
      UPDATE @TAB
         SET [x_2]=@x_2, [x_3]=@x_3, [x_4]=@x_4, [x_5]=@x_5
         WHERE CURRENT OF MyCursor
   END
END
CLOSE MyCursor
DEALLOCATE MyCursor
END



Процедура создается, но при выполнении : EXECUTE left_Right_Top_Bottom @TableName = [Layer_324]
Ошибка - Сообщение 203, уровень 16, состояние 2, процедура left_Right_Top_Bottom, строка 11
Имя "INSERT INTO @TAB SELECT [x_2],[x_3],[x_4],[x_5],[x_8] FROM Layer_324" не является допустимым идентификатором.
...
Рейтинг: 0 / 0
ХП с параметром имя таблицы
    #38342763
Гость333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bamper78
Код: sql
1.
EXEC @SQL


Этим вы пытаетесь выполнить хранимую процедуру, имя которой содержится в переменной @SQL.
Чтобы выполнить SQL-выражение, хранящееся в переменной, нужно использовать скобки:
Код: sql
1.
EXEC (@SQL)
...
Рейтинг: 0 / 0
ХП с параметром имя таблицы
    #38342781
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bamper78,

потом ещё обнаружите, что внутри вашего динамического запроса не видно переменную @tab
поэтому надо вместо
Код: sql
1.
exec ('insert @tab select ...')

писать
Код: sql
1.
2.
insert @tab(список полей)
exec ('select ...');
...
Рейтинг: 0 / 0
ХП с параметром имя таблицы
    #38342786
bamper78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость333,
Поравил, теперь ошибка -
Сообщение 1087, уровень 15, состояние 2, строка 1
Необходимо объявить табличную переменную "@TAB".
...
Рейтинг: 0 / 0
ХП с параметром имя таблицы
    #38342794
bamper78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bamper78,

Вот так ?

Код: sql
1.
2.
3.
4.
5.
6.
7.
DECLARE 
@SQL NVARCHAR(100)
DECLARE @TAB TABLE ([x_2] float,[x_3] float,[x_4] float,[x_5] float,[x_8] image)

SET @SQL = N'INSERT INTO @TAB SELECT [x_2],[x_3],[x_4],[x_5],[x_8] FROM ' + @TableName
insert @tab([x_2],[x_3],[x_4],[x_5],[x_8]) 
EXEC (@SQL)
...
Рейтинг: 0 / 0
ХП с параметром имя таблицы
    #38342854
bamper78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bamper78,

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

Код: 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.
CREATE PROCEDURE left_Right_Top_Bottom @TableName varchar(100)
AS
BEGIN 

DECLARE 
@SQL NVARCHAR(max)

SELECT @SQL = N'
DECLARE @bindata VARBINARY(8000), @r_x_2 FLOAT, @r_x_4 FLOAT, @r_x_3 FLOAT, @r_x_5 FLOAT
DECLARE @wkt VARCHAR(1000)
DECLARE @wkb VARBINARY(8000), @geom_type TINYINT, @x_2 FLOAT, @x_4 FLOAT, @x_3 FLOAT, @x_5 FLOAT

DECLARE MyCursor CURSOR 
   FOR SELECT [x_8], [x_2], [x_3], [x_4], [x_5] FROM ' + @TableName + N'
   FOR UPDATE OF [x_2], [x_3], [x_4], [x_5]

OPEN MyCursor
WHILE(1=1)BEGIN
   FETCH NEXT FROM MyCursor INTO @bindata, @r_x_2, @r_x_4, @r_x_3, @r_x_5
IF @@FETCH_STATUS != 0 BREAK;
   EXEC [master].dbo.xp_gb_get_wkt_from_binary 
      @bindata, 
      @wkt OUTPUT
   EXEC [master].dbo.xp_gb_get_binary_from_wktext 
      @wkt, 
      @wkb OUTPUT, @geom_type OUTPUT, @x_2 OUTPUT, @x_4 OUTPUT, @x_3 OUTPUT, @x_5 OUTPUT
   IF @x_2!=@r_x_2 OR @x_4!=@r_x_4 OR @x_3!=@r_x_3 OR @x_5!=@r_x_5 
   BEGIN
      UPDATE ' + @TableName + N'
         SET [x_2]=@x_2, [x_3]=@x_3, [x_4]=@x_4, [x_5]=@x_5
         WHERE CURRENT OF MyCursor
   END
END
CLOSE MyCursor
DEALLOCATE MyCursor '

EXEC SP_EXECUTESQL @SQL
END
...
Рейтинг: 0 / 0
ХП с параметром имя таблицы
    #38342859
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bamper78,

эта пять баллов!!
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / ХП с параметром имя таблицы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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