|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
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"." Подскажите, как можно обойти данную ошибку. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:05 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06Подскажите, как можно обойти данную ошибку. Поставить после команды CREATE TYPE разделитель пакетов GO ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:06 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
Glory, Тип был создан уже давно, здесь он для примера ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:07 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06Тип был создан уже давно, здесь он для примера В какой базе ? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:09 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06Glory, Тип был создан уже давно, здесь он для примера в этом примере надо поставить GO а если он уже есть в текущей базе, то такой ошибки не появляется ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:09 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06, в моем примере данный метод не работает только при слежении текста с @inserted, если подставлять @inserted как параметр для процедуры, то все работает. Т.е. в таком случае - работает: exec sp1 @inserted - работает exec 'Проц' + sp1 @inserted - ошибка ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:10 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
Glory, в этой же ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:11 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06print 'ParseMessage' + '00001 '+@inserted А как вы себе представляете конкатенацию таблицы со строкой ? Чего тогда не print Mytable ? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:12 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06, а что должна вывести команда print 'ParseMessage' + '00001 '+@inserted для табличной переменной? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:13 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
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 При это - ошибка ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:17 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06, вам еще раз говорят что Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:19 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06Т.е. в триггере должна выполняться процедура, которая в которой вторая часть = MessageType Вы серьезно считаете, что таблицы можно использовать в любой команде ? Я вас разочарую К табличным переменным можно применять только теже DML команды, что и к обычным таблицам ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:21 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
Maxx, я это понимаю. Просто прошу помочь как в таком случае выполнить процедуру с параметром table type? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:21 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06Просто прошу помочь как в таком случае выполнить процедуру с параметром table type? убрать print ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:22 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06, Тогда,что по вашему делает вот ето Код: sql 1. 2.
??? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:23 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
Glory, Таким образом все работает:exec sp1 @inserted. Как сделать что бы так: exec 'текст'+sp1 @inserted. Или это просто нельзя? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:25 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
Maxx, выполняет exec (ParseMessage00001 @inserted) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:27 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06Как сделать что бы так: exec 'текст'+sp1 @inserted. Я смотрю вы горазды на придумывание синтаксиса. Транслятора потока сознания в TSQL еще не изобрели. Придется подождать ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:29 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
Glory, короче таким образом работать не будет. У меня просто сделано таким образом: DECLARE @inserted AS InsertedTableType INSERT INTO @inserted SELECT * FROM INSERTED if (select messagetype from inserted) = '00.001' exec sp1 @inserted Заказчик захотел избавиться от ифов (if). Просто messagetype - ов будет около 15 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:33 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06, Покажите объявление любой из ParseMessageXXXX ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:33 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06Заказчик захотел избавиться от ифов (if). Просто messagetype - ов будет около 15 И поэтому теперь можно с таблицами работать как текстовыми строками ? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:36 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
invm, ALTER PROCEDURE [dbo].[ParseMessage00001] @tm InsertedTableType READONLY AS ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:44 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:54 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
invm, а разве в inserted может быть несколько строк? по идее должна быть одна ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:57 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06invm, а разве в inserted может быть несколько строк? по идее должна быть однаПо чьей это идее? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:59 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
Гавриленко Сергей Алексеевич, по моей. А разве это не так? Если вставку делать по одной строке, то и в триггере в таблице inserted всегда будет одна строка. Это не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 13:24 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06Если вставку делать по одной строке, то и в триггере в таблице inserted всегда будет одна строка. Это не так? А если вставка не по одной строке, то тогда в таблице inserted все равно будет одна запись, да ? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 13:25 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06Гавриленко Сергей Алексеевич, по моей. А разве это не так? Если вставку делать по одной строке, то и в триггере в таблице inserted всегда будет одна строка. Это не так?А как вы запретили делать вставку более, чем по одной строке за раз? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 13:25 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06invm, а разве в inserted может быть несколько строк? по идее должна быть однаМожет быть много, может вообще не быть строк. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 13:25 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06Гавриленко Сергей Алексеевич, по моей. А разве это не так? Если вставку делать по одной строке, то и в триггере в таблице inserted всегда будет одна строка. Это не так?Почему это я не могу вставить один миллион строк одним INSERTом? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 13:25 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
у меня по бизнес логике вставка по одной строке. В таком случае в inserted может быть больше одной строки? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 13:28 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06у меня по бизнес логике вставка по одной строке. Это вы про ваше клиентское ПО ? Или про команду insert ? beaver06В таком случае в inserted может быть больше одной строки? Когда добавляется больше одной строки ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 13:30 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06у меня по бизнес логике вставка по одной строке. В таком случае в inserted может быть больше одной строки?Что Вам мешает представить себе, что строк много? Это best practice! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 13:32 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
При такой вставке может быть в таблице inserted больше одной строки? ALTER PROCEDURE [dbo].[CreateMessage] @ID uniqueidentifier, @MessageType nchar(6), @StoreID nvarchar(9), @XMLData xml, @BinaryDataID uniqueidentifier AS BEGIN SET NOCOUNT ON; INSERT INTO [dbo].[MessageSend] ([ID] ,[MessageType] ,[StoreID] ,[CreateDate] ,[CreateUTCDate] ,[XMLData] ,[BinaryDataID]) VALUES (@ID ,@MessageType ,@StoreID ,GETDATE() ,GETUTCDATE() ,@XMLData ,@BinaryDataID) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 13:38 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06При такой вставке может быть в таблице inserted больше одной строки?А как вы гарантировали, что кроме этой вставки завтра или послезавтра не появится еще какая-нибудь, или кто-то вообще возьмет и напрямую не зальет в таблицу пару миллионов записей? Зачем писать кривой триггер, который сегодня при некоторых условиях работает, а завтра сломается или чепуху делать будет? Чтобы заказчик почаще обращался? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 13:41 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06При такой вставке может быть в таблице inserted больше одной строки? Еще один не читатель. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 13:44 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
iap, как я понял вы предлагаете представить, что в таблице inserted много записей, и пробежаться по циклу и запустить процедуру для каждой строки? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 13:56 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06iap, как я понял вы предлагаете представить, что в таблице inserted много записей, и пробежаться по циклу и запустить процедуру для каждой строки?Ну и извратили Вы мои слова... Ни в коем случае! Работать с данными в таблицах deleted и inserted в предположении, что в них сколько угодно записей. С помощью запросов, которые в SQL обычно предназначены для операций со множествами, которые представлены таблицами. Рекомендую на время забыть про циклы, курсоры и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 14:00 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06, вместо Вас по циклу должен бегать сервер. Достаточно лишь послать ему запрос, в котором сказано, что Вы хотите получить. Как получить - пусть сервер решает сам! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 14:01 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
Хотя, если действительно надо вызвать процедуру для каждой строки, то да, придётся передавать ей копию inserted или создавать курсор+цикл, что крайне нежелательно. Лучше всего рассмотреть возможность обойтись в триггере без вызова процедуры. Даже копирование сотни-другой тысяч записей - это уже заметное торможение триггера. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 14:10 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
iap, дело в том, что по бизнес логики данной задачи вставка всегда будет одна. Вставки будут происходить достаточно редко. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 14:23 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06дело в том, что по бизнес логики данной задачи вставка всегда будет одна. Вставки будут происходить достаточно редко. Поэтому создание говнокода разрешаю. Печать, дата, подпись. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 14:32 |
|
Для процедуры в качестве параметра User-Defines Table Types
|
|||
---|---|---|---|
#18+
beaver06, тогда укажите хотя бы в начале кода IF @@ROWCOUNT!=1 ROLLBACK TRANSACTION ELSE BEGIN ... END какая-никакая, а подстраховка ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 14:40 |
|
|
start [/forum/topic.php?all=1&fid=46&tid=1707588]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
162ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
82ms |
get tp. blocked users: |
2ms |
others: | 238ms |
total: | 533ms |
0 / 0 |