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

Откуда:
Сообщений: 135
Добрый день

как передать таблицу как параметр в фунцию?

create function DBO.FN_HOURS_SUM(@VALUE table(nchar(5)) ...

Incorrect syntax near the keyword 'table'.
7 дек 12, 13:26    [13594012]     Ответить | Цитировать Сообщить модератору
 Re: таблица как параметр  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Через табличный тип данных.
7 дек 12, 13:31    [13594057]     Ответить | Цитировать Сообщить модератору
 Re: таблица как параметр  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ильдар4,

создать табличный тип, создать процедуру (функцию) с параметром этого типа,
создать табличную переменную этого типа, заполнить её данными, вызвать процедуру (функцию)
с этой передачей табличной переменной через параметр с указанием READONLY
7 дек 12, 13:31    [13594061]     Ответить | Цитировать Сообщить модератору
 Re: таблица как параметр  [new]
лолл
Member

Откуда:
Сообщений: 450
ильдар4,

можно предварительно создать временную таблицу и вызвать процедуру, которая с ней работает.
7 дек 12, 13:34    [13594093]     Ответить | Цитировать Сообщить модератору
 Re: таблица как параметр  [new]
лолл
Member

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

упс, не посмотрел, что у вас функция. тогда только через параметр табличного типа.
7 дек 12, 13:36    [13594109]     Ответить | Цитировать Сообщить модератору
 Re: таблица как параметр  [new]
ильдар4
Member

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

спасибо
7 дек 12, 13:46    [13594219]     Ответить | Цитировать Сообщить модератору
 Re: таблица как параметр  [new]
ильдар4
Member

Откуда:
Сообщений: 135
ильдар4,

Сделал функцию, но не могу при ее вызове с табличным параметром возникает ошибка

IF NOT EXISTS(SELECT 1 FROM sys.types WHERE name = 'MyTableType')
CREATE TYPE MyTableType AS TABLE(PlanHours nchar(5))

declare @Tab MyTableType
insert into @Tab SELECT '95:30' UNION ALL
SELECT '95:30' UNION ALL
SELECT '95:30' UNION ALL
SELECT '95:30' UNION ALL
SELECT '95:30' UNION ALL
SELECT '95:30' UNION ALL
SELECT '95:30' UNION ALL
SELECT '95:30' UNION ALL
SELECT '95:30' UNION ALL
SELECT '95:30' UNION ALL
SELECT '96:00'

select * from @Tab

if object_id('DBO.FN_HOURS_SUM') is null begin
exec('create function DBO.FN_HOURS_SUM(@Tab MyTableType readonly) returns nchar(12) as begin return null end')
grant execute on DBO.FN_HOURS_SUM to public
end
go
alter function FN_HOURS_SUM(@Tab MyTableType readonly) returns nchar(12)
as
begin
declare @result nchar(12)
DECLARE @Table TABLE(data CHAR(5))
insert into @Table select * from @Tab

select @result = STUFF(CONVERT(CHAR(8), DATEADD(SECOND, theHours + theMinutes,
'19000101'), 8), 1, 2, CAST((theHours + theMinutes) / 3600 AS VARCHAR(12)))
FROM (
SELECT ABS(SUM(CASE CHARINDEX(':', data) WHEN 0 THEN 0 ELSE 3600 *
LEFT(data, CHARINDEX(':', data) - 1) END)) AS theHours,
ABS(SUM(CASE CHARINDEX(':', data) WHEN 0 THEN 0 ELSE 60 *
SUBSTRING(data, CHARINDEX(':', data) + 1, 2) END)) AS theMinutes
FROM @Table
) AS d
return @result
end
go
7 дек 12, 14:39    [13594814]     Ответить | Цитировать Сообщить модератору
 Re: таблица как параметр  [new]
nezhadnye_my
Guest
да все работает, ответ: 1051:00:00
напихано только по пакетам неправильно.
рабочий вариант:
IF NOT EXISTS(SELECT 1 FROM sys.types WHERE name = 'MyTableType')
CREATE TYPE MyTableType AS TABLE(PlanHours char(5))
go

if object_id('DBO.FN_HOURS_SUM') is null 
begin
exec('create function DBO.FN_HOURS_SUM(@Tab MyTableType readonly) returns nchar(12) as begin return null end')
grant execute on DBO.FN_HOURS_SUM to public
end
go

alter function dbo.FN_HOURS_SUM(@Tab MyTableType readonly) returns nchar(12)
as
	begin
	declare @result nchar(12)
	DECLARE @Table TABLE(data CHAR(5))
	insert into @Table select * from @Tab

	select @result = STUFF(CONVERT(CHAR(8), DATEADD(SECOND, theHours + theMinutes,
	'19000101'), 8), 1, 2, CAST((theHours + theMinutes) / 3600 AS VARCHAR(12)))
	FROM (
	SELECT ABS(SUM(CASE CHARINDEX(':', data) WHEN 0 THEN 0 ELSE 3600 *
	LEFT(data, CHARINDEX(':', data) - 1) END)) AS theHours,
	ABS(SUM(CASE CHARINDEX(':', data) WHEN 0 THEN 0 ELSE 60 *
	SUBSTRING(data, CHARINDEX(':', data) + 1, 2) END)) AS theMinutes
	FROM @Table
	) AS d
	return @result
end
go


declare @Tab MyTableType
insert into @Tab SELECT '95:30' UNION ALL
SELECT '95:30' UNION ALL
SELECT '95:30' UNION ALL
SELECT '95:30' UNION ALL
SELECT '95:30' UNION ALL
SELECT '95:30' UNION ALL
SELECT '95:30' UNION ALL
SELECT '95:30' UNION ALL
SELECT '95:30' UNION ALL
SELECT '95:30' UNION ALL
SELECT '96:00'

select dbo.FN_HOURS_SUM(@Tab)
7 дек 12, 14:56    [13595011]     Ответить | Цитировать Сообщить модератору
 Re: таблица как параметр  [new]
Glory
Member

Откуда:
Сообщений: 104751
ильдар4
Сделал функцию, но не могу при ее вызове с табличным параметром возникает ошибка

Версия вашего сервера предполагает наличие таких параметров ?
Вы сверялись с хелпом именно вашей версии ?
7 дек 12, 15:13    [13595164]     Ответить | Цитировать Сообщить модератору
 Re: таблица как параметр  [new]
ильдар4
Member

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

Спасибо
7 дек 12, 15:18    [13595197]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить