Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Для процедуры в качестве параметра User-Defines Table Types  [new]
beaver06
Member

Откуда:
Сообщений: 681
CREATE TYPE [dbo].[InsertedTableType] AS TABLE(
[ID] [uniqueidentifier] NOT NULL,
[MessageType] [nchar](6) NOT NULL,
[StoreID] [nvarchar](9) NOT NULL,
[CreateDate] [datetime] NOT NULL,
[CreateUTCDate] [datetime] NOT NULL,
[ReceiveDate] [datetime] NOT NULL,
[ReceiceUTCDate] [datetime] NULL,
[XMLData] [xml] NULL,
[BinaryDataID] [uniqueidentifier] NULL
)

DECLARE @inserted AS InsertedTableType
INSERT INTO @inserted
SELECT *
FROM dbo.MessageReceive

print 'ParseMessage' + '00001 '+@inserted

Ошибка "Must declare the scalar variable "@inserted"."

Подскажите, как можно обойти данную ошибку.
4 апр 13, 12:05    [14134887]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
Glory
Member

Откуда:
Сообщений: 104760
beaver06
Подскажите, как можно обойти данную ошибку.

Поставить после команды CREATE TYPE разделитель пакетов GO
4 апр 13, 12:06    [14134897]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
beaver06
Member

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

Тип был создан уже давно, здесь он для примера
4 апр 13, 12:07    [14134905]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
Glory
Member

Откуда:
Сообщений: 104760
beaver06
Тип был создан уже давно, здесь он для примера

В какой базе ?
4 апр 13, 12:09    [14134925]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
Shakill
Member

Откуда: мск
Сообщений: 1882
beaver06
Glory,

Тип был создан уже давно, здесь он для примера

в этом примере надо поставить GO
а если он уже есть в текущей базе, то такой ошибки не появляется
4 апр 13, 12:09    [14134927]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
beaver06
Member

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

в моем примере данный метод не работает только при слежении текста с @inserted, если подставлять @inserted как параметр для процедуры, то все работает. Т.е. в таком случае - работает:

exec sp1 @inserted - работает
exec 'Проц' + sp1 @inserted - ошибка
4 апр 13, 12:10    [14134937]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
beaver06
Member

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

в этой же
4 апр 13, 12:11    [14134944]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
Glory
Member

Откуда:
Сообщений: 104760
beaver06
print 'ParseMessage' + '00001 '+@inserted

А как вы себе представляете конкатенацию таблицы со строкой ?
Чего тогда не print Mytable ?
4 апр 13, 12:12    [14134957]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
Shakill
Member

Откуда: мск
Сообщений: 1882
beaver06,

а что должна вывести команда print 'ParseMessage' + '00001 '+@inserted для табличной переменной?
4 апр 13, 12:13    [14134961]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
beaver06
Member

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

ALTER TRIGGER [dbo].[trig_ins_mt]
ON [dbo].[MessageReceive]
AFTER INSERT
AS
BEGIN
DECLARE @sql varchar(500)
DECLARE @inserted AS InsertedTableType
DECLARE @mt NCHAR(6)
SET @mt = (
SELECT MessageType
FROM INSERTED
)
INSERT INTO @inserted
SELECT *
FROM INSERTED

set @sql = 'ParseMessage' + (select replace(MessageType,'.','') from INSERTED)+ ' '+@inserted
EXEC (@sql)

Т.е. в триггере должна выполняться процедура, которая в которой вторая часть = MessageType

При это - ошибка
4 апр 13, 12:17    [14134984]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
Maxx
Member [скрыт]

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

вам еще раз говорят что

declare @t table (i int)
print @t
-----------
Msg 137, Level 16, State 1, Line 2
Must declare the scalar variable "@t".
4 апр 13, 12:19    [14134998]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
Glory
Member

Откуда:
Сообщений: 104760
beaver06
Т.е. в триггере должна выполняться процедура, которая в которой вторая часть = MessageType

