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

Откуда: г. Екатеринбург
Сообщений: 666
Добрый день.

Создаём табличный тип:

CREATE TYPE [Test_Keys] AS TABLE
(
  [Key]	INT PRIMARY KEY
);
GO


Пример функции:
CREATE FUNCTION [dbo].[SMS_GetTemplates](
  @TemplateKeys	Test_Keys READONLY,
  @AllowAll		BIT = 1
) RETURNS TABLE
AS RETURN (
  SELECT
	[Templates].[Key],
	[Templates].[SubsystemKey],
	[Subsystem].[ID],
	[Subsystem].[FieldsJSONArr],
	[Templates].[Name],
	[Templates].[Text],
	[Templates].[SystemPattern]
  FROM
	[Templates] JOIN [Subsystem] ON
	[Templates].[SubsystemKey] = [Subsystem].[Key] 
  WHERE
      ([Templates].[Key] IN (SELECT [Key] FROM @TemplateKeys)) OR
      ((NOT EXISTS(SELECT [Key] FROM @TemplateKeys)) AND (@AllowAll = 1))
)
GO


Вызываю функцию примерно так:
SELECT * FROM [dbo].[SMS_GetTemplates](DEFAUTL, 1) WHERE [SubsystemID] = @SubsystemID


Получаю ошибку:
Недопустимое значение по умолчанию параметра 1.



У меня вопрос, можно ли задать переменной табличного типа значение по умолчанию "пустая таблица"?

У табличных функций такой фокус проходит: SELECT * FROM [dbo].[SMS_GetTemplates](DEFAUTL, 1). У табличных функций инлайн пишет ошибку...
2 окт 19, 16:43    [21985150]     Ответить | Цитировать Сообщить модератору
 Re: Как задать переменной табличного типа значение по умолчанию в функции "ин-лайн"  [new]
Konst_One
Member

Откуда:
Сообщений: 11479
DEFAUTL != DEFAULT
2 окт 19, 16:45    [21985155]     Ответить | Цитировать Сообщить модератору
 Re: Как задать переменной табличного типа значение по умолчанию в функции "ин-лайн"  [new]
Гусельников Игорь
Member

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

чего тут сказать, остроумна! ))

пускай будет так))
SELECT * FROM [dbo].[SMS_GetTemplates](DEFAULT, 1) WHERE [SubsystemID] = @SubsystemID


но вопрос и без этого понятен
2 окт 19, 18:31    [21985284]     Ответить | Цитировать Сообщить модератору
 Re: Как задать переменной табличного типа значение по умолчанию в функции "ин-лайн"  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6788
Игорь_UUS,

Вы еще только в начале пути батхёрта с табличными типами... Лучше сразу откажитесь, пока не наступило привыкание к гвоздям в постели.
2 окт 19, 19:23    [21985349]     Ответить | Цитировать Сообщить модератору
 Re: Как задать переменной табличного типа значение по умолчанию в функции "ин-лайн"  [new]
Gerros
Member

Откуда: Харьков
Сообщений: 471
Игорь_UUS,

простите пожалуйста, не могли бы Вы описать,
1. зачем Вам пользовательские типы?
2. зачем Вам табличные пользовательские типы?
3. если они Вам нужны для TVP, то в какой ситуации понадобится передавать туда DEFAULT?

очень уж интересно...
2 окт 19, 20:13    [21985376]     Ответить | Цитировать Сообщить модератору
 Re: Как задать переменной табличного типа значение по умолчанию в функции "ин-лайн"  [new]
Shakill
Member

Откуда: мск
Сообщений: 1837
Gerros
1. зачем Вам пользовательские типы?
2. зачем Вам табличные пользовательские типы?
3. если они Вам нужны для TVP, то в какой ситуации понадобится передавать туда DEFAULT?

так по примеру же всё видно
автор хочет в некоторых случая передавать в функцию набор данных для фильтрации, а иногда хочет не передавать
и вот во втором случае помог бы default, без него придется объявлять пустую табличную переменную просто потому что by design

табличные параметры передаются по ссылке
а это значит, что default ещё долго не видать, как и output, как и даже табличных параметров без readonly
2 окт 19, 20:50    [21985403]     Ответить | Цитировать Сообщить модератору
 Re: Как задать переменной табличного типа значение по умолчанию в функции "ин-лайн"  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 666
Shakill
Gerros
1. зачем Вам пользовательские типы?
2. зачем Вам табличные пользовательские типы?
3. если они Вам нужны для TVP, то в какой ситуации понадобится передавать туда DEFAULT?

так по примеру же всё видно
автор хочет в некоторых случая передавать в функцию набор данных для фильтрации, а иногда хочет не передавать
и вот во втором случае помог бы default, без него придется объявлять пустую табличную переменную просто потому что by design

табличные параметры передаются по ссылке
а это значит, что default ещё долго не видать, как и output, как и даже табличных параметров без readonly


В том то и дело, что приходится объявлять переменную постоянно... лишняя строчка кода(( Но самое интересное, DEFAULT работает в табличных функциях, которые не "ин-лайн" и ошибка появилась внезапно и неожиданно)) когда табличную функцию переписали на табличную функцию инлайн

Что касается TVP - используется на клиенте написанном на дельфи, а там FireDAC. Но с появлением в mssql 2016 работы с json, думается мне что придётся перепахивать и искоренять TVP т.к. принципиальной нужды их использования можно избежать
3 окт 19, 07:48    [21985521]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить