Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Передача в процедуру параметра типа table
|
|||
|---|---|---|---|
|
#18+
Как создать процедуру(или функцию) параметром которой, являлась бы переменная типа table? create procedure MyProc @p table (id int) as begin select * from @p end Ответ MSSQL: Incorrect syntax near the keyword 'table'. Must declare the variable '@p'. Через курсор не хочется, он там не нужен. Очень нужно Заранее благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2001, 00:57 |
|
||
|
Передача в процедуру параметра типа table
|
|||
|---|---|---|---|
|
#18+
Ну коли очень надо и еще актуально, то вот CREATE PROCEDURE MyProc @TableName char(6) AS DECLARE @Str char(20) SET @Str = 'select * from ' + @TableName EXEC (@Str) GO С функцией все сложнее, дело в том, что нельзя в переменную типа table сделать insert из процедуры, т.е. вот так не проканает: "insert into @TableName exec (@Str)". В принципе достаточно первого решения, т.к. мне только что сообщили, что например Delphi5 ADOшный компонент StoredProc возвращает набор данных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2001, 11:11 |
|
||
|
Передача в процедуру параметра типа table
|
|||
|---|---|---|---|
|
#18+
Во-первых, спасибо за отклик. Во-вторых, нужно и актуально. В-третьих, уточню вопрос: Если бы таблица TableName существовала в базе, то вопрос решался бы просто: Передаем имя таблицы в функцию, потом select * from @TableName в теле функции. И все. Здесь же таблица создается и заполняется по ходу выполнения процедуры и над ней несколько раз производятся одни и те же действия (не обязательно в цикле). Естественно возникает желание вынести эти действия в отдельную функцию. Вообще говоря, только для улучшения читабельности кода. Таким образом задача состоит в том, чтобы сначала передать набор данных (таблицу или на худой конец курсор) в функцию, а затем получить его обновленным обратно. С "получить обратно" проблем нет, а вот как передать? Я думал так: create procedure MyProc as begin declare @k int declare @Source table (Field int, Flag int) -- рабочая таблица declare @Result table (Field int, Flag int) -- результирующая таблица insert into @Result select * from TableName select @k = count(*) from @Result where Flag<>1 while @k>0 begin insert into @Source select * from @Result --заполняем рабочую таблицу delete from @Result --очищаем результирующую таблицу insert into @Result select * from MyFunction (@Source) --заполняем результирующую таблицу обновленным набором данных, [ b] точнее не заполняем, а получаем ошибку select @k = count(*) from @Result where Flag<>1 end select * from @Result end Насколько я понимаю передать в функцию набор данных невозможно ни с помощью переменной типа table ни с помощью курсора. Можно, наверное, с помощью временной таблицы, тогда достаточно передать имя таблицы, как и предлагалось, но в этом случае проще втиснуть весь код в одну процедуру. IMHO. Пардон за неудачный пример. Просто этот вопрос я задавал еще раз и получил лаконичный отрицательный ответ от одного из "зубров" этой конференции. Дополнительный пардон за мышление в стиле VB. Родимые пятна . P.S. А может все таки есть какой-то изврат? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2001, 20:12 |
|
||
|
Передача в процедуру параметра типа table
|
|||
|---|---|---|---|
|
#18+
К сожелению "Parameters can take the place only of constants; they cannot be used in place of table names, column names, or the names of other database objects" Это выдержка из BOL. Если ты не очень в англ., то тут написано, что параметры могут быть только константами и они не могут быть объектами БД. Наверно временная таблица и таблица типа Table тоже являются объектами БД. P.S. наверняка изврат все же есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2001, 08:09 |
|
||
|
Передача в процедуру параметра типа table
|
|||
|---|---|---|---|
|
#18+
Andrew - не понятно, почему Вам не подходит вариант mSlava? Создавайте новую таблицу, и передавайте ее имя в хранимую процедуру - но работайте с ней не напрямую, а так как сказал mSlava - т.е. SET @Str = 'select * from ' + @TableName EXEC (@Str) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2001, 09:25 |
|
||
|
Передача в процедуру параметра типа table
|
|||
|---|---|---|---|
|
#18+
Кажется я нашел для тебя кое-какое решение. Попробуй создать временную глобальную таблицу. Если не в курсе, то эта гадина может создаваться в любой SP или UDF (вроде бы) убивается там же, имеет префикс ##. Сообразил? Если попойдет такое решение скажи спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2001, 12:41 |
|
||
|
Передача в процедуру параметра типа table
|
|||
|---|---|---|---|
|
#18+
>Если бы таблица TableName существовала в базе, то вопрос решался бы просто: >Передаем имя таблицы в функцию, потом select * from @TableName в теле функции. И все. Вот так-то как раз работать и не будет. Однозначно НЕ БУДЕТ. Только через exec @str или через sp_executesql ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2001, 12:49 |
|
||
|
Передача в процедуру параметра типа table
|
|||
|---|---|---|---|
|
#18+
Привет всем "Ну коли очень надо и еще актуально, то вот": Если использовать ##, то данная проца не сможет одновременно работать в разных connection'ах (мне кажется это существенным обстоятельством для SQL Server'а). Можно предложить добавлять к имени уникальный номер данного connection'a @@SPID: DECLARE @TableName VARCHAR(50) SET @TableName = '##MyTable_' + CAST(@@SPID AS VARCHAR) DECLARE @SQL VARCHAR(8000) SET @SQL = ' SELECT * INTO ' + @TableName + ' FROM TEST_TABLE ' EXEC(@SQL) SET @SQL = ' SELECT * FROM ' + @TableName EXEC(@SQL) -- .... SET @SQL = ' Drop Table ' + @TableName EXEC(@SQL ) С уважением Юра ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2001, 10:00 |
|
||
|
Передача в процедуру параметра типа table
|
|||
|---|---|---|---|
|
#18+
А что вы уперлись в таблицы ## и соответственно в проблему имен. Используйте таблицы #. Если вы в процедуре создали таблицу #, а затем вызвали другую процедуры, то такая таблица будет видна в вызванной процедуре, и если дальше будете вызывать процедуры, она так-же будет видна и там. И никаких проблем с именами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2001, 11:09 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32004702&tid=1826685]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
| others: | 268ms |
| total: | 390ms |

| 0 / 0 |