Вы серьезно считаете, что таблицы можно использовать в любой команде ?
Я вас разочарую
К табличным переменным можно применять только теже DML команды, что и к обычным таблицам
4 апр 13, 12:21    [14135015]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
beaver06
Member

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

я это понимаю. Просто прошу помочь как в таком случае выполнить процедуру с параметром table type?
4 апр 13, 12:21    [14135020]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
Glory
Member

Откуда:
Сообщений: 104760
beaver06
Просто прошу помочь как в таком случае выполнить процедуру с параметром table type?

убрать print
4 апр 13, 12:22    [14135026]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
Maxx
Member [скрыт]

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

Тогда,что по вашему делает вот ето
set @sql = 'ParseMessage' + (select replace(MessageType,'.','') from INSERTED)+ ' '+@inserted
EXEC (@sql)

???
4 апр 13, 12:23    [14135035]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
beaver06
Member

Откуда:
Сообщений: 681
Glory,
Таким образом все работает:exec sp1 @inserted. Как сделать что бы так: exec 'текст'+sp1 @inserted.
Или это просто нельзя?
4 апр 13, 12:25    [14135046]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
beaver06
Member

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

выполняет exec (ParseMessage00001 @inserted)
4 апр 13, 12:27    [14135058]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
Glory
Member

Откуда:
Сообщений: 104760
beaver06
Как сделать что бы так: exec 'текст'+sp1 @inserted.

Я смотрю вы горазды на придумывание синтаксиса.
Транслятора потока сознания в TSQL еще не изобрели.
Придется подождать
4 апр 13, 12:29    [14135077]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
beaver06
Member

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

короче таким образом работать не будет.

У меня просто сделано таким образом:
DECLARE @inserted AS InsertedTableType
INSERT INTO @inserted
SELECT *
FROM INSERTED
if (select messagetype from inserted) = '00.001'
exec sp1 @inserted


Заказчик захотел избавиться от ифов (if). Просто messagetype - ов будет около 15
4 апр 13, 12:33    [14135127]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
invm
Member

Откуда: Москва
Сообщений: 9636
beaver06,

Покажите объявление любой из ParseMessageXXXX
4 апр 13, 12:33    [14135129]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
Glory
Member

Откуда:
Сообщений: 104760
beaver06
Заказчик захотел избавиться от ифов (if). Просто messagetype - ов будет около 15

И поэтому теперь можно с таблицами работать как текстовыми строками ?
4 апр 13, 12:36    [14135150]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
beaver06
Member

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

ALTER PROCEDURE [dbo].[ParseMessage00001]
@tm InsertedTableType READONLY
AS
4 апр 13, 12:44    [14135207]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
invm
Member

Откуда: Москва
Сообщений: 9636
beaver06,

ИМХО, хрень у вас какая-то с логикой... Если в inserted будет несколько строк, да еще с одинаковым MessageType, тогда как? Ну да ладно, дело ваше.

Триггер должен выглядеть примерно так:
alter trigger dbo.trig_ins_mt
on dbo.MessageReceive
after insert
as
begin
 set nocount on;
 
 declare @inserted as InsertedTableType;
 declare @proc sysname;
 
 insert into @inserted
 select
  *
 from
  inserted;
  
 declare c cursor local fast_forward for
  select
   'ParseMessage' + MessageType
  from
   inserted;
 
 open c;
 fetch next from c into @proc;
 while @@fetch_status = 0
  begin
   exec @proc @inserted;
   
   fetch next from c into @proc;
  end;
 close c;
 deallocate c;
end;
4 апр 13, 12:54    [14135284]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
beaver06
Member

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

а разве в inserted может быть несколько строк? по идее должна быть одна
4 апр 13, 12:57    [14135318]     Ответить | Цитировать Сообщить модератору
 Re: Для процедуры в качестве параметра User-Defines Table Types  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37155
beaver06
invm,

а разве в inserted может быть несколько строк? по идее должна быть одна
По чьей это идее?
4 апр 13, 12:59    [14135345]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить