powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Передача в процедуру параметра типа table
10 сообщений из 10, страница 1 из 1
Передача в процедуру параметра типа table
    #32004702
Andrew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как создать процедуру(или функцию) параметром которой, являлась бы переменная типа 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'.
Через курсор не хочется, он там не нужен.
Очень нужно
Заранее благодарен.
...
Рейтинг: 0 / 0
Передача в процедуру параметра типа table
    #32005775
mSlava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну коли очень надо и еще актуально, то вот
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 возвращает набор данных
...
Рейтинг: 0 / 0
Передача в процедуру параметра типа table
    #32005900
Andrew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, спасибо за отклик.
Во-вторых, нужно и актуально.
В-третьих, уточню вопрос:
Если бы таблица 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. А может все таки есть какой-то изврат?
...
Рейтинг: 0 / 0
Передача в процедуру параметра типа table
    #32005910
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожелению "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. наверняка изврат все же есть.
...
Рейтинг: 0 / 0
Передача в процедуру параметра типа table
    #32005920
JINX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrew - не понятно, почему Вам не подходит вариант mSlava?

Создавайте новую таблицу, и передавайте ее имя в хранимую процедуру - но работайте с ней не напрямую, а так как сказал mSlava - т.е.

SET @Str = 'select * from ' + @TableName
EXEC (@Str)
...
Рейтинг: 0 / 0
Передача в процедуру параметра типа table
    #32005934
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кажется я нашел для тебя кое-какое решение. Попробуй создать временную глобальную таблицу. Если не в курсе, то эта гадина может создаваться в любой SP или UDF (вроде бы) убивается там же, имеет префикс ##. Сообразил?
Если попойдет такое решение скажи спасибо.
...
Рейтинг: 0 / 0
Передача в процедуру параметра типа table
    #32005935
zamm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>Если бы таблица TableName существовала в базе, то вопрос решался бы просто:
>Передаем имя таблицы в функцию, потом select * from @TableName в теле функции. И все.

Вот так-то как раз работать и не будет. Однозначно НЕ БУДЕТ.
Только через exec @str
или через sp_executesql
...
Рейтинг: 0 / 0
Передача в процедуру параметра типа table
    #32006241
Yukon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем

"Ну коли очень надо и еще актуально, то вот":

Если использовать ##, то данная проца не сможет одновременно работать в разных 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 )



С уважением

Юра
...
Рейтинг: 0 / 0
Передача в процедуру параметра типа table
    #32006254
zamm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что вы уперлись в таблицы ## и соответственно в проблему имен.
Используйте таблицы #. Если вы в процедуре создали таблицу #, а затем вызвали другую процедуры, то такая таблица будет видна в вызванной процедуре, и если дальше будете вызывать процедуры, она так-же будет видна и там. И никаких проблем с именами.
...
Рейтинг: 0 / 0
Передача в процедуру параметра типа table
    #32006257
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Zamm
Вы имеете в виду вызов процедуры из процедуры да?
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Передача в процедуру параметра типа table
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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