C# 是否可以将sql存储过程重写为c代码?
我的数据库中有sql存储过程。在此存储过程中调用SQLCLR函数。但我想在不支持SQLCLR的Azure云上迁移。所以我需要去掉这个sql存储过程C# 是否可以将sql存储过程重写为c代码?,c#,sql,sql-server,tsql,stored-procedures,C#,Sql,Sql Server,Tsql,Stored Procedures,我的数据库中有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 IN
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新手,所以我不知道这可能吗?这不可能。您必须阅读sql代码并理解其逻辑。然后你应该写代码,我相信你可以做类似的事情,所以答案是肯定的。下一个问题?但是,就目前情况而言,这个问题太广泛,不太适合StackOverflow。您还需要调用dbo.HandleNextCampaign存储过程,或者重写它。如果存储过程调用CLR存储过程,则不允许使用CLR存储过程。因此我需要替换这个存储过程吗?这不是正确的反应,因此我需要替换CLR存储过程吗?是的,可以。此存储过程实际执行的是dbo.HandleNextCampaign,如果成功,则将已完成的任务-[CampaignID]、[ContactID]、[InstantilyRecipientId]插入到SSCONTACTS\u新表中。通过利用命名空间System.Data,可以使用C DataTable重新创建此过程。只需创建一个循环并添加它们。