Выполнять хранимую процедуру только один раз, значение жесткого кода

У меня есть 50 пакетов Biztalk, и мне нужно регистрировать в отдельной таблице, когда пакет выполняется.

Я очень хорошо знаю, что база данных Biztalk ведет журнал, поэтому не предоставляйте это как решение.

Мое определение таблицы:

CREATE TABLE [dbo].[BiztalkLog]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [BiztalkPackageID] [int] NULL,
    [RunDate] [datetime] NULL,

    CONSTRAINT [PK_BiztalkLog] 
       PRIMARY KEY CLUSTERED ([ID] ASC)
           WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
                 IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, 
                 ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

Моя хранимая процедура:

CREATE PROCEDURE [dbo].[InsertBiztalkLog]
    @BiztalkPackageID AS INT
AS 
    INSERT INTO dbo.BiztalkLog(BiztalkPackageID)
        SELECT @BiztalkPackageID
GO

Вопросы:

  1. Как жестко закодировать значение BiztalkPackageID внутри оркестровки? Поэтому, когда хранимая процедура выполняется один раз, она будет знать, какое значение передать.

  2. Как выполнить хранимую процедуру только один раз внутри оркестровки?


person Internet Engineer    schedule 05.01.2016    source источник
comment
Здесь не хватает информации. Вы спрашиваете, как вообще вызвать хранимую процедуру из оркестровки BizTalk? Вы имеете дело с циклом в оркестровке, и вам нужно вызвать SP перед циклом? Вас беспокоит параллельное выполнение оркестровок, и вы хотите, чтобы только одна из них (или первая выполняющаяся) вызывала этот SP? Другими словами, вы спрашиваете о правильном использовании шаблона проектирования или вы спрашиваете о том, как технически выполнить вызов SP из BizTalk? Вы просто не знаете, как вручную создать сообщение в оркестровке?   -  person Dan Field    schedule 06.01.2016
comment
Если вы спрашиваете, как выполнить SP из BizTalk, см. раздел stackoverflow.com/questions/32970296/   -  person Dan Field    schedule 06.01.2016
comment
Перед циклом в единой оркестровке. Мне нужно знать, как создать сообщение с жестко закодированным значением, которое будет выполнять хранимую процедуру с использованием WCF. Правильный шаблон degin также будет оценен по достоинству.   -  person Internet Engineer    schedule 06.01.2016
comment
Итак, вы в основном пытаетесь использовать InsertBiztalkLog для регистрации времени начала оркестровки?   -  person Dan Field    schedule 06.01.2016
comment
На этот вопрос да, как мне жестко закодировать значение внутри оркестровки, а затем выполнить хранимую процедуру. Но мое приложение Biztalk позже импортирует данные (которые работают).   -  person Internet Engineer    schedule 06.01.2016


Ответы (2)


Создайте экземпляр XML-сообщения вызова хранимой процедуры; поскольку это очень маленькое и простое сообщение, я бы установил его как шаблон в вспомогательном классе C#:

public static string biztalkLogTemplate = @"<ns0:BiztalkLog xmlns:ns0=""http://schemas.microsoft.com/Sql/2008/05/Procedures/dbo"">
  <ns0:BizTalkPackageID>{0}</ns0:BizTalkPackageID>
</ns0:BiztalkLog>";

public static XmlDocument GetBiztalkLog(int packageId)
{
   XmlDocument xdoc = new XmlDocument();
   xdoc.LoadXml(string.Format(biztalkLogTemplate, packageId));
}

Затем в оркестровке добавьте сообщение (msgLogProc), настроенное на использование схемы для вашей хранимой процедуры, и в выражении сообщения конструкции:

msgLogProc = GetBiztalkLog(1); // whatever ID this orchestration is supposed to use.

Затем вы можете настроить порт в оркестровке и привязать его (прямой или статический) к порту отправки для вашей процедуры SQL. Используйте форму Send, чтобы отправить msgLogProc на этот порт. Если вы сделаете эту отправку один раз перед формой цикла, процедура будет вызываться только один раз за выполнение оркестрации. Если вам нужно, чтобы это было один раз по какому-то другому стандарту (только первое выполнение дня или партии?), вам нужен другой шаблон. Однако вы, вероятно, захотите обработать это на стороне SQL, сохраняя информацию о том, уже ли оркестровка что-то записывала в журнал для этого конкретного пакета (возможно, с использованием антисоединения, т. е. INSERT ... WHERE NOT EXISTS (...).

Есть несколько других способов создания сообщений в оркестровках, но я считаю, что это самый простой способ справиться с небольшими сценариями, подобными этому.

person Dan Field    schedule 07.01.2016

Ну, вопросы не имеют особого смысла. Возможно, вам придется предоставить более подробную информацию.

  1. Ну, ты просто делай. Как вы создаете сообщение запроса?

  2. Позвонив всего один раз. Почему у вас возникла ситуация, когда это можно было бы назвать более одного раза.

Извините, я должен напомнить вам, что проще запросить базу данных отслеживания. Кроме того, рассматривали ли вы возможность внутреннего ведения журнала каждой из хранимых процедур? Это я бы посчитал более правильным решением.

person Johns-305    schedule 05.01.2016
comment
Допустим, все 50 пакетов импортируют данные в базу данных x. Некоторые пакеты импортируют csv, другие xls или txt. Перед импортом мне нужно зарегистрировать выполнение пакета. Пункт № 2 просто убедиться, что читатель понимает, что хранимая процедура должна выполняться только один раз внутри Orchestration. - person Internet Engineer; 05.01.2016
comment
Это пакеты SSIS? - person Johns-305; 05.01.2016
comment
Нет, это пакеты Biztalk. Кстати, знаете ли вы, как выполнить хранимую процедуру только один раз внутри оркестровки Biztalk и жестко закодировать значение? Потому что это то, что я пытаюсь выяснить..... - person Internet Engineer; 05.01.2016
comment
Что именно вы имеете в виду под «пакетом»? Нет ничего, что я BizTalk назвал «пакетом»? Да, позвонив только один раз. Вопрос озадачивает, потому что вам нужно работать, чтобы вызвать его более одного раза. Один раз - это то, что происходит обычно. - person Johns-305; 06.01.2016
comment
Мои плохие слова о пакетах, я увлекся множеством книг и статей, которые называют их пакетами Biztalk Books.google.com/ - person Internet Engineer; 06.01.2016
comment
Позвольте мне спросить вас кое-что, если я импортирую файл с помощью biztalk, и импорт использует хранимую процедуру для вставки, и файл имеет 10 строк, и все компоненты находятся внутри оркестровки. Сколько раз выполняется хранимая процедура? Возможные ответы (один или десять раз) - person Internet Engineer; 06.01.2016
comment
Это зависит от того, как вы это реализуете. BizTalk не вызывает хранимую процедуру, это делает ваше приложение. Итак, ваше приложение вызывает хранимую процедуру ровно столько раз, сколько вы запрограммировали. В вашем случае ответ может быть 1 или 10, в зависимости от того, что вы делаете. - person Johns-305; 06.01.2016