c# - 是否可以将 sql 存储过程重写为 c# 代码?
问题描述
我的数据库中有 sql 存储过程。在这个存储过程中调用 SQLCLR 函数。但我想迁移到不支持 SQLCLR 的 Azure 云上。所以我需要摆脱这个 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 新手,所以我不知道这可能吗?
解决方案
推荐阅读
- android - Android ListView 在正常工作之前会出现几秒钟的故障
- ruby-on-rails - CanCanCan——如何停止对 /admin 的访问?
- java - Java NIO 无效路径问题;非法 <:>,由无效的前导字符引起
- mysql - executescalar:对象不能从 DBNull 转换为其他类型
- javascript - range 不是 lodash 中的函数?
- php - 如何从字符串中获取 rgb 出现并将它们转换为十六进制?
- node.js - 带有命名参数的“WHERE col IN”
- php - 使用 php 从 mysql 解析 xml longblob
- java - Android JNI 无法使用 dlopen 成功加载库 - 但它曾经
- django - 错误:Pidfile (celerybeat.pid) 已经存在