Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Поставить после команды CREATE TYPE разделитель пакетов GO |
||
4 апр 13, 12:06 [14134897] Ответить | Цитировать Сообщить модератору |
beaver06 Member Откуда: Сообщений: 681 |
Glory, Тип был создан уже давно, здесь он для примера |
4 апр 13, 12:07 [14134905] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
В какой базе ? |
||
4 апр 13, 12:09 [14134925] Ответить | Цитировать Сообщить модератору |
Shakill Member Откуда: мск Сообщений: 1882 |
в этом примере надо поставить GO а если он уже есть в текущей базе, то такой ошибки не появляется |
||
4 апр 13, 12:09 [14134927] Ответить | Цитировать Сообщить модератору |
beaver06 Member Откуда: Сообщений: 681 |
beaver06, в моем примере данный метод не работает только при слежении текста с @inserted, если подставлять @inserted как параметр для процедуры, то все работает. Т.е. в таком случае - работает: exec sp1 @inserted - работает exec 'Проц' + sp1 @inserted - ошибка |
4 апр 13, 12:10 [14134937] Ответить | Цитировать Сообщить модератору |
beaver06 Member Откуда: Сообщений: 681 |
Glory, в этой же |
4 апр 13, 12:11 [14134944] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
А как вы себе представляете конкатенацию таблицы со строкой ? Чего тогда не print Mytable ? |
||
4 апр 13, 12:12 [14134957] Ответить | Цитировать Сообщить модератору |
Shakill Member Откуда: мск Сообщений: 1882 |
beaver06, а что должна вывести команда print 'ParseMessage' + '00001 '+@inserted для табличной переменной? |
4 апр 13, 12:13 [14134961] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Вы серьезно считаете, что таблицы можно использовать в любой команде ? Я вас разочарую К табличным переменным можно применять только теже DML команды, что и к обычным таблицам |
||
4 апр 13, 12:21 [14135015] Ответить | Цитировать Сообщить модератору |
beaver06 Member Откуда: Сообщений: 681 |
Maxx, я это понимаю. Просто прошу помочь как в таком случае выполнить процедуру с параметром table type? |
4 апр 13, 12:21 [14135020] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
убрать print |
||
4 апр 13, 12:22 [14135026] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
beaver06, Тогда,что по вашему делает вот ето set @sql = 'ParseMessage' + (select replace(MessageType,'.','') from INSERTED)+ ' '+@inserted EXEC (@sql) ??? |
4 апр 13, 12:23 [14135035] Ответить | Цитировать Сообщить модератору |
beaver06 Member Откуда: Сообщений: 681 |
Glory, Таким образом все работает:exec sp1 @inserted. Как сделать что бы так: exec 'текст'+sp1 @inserted. Или это просто нельзя? |
4 апр 13, 12:25 [14135046] Ответить | Цитировать Сообщить модератору |
beaver06 Member Откуда: Сообщений: 681 |
Maxx, выполняет exec (ParseMessage00001 @inserted) |
4 апр 13, 12:27 [14135058] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Я смотрю вы горазды на придумывание синтаксиса. Транслятора потока сознания в TSQL еще не изобрели. Придется подождать |
||
4 апр 13, 12:29 [14135077] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9636 |
beaver06, Покажите объявление любой из ParseMessageXXXX |
4 апр 13, 12:33 [14135129] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
И поэтому теперь можно с таблицами работать как текстовыми строками ? |
||
4 апр 13, 12:36 [14135150] Ответить | Цитировать Сообщить модератору |
beaver06 Member Откуда: Сообщений: 681 |
invm, ALTER PROCEDURE [dbo].[ParseMessage00001] @tm InsertedTableType READONLY AS |
4 апр 13, 12:44 [14135207] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
beaver06 Member Откуда: Сообщений: 681 |
invm, а разве в inserted может быть несколько строк? по идее должна быть одна |
4 апр 13, 12:57 [14135318] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
|
||
4 апр 13, 12:59 [14135345] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |