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

Откуда: Киев
Сообщений: 272
Есть процедурка внутри нее обявляеться переменная аля
Declare @t table (id int,val float)
По ходу процедуры он заполняеться кучей данных. Можно ли потом эту переменную передать в другую процедуру или функцию, но так чтоб они могли в ней что то изменять и возвращать обратно в первую измененные данные.
Пытался сделать через UDT и передать в процедуру, но ругается что параметр должен быть Обязательно ReadOnly.
Какие есть варианты реализации данного алгоритма?
12 фев 10, 12:34    [8335304]     Ответить | Цитировать Сообщить модератору
 Re: Табличная переменная в виде параметра  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36694
Сделать из переменной временную таблицу, тогда она отлично будет видна во всех вызываемых процедурах.
12 фев 10, 12:35    [8335315]     Ответить | Цитировать Сообщить модератору
 Re: Табличная переменная в виде параметра  [new]
MorAdan
Member

Откуда: Киев
Сообщений: 272
А если из под одной сессии будет запускаться процедура в нескольких потоках(просто предположение) то эта временная таблица будет видна всем потокам в пределах этой транзакции?
12 фев 10, 12:38    [8335336]     Ответить | Цитировать Сообщить модератору
 Re: Табличная переменная в виде параметра  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
изменять и возвращать обратно в первую измененные данные.


C табличными параметрами такой фокус не пройдет.
12 фев 10, 13:03    [8335540]     Ответить | Цитировать Сообщить модератору
 Re: Табличная переменная в виде параметра  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
MorAdan
А если из под одной сессии будет запускаться процедура в нескольких потоках(просто предположение) то эта временная таблица будет видна всем потокам в пределах этой транзакции?


У одной сесси на стороне сервера не может быть несколько потоков (не путать с распараллеливанием). Но временная таблица, созданная в хп, будет видна во всех хп, вызываемых из нее (включая вложенные).
12 фев 10, 13:05    [8335547]     Ответить | Цитировать Сообщить модератору
 Re: Табличная переменная в виде параметра  [new]
vlas
Member

Откуда: Москва
Сообщений: 112
Тип данных параметра (возможно, с указанием схемы, которой он принадлежит). Для функций Transact-SQL допустимы любые типы данных, включая определяемые пользователем типы данных CLR и определяемые пользователем табличные типы, за исключением типа данных timestamp. Для функций CLR допустимы все типы данных, включая пользовательские типы данных CLR, за исключением типов данных text, ntext, image, определяемых пользователем табличных типов и типов данных timestamp. Нескалярные типы cursor и table не могут быть указаны в качестве типов данных параметров ни для функций Transact-SQL, ни для функций CLR.
BOL


SQL SERVER без границ
12 фев 10, 14:13    [8336194]     Ответить | Цитировать Сообщить модератору
 Re: Табличная переменная в виде параметра  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
vlas,

Странно, стрелял Дантес речь идет о хп, а памятник Пушкину цитату Вы привели о CREATE FUNCTION.
12 фев 10, 14:56    [8336586]     Ответить | Цитировать Сообщить модератору
 Re: Табличная переменная в виде параметра  [new]
vlas
Member

Откуда: Москва
Сообщений: 112
pkarklin
vlas,

Странно, стрелял Дантес речь идет о хп, а памятник Пушкину цитату Вы привели о CREATE FUNCTION.


Если почитать MSDN по ссылке, то ясно, что табличная переменная не может быть параметром как функции так и хп
SQL SERVER без границ
13 фев 10, 10:53    [8339610]     Ответить | Цитировать Сообщить модератору
 Re: Табличная переменная в виде параметра  [new]
vlas
Member

Откуда: Москва
Сообщений: 112
vlas
Нескалярные типы cursor и table не могут быть указаны в качестве типов данных параметров ни для функций Transact-SQL, ни для функций CLR.
BOL


