У меня есть хранимая процедура sql в моей базе данных. В этой хранимой процедуре вызывается функция SQLCLR. Но я хочу перейти в облако Azure, которое не поддерживает SQLCLR. Поэтому мне нужно избавиться от этой хранимой процедуры sql.
CREATE PROCEDURE [dbo].[ProcessCampaignRecipients]
AS
BEGIN
DECLARE @Campaigns TABLE (RowNumber INT IDENTITY(1,1),CampaignID INT, OwnerID INT, IsProcessed BIT, AccountID INT)
DECLARE @campaignsCount INT
INSERT INTO @Campaigns
SELECT CampaignID, CreatedBy,0, AccountID FROM Campaigns C (NOLOCK) WHERE C.IsDeleted = 0 AND C.ScheduleTime < GETUTCDATE() AND C.CampaignStatusID IN (102,106) AND (C.IsRecipientsProcessed = 0 or C.IsRecipientsProcessed is null) ORDER BY C.ScheduleTime
ASC
SELECT @campaignsCount = (SELECT COUNT(*) from @Campaigns)
DECLARE @RowNumber INT = 1
WHILE @RowNumber <= @campaignsCount
BEGIN
DECLARE @DeleteCounter INT = 5000
DECLARE @CampaignID INT
DECLARE @OwnerID INT
DECLARE @AccountID INT
DECLARE @SSContacts dbo.Contact_List
DECLARE @serviceUri VARCHAR (1024)
DECLARE @processResponse VARCHAR (1024)
DECLARE @isPrivate BIT
DECLARE @ssContactsCount INT
DECLARE @deleteIterations INT
SELECT @CampaignID = CampaignID, @OwnerID = OwnerID,@AccountID=AccountID FROM @Campaigns WHERE RowNumber = @RowNumber --order by CampaignID OFFSET 1 rows fetch next 1 rows only
SELECT @isPrivate= ISNULL((select top 1 IsPrivate from AccountDataAccessPermissions where accountid = @AccountID and ModuleID = 3),0)
SELECT @processResponse = ''
SELECT @OwnerID =
CASE @isPrivate
WHEN 0 THEN 0
WHEN 1 THEN @OwnerID
END
SELECT @serviceUri = Value FROM EnvironmentSettings (nolock) WHERE Name = 'SmarttouchServiceUri'
BEGIN TRY
INSERT INTO SSCONTACTS_NEW ([CampaignID],[ContactID],[MomentaryRecipientID])
SELECT [CampaignID],[ContactID],[MomentaryRecipientID] FROM [dbo].[MomentaryCampaignRecipients] (NOLOCK) WHERE campaignid = @CampaignID
print cast(@CampaignID as varchar(200))
EXEC dbo.HandleNextCampaign @CampaignID, @OwnerID , @SSContacts
UPDATE Campaigns SET IsRecipientsProcessed = 1 WHERE CampaignID = @CampaignID
DELETE @SSContacts
END TRY
BEGIN CATCH
UPDATE Campaigns SET CampaignStatusID = 110, IsRecipientsProcessed=0, Remarks = ERROR_MESSAGE(), ProcessedDate = GETUTCDATE() WHERE CampaignID = @CampaignID
END CATCH
WHILE @DeleteCounter = 5000
BEGIN
DELETE TOP(5000) FROM MomentaryCampaignRecipients WHERE CampaignID = @CampaignID
SET @DeleteCounter = @@ROWCOUNT
END
UPDATE @Campaigns SET IsProcessed = 1 WHERE RowNumber = @RowNumber
SET @RowNumber = @RowNumber + 1
END
END
Мне нужно переписать его как код C#. Я новичок в SQL, поэтому не знаю, возможно ли это?
Я уверен, что вы можете сделать что-то подобное, поэтому ответ - да. Следующий вопрос? Однако в нынешнем виде этот вопрос слишком широкий и не совсем подходит для Stackoverflow.
Вам также нужно будет либо вызвать хранимую процедуру dbo.HandleNextCampaign, либо переписать ее тоже.
«Эта хранимая процедура вызывает хранимую процедуру CLR, а хранимые процедуры CLR не разрешены. Поэтому мне нужно заменить хранимую процедуру это»? Разве не правильная реакция «Следовательно, мне нужно заменить хранимую процедуру CLR»?
Да, ты можешь. На самом деле эта хранимая процедура выполняет "dbo.HandleNextCampaign" и вставляет завершенные задачи - [CampaignID], [ContactID], [MomentaryRecipientID] в таблицу SSCONTACTS_NEW (в случае успеха). Вы можете воссоздать этот процесс с помощью таблицы данных C#, используя пространство имен: System.Data. Просто создайте петлю и добавьте их.
Да. Вы должны понять и отработать логику в C#, однако с точки зрения производительности это плохой выбор. Проверь это
я сбит с толку. Вы хотите переписать код SQLCLR как Stored Procedure или Stored Procedure как C#?
Сохраненная процедура как C#
Разве SQLCLR не является способом использования .net на SQL Server? Кажется, что процедура находится в TSQL, а не в .net. Вам вообще понадобится SQLCLR, и сможете ли вы запустить SQL в Azure в любом случае?





Это невозможно. Вы должны прочитать код sql и понять логику. Тогда вы должны написать код