Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Для процедуры в качестве параметра User-Defines Table Types / 25 сообщений из 44, страница 1 из 2
04.04.2013, 12:05
    #38212548
beaver06
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
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"."

Подскажите, как можно обойти данную ошибку.
...
Рейтинг: 0 / 0
04.04.2013, 12:06
    #38212551
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
beaver06Подскажите, как можно обойти данную ошибку.
Поставить после команды CREATE TYPE разделитель пакетов GO
...
Рейтинг: 0 / 0
04.04.2013, 12:07
    #38212554
beaver06
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
Glory,

Тип был создан уже давно, здесь он для примера
...
Рейтинг: 0 / 0
04.04.2013, 12:09
    #38212560
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
beaver06Тип был создан уже давно, здесь он для примера
В какой базе ?
...
Рейтинг: 0 / 0
04.04.2013, 12:09
    #38212561
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
beaver06Glory,

Тип был создан уже давно, здесь он для примера
в этом примере надо поставить GO
а если он уже есть в текущей базе, то такой ошибки не появляется
...
Рейтинг: 0 / 0
04.04.2013, 12:10
    #38212563
beaver06
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
beaver06,

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

exec sp1 @inserted - работает
exec 'Проц' + sp1 @inserted - ошибка
...
Рейтинг: 0 / 0
04.04.2013, 12:11
    #38212565
beaver06
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
Glory,

в этой же
...
Рейтинг: 0 / 0
04.04.2013, 12:12
    #38212572
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
beaver06print 'ParseMessage' + '00001 '+@inserted
А как вы себе представляете конкатенацию таблицы со строкой ?
Чего тогда не print Mytable ?
...
Рейтинг: 0 / 0
04.04.2013, 12:13
    #38212575
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
beaver06,

а что должна вывести команда print 'ParseMessage' + '00001 '+@inserted для табличной переменной?
...
Рейтинг: 0 / 0
04.04.2013, 12:17
    #38212586
beaver06
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
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

При это - ошибка
...
Рейтинг: 0 / 0
04.04.2013, 12:19
    #38212590
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
beaver06,

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

Код: sql
1.
2.
3.
4.
5.
declare @t table (i int)
print @t
-----------
Msg 137, Level 16, State 1, Line 2
Must declare the scalar variable "@t".
...
Рейтинг: 0 / 0
04.04.2013, 12:21
    #38212595
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
beaver06Т.е. в триггере должна выполняться процедура, которая в которой вторая часть = MessageType
Вы серьезно считаете, что таблицы можно использовать в любой команде ?
Я вас разочарую
К табличным переменным можно применять только теже DML команды, что и к обычным таблицам
...
Рейтинг: 0 / 0
04.04.2013, 12:21
    #38212597
beaver06
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
Maxx,

я это понимаю. Просто прошу помочь как в таком случае выполнить процедуру с параметром table type?
...
Рейтинг: 0 / 0
04.04.2013, 12:22
    #38212601
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
beaver06Просто прошу помочь как в таком случае выполнить процедуру с параметром table type?
убрать print
...
Рейтинг: 0 / 0
04.04.2013, 12:23
    #38212603
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
beaver06,

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


???
...
Рейтинг: 0 / 0
04.04.2013, 12:25
    #38212607
beaver06
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
Glory,
Таким образом все работает:exec sp1 @inserted. Как сделать что бы так: exec 'текст'+sp1 @inserted.
Или это просто нельзя?
...
Рейтинг: 0 / 0
04.04.2013, 12:27
    #38212610
beaver06
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
Maxx,

выполняет exec (ParseMessage00001 @inserted)
...
Рейтинг: 0 / 0
04.04.2013, 12:29
    #38212621
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
beaver06Как сделать что бы так: exec 'текст'+sp1 @inserted.
Я смотрю вы горазды на придумывание синтаксиса.
Транслятора потока сознания в TSQL еще не изобрели.
Придется подождать
...
Рейтинг: 0 / 0
04.04.2013, 12:33
    #38212634
beaver06
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
Glory,

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

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


Заказчик захотел избавиться от ифов (if). Просто messagetype - ов будет около 15
...
Рейтинг: 0 / 0
04.04.2013, 12:33
    #38212635
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
beaver06,

Покажите объявление любой из ParseMessageXXXX
...
Рейтинг: 0 / 0
04.04.2013, 12:36
    #38212644
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
beaver06Заказчик захотел избавиться от ифов (if). Просто messagetype - ов будет около 15
И поэтому теперь можно с таблицами работать как текстовыми строками ?
...
Рейтинг: 0 / 0
04.04.2013, 12:44
    #38212661
beaver06
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
invm,

ALTER PROCEDURE [dbo].[ParseMessage00001]
@tm InsertedTableType READONLY
AS
...
Рейтинг: 0 / 0
04.04.2013, 12:54
    #38212685
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
beaver06,

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

Триггер должен выглядеть примерно так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
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;
...
Рейтинг: 0 / 0
04.04.2013, 12:57
    #38212692
beaver06
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
invm,

а разве в inserted может быть несколько строк? по идее должна быть одна
...
Рейтинг: 0 / 0
04.04.2013, 12:59
    #38212700
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для процедуры в качестве параметра User-Defines Table Types
beaver06invm,

а разве в inserted может быть несколько строк? по идее должна быть однаПо чьей это идее?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Для процедуры в качестве параметра User-Defines Table Types / 25 сообщений из 44, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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