SQL SERVER без границ
13 фев 10, 10:55    [8339612]     Ответить | Цитировать Сообщить модератору
 Re: Табличная переменная в виде параметра  [new]
vlas
Member

Откуда: Москва
Сообщений: 112
vlas
pkarklin
vlas,

Странно, стрелял Дантес речь идет о хп, а памятник Пушкину цитату Вы привели о CREATE FUNCTION.


Если почитать MSDN по ссылке, то ясно, что табличная переменная не может быть параметром как функции так и хп
SQL SERVER без границ


Извините, обшибся.

В этой ссылке нет информации про хп.

А вот здесь есть:
BOL

data_type

Is the parameter data type. All data types, except the table data type, can be used as a parameter for a stored procedure. However, the cursor data type can be used only on OUTPUT parameters. When you specify a data type of cursor, the VARYING and OUTPUT keywords must also be specified.

CREATE PROCEDURE BOL
13 фев 10, 11:00    [8339617]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Табличная переменная в виде параметра  [new]
Алексей Cивоплясов
Member

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

У меня недавно была такая задача.
Сервер MSSQL 2008. Можно использовать создаваемый табличный тип и передавать его как параметр.
Найдено клик.
5 май 12, 13:59    [12513513]     Ответить | Цитировать Сообщить модератору
 Re: Табличная переменная в виде параметра  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30778
Алексей Cивоплясов
vlas,

У меня недавно была такая задача.
Сервер MSSQL 2008. Можно использовать создаваемый табличный тип и передавать его как параметр.
Найдено клик.
Думаете, ТС не нашёл за 2 года решение???
5 май 12, 17:39    [12514969]     Ответить | Цитировать Сообщить модератору
 Re: Табличная переменная в виде параметра  [new]
Алексей Cивоплясов
Member

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

Думаю, информация пригодится тому, кто ее будет на форуме искать. И ответ положен в тему исходя из этих соображений.
Если Вы относитесь к группе администраторов либо модераторов форума, то думаю, следует тему "забанить" чтобы форум не переполнялся ответами с разрывом более года. Как думаете?
11 май 12, 10:35    [12534504]     Ответить | Цитировать Сообщить модератору
 Re: Табличная переменная в виде параметра  [new]
MyNiGoo
Member

Откуда:
Сообщений: 230
Алексей Cивоплясов, спасибо
3 окт 12, 10:02    [13259668]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Табличная переменная в виде параметра  [new]
AndrF
Member

Откуда:
Сообщений: 2183
Алексей Cивоплясов
vlas,
Сервер MSSQL 2008. Можно использовать создаваемый табличный тип и передавать его как параметр.


Но только READONLY. Однако, вернуть табличку может табличная функция.

Итого пробуем:

IF OBJECT_ID (N'dbo.MyFuncTest', N'TF') IS NOT NULL
	DROP FUNCTION dbo.MyFuncTest
GO
IF TYPE_ID(N'MyTestTableType') IS NOT NULL
	DROP TYPE MyTestTableType
GO
CREATE TYPE MyTestTableType AS TABLE (Id int, [Text] varchar(255))
GO
CREATE FUNCTION dbo.MyFuncTest (@MyInTable MyTestTableType READONLY)
	RETURNS @ret TABLE (Id int, [Text] varchar(255))
AS
BEGIN
	INSERT INTO @ret (Id, [Text]) SELECT Id+3, [Text] = 'old id = ' + CAST(id AS varchar) FROM @MyInTable
	RETURN
END
GO

DECLARE @MyTest AS MyTestTableType

INSERT  INTO @MyTest
		(Id, [Text])
	VALUES (1759, 'id = 1759'),
		(1760, 'id = 1760'),
		(1761, 'id = 1761');

INSERT INTO @MyTest 
	SELECT * FROM dbo.MyFuncTest(@MyTest)

SELECT * FROM @MyTest
11 июн 18, 22:51    [21485169]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить