powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Для процедуры в качестве параметра User-Defines Table Types
44 сообщений из 44, показаны все 2 страниц
Для процедуры в качестве параметра User-Defines Table Types
    #38212548
beaver06
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Для процедуры в качестве параметра User-Defines Table Types
    #38212551
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beaver06Подскажите, как можно обойти данную ошибку.
Поставить после команды CREATE TYPE разделитель пакетов GO
...
Рейтинг: 0 / 0
Для процедуры в качестве параметра User-Defines Table Types
    #38212554
beaver06
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Glory,

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

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

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

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

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

а что должна вывести команда print 'ParseMessage' + '00001 '+@inserted для табличной переменной?
...
Рейтинг: 0 / 0
Для процедуры в качестве параметра User-Defines Table Types
    #38212586
beaver06
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Для процедуры в качестве параметра User-Defines Table Types
    #38212590
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Для процедуры в качестве параметра User-Defines Table Types
    #38212595
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beaver06Т.е. в триггере должна выполняться процедура, которая в которой вторая часть = MessageType
Вы серьезно считаете, что таблицы можно использовать в любой команде ?
Я вас разочарую
К табличным переменным можно применять только теже DML команды, что и к обычным таблицам
...
Рейтинг: 0 / 0
Для процедуры в качестве параметра User-Defines Table Types
    #38212597
beaver06
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxx,

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

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


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

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

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

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

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

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

по моей. А разве это не так?
Если вставку делать по одной строке, то и в триггере в таблице inserted всегда будет одна строка. Это не так?
...
Рейтинг: 0 / 0
Для процедуры в качестве параметра User-Defines Table Types
    #38212749
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beaver06Если вставку делать по одной строке, то и в триггере в таблице inserted всегда будет одна строка. Это не так?
А если вставка не по одной строке, то тогда в таблице inserted все равно будет одна запись, да ?
...
Рейтинг: 0 / 0
Для процедуры в качестве параметра User-Defines Table Types
    #38212750
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beaver06Гавриленко Сергей Алексеевич,

по моей. А разве это не так?
Если вставку делать по одной строке, то и в триггере в таблице inserted всегда будет одна строка. Это не так?А как вы запретили делать вставку более, чем по одной строке за раз?
...
Рейтинг: 0 / 0
Для процедуры в качестве параметра User-Defines Table Types
    #38212751
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beaver06invm,

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

по моей. А разве это не так?
Если вставку делать по одной строке, то и в триггере в таблице inserted всегда будет одна строка. Это не так?Почему это я не могу вставить один миллион строк одним INSERTом?
...
Рейтинг: 0 / 0
Для процедуры в качестве параметра User-Defines Table Types
    #38212768
beaver06
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у меня по бизнес логике вставка по одной строке. В таком случае в inserted может быть больше одной строки?
...
Рейтинг: 0 / 0
Для процедуры в качестве параметра User-Defines Table Types
    #38212771
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beaver06у меня по бизнес логике вставка по одной строке.
Это вы про ваше клиентское ПО ?
Или про команду insert ?

beaver06В таком случае в inserted может быть больше одной строки?
Когда добавляется больше одной строки
...
Рейтинг: 0 / 0
Для процедуры в качестве параметра User-Defines Table Types
    #38212779
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beaver06у меня по бизнес логике вставка по одной строке. В таком случае в inserted может быть больше одной строки?Что Вам мешает представить себе, что строк много?
Это best practice!
...
Рейтинг: 0 / 0
Для процедуры в качестве параметра User-Defines Table Types
    #38212797
beaver06
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При такой вставке может быть в таблице 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)
...
Рейтинг: 0 / 0
Для процедуры в качестве параметра User-Defines Table Types
    #38212809
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beaver06При такой вставке может быть в таблице inserted больше одной строки?А как вы гарантировали, что кроме этой вставки завтра или послезавтра не появится еще какая-нибудь, или кто-то вообще возьмет и напрямую не зальет в таблицу пару миллионов записей? Зачем писать кривой триггер, который сегодня при некоторых условиях работает, а завтра сломается или чепуху делать будет? Чтобы заказчик почаще обращался?
...
Рейтинг: 0 / 0
Для процедуры в качестве параметра User-Defines Table Types
    #38212815
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beaver06При такой вставке может быть в таблице inserted больше одной строки?
Еще один не читатель.
...
Рейтинг: 0 / 0
Для процедуры в качестве параметра User-Defines Table Types
    #38212850
beaver06
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap,

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

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

Ни в коем случае!
Работать с данными в таблицах deleted и inserted в предположении, что в них сколько угодно записей.
С помощью запросов, которые в SQL обычно предназначены для операций со множествами,
которые представлены таблицами.

Рекомендую на время забыть про циклы, курсоры и т.п.
...
Рейтинг: 0 / 0
Для процедуры в качестве параметра User-Defines Table Types
    #38212861
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beaver06,

вместо Вас по циклу должен бегать сервер.
Достаточно лишь послать ему запрос, в котором сказано, что Вы хотите получить.
Как получить - пусть сервер решает сам!
...
Рейтинг: 0 / 0
Для процедуры в качестве параметра User-Defines Table Types
    #38212875
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя, если действительно надо вызвать процедуру для каждой строки,
то да, придётся передавать ей копию inserted или создавать курсор+цикл, что крайне нежелательно.

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

дело в том, что по бизнес логики данной задачи вставка всегда будет одна.
Вставки будут происходить достаточно редко.
...
Рейтинг: 0 / 0
Для процедуры в качестве параметра User-Defines Table Types
    #38212922
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beaver06дело в том, что по бизнес логики данной задачи вставка всегда будет одна.
Вставки будут происходить достаточно редко.
Поэтому создание говнокода разрешаю.
Печать, дата, подпись.
...
Рейтинг: 0 / 0
Для процедуры в качестве параметра User-Defines Table Types
    #38212939
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beaver06, тогда укажите хотя бы в начале кода IF @@ROWCOUNT!=1 ROLLBACK TRANSACTION ELSE BEGIN ... END
какая-никакая, а подстраховка
...
Рейтинг: 0 / 0
Для процедуры в качестве параметра User-Defines Table Types
    #38213021
beaver06
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007,

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


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