Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / ХП с параметром имя таблицы / 17 сообщений из 17, страница 1 из 1
24.07.2013, 12:45
    #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
24.07.2013, 12:48
    #38341951
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ХП с параметром имя таблицы
bamper78как корректно это сделать ?
Прочитать FAQ
...
Рейтинг: 0 / 0
24.07.2013, 13:39
    #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
24.07.2013, 13:42
    #38342068
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ХП с параметром имя таблицы
bamper78Сделал в соответствиис FAQ
Да что вы говорите. Вы наверное использовали FAQ какого то другого ресурса, а не местный
...
Рейтинг: 0 / 0
24.07.2013, 14:05
    #38342117
Гость333
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ХП с параметром имя таблицы
...
Рейтинг: 0 / 0
24.07.2013, 14:08
    #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
24.07.2013, 14:25
    #38342158
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ХП с параметром имя таблицы
bamper78,

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


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

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


а здесь вообще бред NULL ведь в переменной
...
Рейтинг: 0 / 0
24.07.2013, 15:03
    #38342251
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ХП с параметром имя таблицы
bamper78Если не трудно, укажите, где я делаю ошибку
Не можете прочитать и использовать пример
...
Рейтинг: 0 / 0
24.07.2013, 18:46
    #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
24.07.2013, 18:51
    #38342763
Гость333
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ХП с параметром имя таблицы
bamper78
Код: sql
1.
EXEC @SQL


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

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

писать
Код: sql
1.
2.
insert @tab(список полей)
exec ('select ...');
...
Рейтинг: 0 / 0
24.07.2013, 19:12
    #38342786
bamper78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ХП с параметром имя таблицы
Гость333,
Поравил, теперь ошибка -
Сообщение 1087, уровень 15, состояние 2, строка 1
Необходимо объявить табличную переменную "@TAB".
...
Рейтинг: 0 / 0
24.07.2013, 19:28
    #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
24.07.2013, 20:30
    #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
24.07.2013, 20:32
    #38342859
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ХП с параметром имя таблицы
bamper78,

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


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