Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 ХП с параметром имя таблицы  [new]
bamper78
Member

Откуда:
Сообщений: 122
Друзья, подскажите как правильно реализовать ХП с параметром имя таблици. Рекомендации только создавать табличную переменную. Пытаюсь реализовать...
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


как корректно это сделать ?
24 июл 13, 12:45    [14609748]     Ответить | Цитировать Сообщить модератору
 Re: ХП с параметром имя таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
bamper78
как корректно это сделать ?

Прочитать FAQ
24 июл 13, 12:48    [14609768]     Ответить | Цитировать Сообщить модератору
 Re: ХП с параметром имя таблицы  [new]
bamper78
Member

Откуда:
Сообщений: 122
Glory,

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

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".
   FOR SELECT [Geometry], [Left], [Right], [Top], [Bottom] FROM @SQL
24 июл 13, 13:39    [14610184]     Ответить | Цитировать Сообщить модератору
 Re: ХП с параметром имя таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
bamper78
Сделал в соответствиис FAQ

Да что вы говорите. Вы наверное использовали FAQ какого то другого ресурса, а не местный
24 июл 13, 13:42    [14610198]     Ответить | Цитировать Сообщить модератору
 Re: ХП с параметром имя таблицы  [new]
Гость333
Member

Откуда:
Сообщений: 3683
bamper78,

Вот вам ссылка на FAQ: Динамический запрос или "переменная @Tablename"
24 июл 13, 14:05    [14610398]     Ответить | Цитировать Сообщить модератору
 Re: ХП с параметром имя таблицы  [new]
bamper78
Member

Откуда:
Сообщений: 122
Glory,

Если не трудно, укажите, где я делаю ошибку
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


Ошибка та же
24 июл 13, 14:08    [14610428]     Ответить | Цитировать Сообщить модератору
 Re: ХП с параметром имя таблицы  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
bamper78,

FOR SELECT [Geometry], [Left], [Right], [Top], [Bottom] FROM @SQL

здесь вы пытаетесь произвести выборку из скалярной переменной, а нужен объект табличного типа
24 июл 13, 14:25    [14610600]     Ответить | Цитировать Сообщить модератору
 Re: ХП с параметром имя таблицы  [new]
Konst_One
Member

Откуда:
Сообщений: 11680
а это вообще тут зачем?

DECLARE @SQL varchar (100), @Table varchar(100)
SET @SQL =  ('select * from ' + @Table)
EXECUTE (@SQL)
24 июл 13, 14:30    [14610654]     Ответить | Цитировать Сообщить модератору
 Re: ХП с параметром имя таблицы  [new]
Konst_One
Member

Откуда:
Сообщений: 11680
DECLARE @SQL varchar (100), @Table varchar(100)
SET @SQL =  ('select * from ' + @Table)

а здесь вообще бред NULL ведь в переменной
24 июл 13, 14:31    [14610666]     Ответить | Цитировать Сообщить модератору
 Re: ХП с параметром имя таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
bamper78
Если не трудно, укажите, где я делаю ошибку

Не можете прочитать и использовать пример
24 июл 13, 15:03    [14611009]     Ответить | Цитировать Сообщить модератору
 Re: ХП с параметром имя таблицы  [new]
bamper78
Member

Откуда:
Сообщений: 122
Glory,

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" не является допустимым идентификатором.
24 июл 13, 18:46    [14612832]     Ответить | Цитировать Сообщить модератору
 Re: ХП с параметром имя таблицы  [new]
Гость333
Member

Откуда:
Сообщений: 3683
bamper78
EXEC @SQL

Этим вы пытаетесь выполнить хранимую процедуру, имя которой содержится в переменной @SQL.
Чтобы выполнить SQL-выражение, хранящееся в переменной, нужно использовать скобки:
EXEC (@SQL)
24 июл 13, 18:51    [14612860]     Ответить | Цитировать Сообщить модератору
 Re: ХП с параметром имя таблицы  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
bamper78,

потом ещё обнаружите, что внутри вашего динамического запроса не видно переменную @tab
поэтому надо вместо
exec ('insert @tab select ...')
писать
insert @tab(список полей)
exec ('select ...');
24 июл 13, 19:09    [14612942]     Ответить | Цитировать Сообщить модератору
 Re: ХП с параметром имя таблицы  [new]
bamper78
Member

Откуда:
Сообщений: 122
Гость333,
Поравил, теперь ошибка -
Сообщение 1087, уровень 15, состояние 2, строка 1
Необходимо объявить табличную переменную "@TAB".
24 июл 13, 19:12    [14612959]     Ответить | Цитировать Сообщить модератору
 Re: ХП с параметром имя таблицы  [new]
bamper78
Member

Откуда:
Сообщений: 122
bamper78,

Вот так ?

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)
24 июл 13, 19:28    [14613020]     Ответить | Цитировать Сообщить модератору
 Re: ХП с параметром имя таблицы  [new]
bamper78
Member

Откуда:
Сообщений: 122
bamper78,

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

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
24 июл 13, 20:30    [14613263]     Ответить | Цитировать Сообщить модератору
 Re: ХП с параметром имя таблицы  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
bamper78,

эта пять баллов!!
24 июл 13, 20:32    [14613276]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить