2015-06-10 150 views
0

在下面的代码中,我使用了单个@partyID=750004,但现在该场景需要使用更多@partyID。 FYI像750005,750007,750009,7500011 ...如何在存储过程中使用每个存储过程?

我怎么能循环使用“对于每个”

BEGIN TRY 
BEGIN TRAN 
Declare @partyID bigint = 750004 
    IF NOT EXISTS (SELECT * FROM [QAdmin].[PartyLicenseInfo] WHERE PartyId = @partyID AND [State]='SC') 
    BEGIN 
     INSERT INTO QAdmin.PartyLicenseInfo (PartyId, [State], LicenseNumber, LicenseExpirationDate, CreatedBy, CreatedDate, ModifiedBy, ModifiedDate) 
     VALUES (@partyID, 'SC', 'SC1234', getdate()+360, 0, GETDATE(), null, null) 
    END 
    ELSE 
    BEGIN 
     UPDATE [QAdmin].[PartyLicenseInfo] SET LicenseExpirationDate = getdate()+360, ModifiedBy = 0, ModifiedDate = GETDATE() 
          WHERE PartyId = @partyID AND [State]='SC' 
    END 
COMMIT TRAN 
END TRY 
BEGIN CATCH 
    ROLLBACK TRAN 
END CATCH 
+0

使用表格类型并获取所有标识符以检查条件 – mohan111

回答

0

你似乎想用光标。尽管大多数情况下最好使用基于集合的解决方案,但有些时候CURSOR是最佳解决方案。不知道更多关于你的真正的问题,我们不能帮你不止于此:

DECLARE @PractitionerId int 

DECLARE MY_CURSOR CURSOR 
    LOCAL STATIC READ_ONLY FORWARD_ONLY 
FOR 
SELECT DISTINCT PractitionerId 
FROM Practitioner 

OPEN MY_CURSOR 
FETCH NEXT FROM MY_CURSOR INTO @PractitionerId 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    --Do something with Id here 
    PRINT @PractitionerId 
    FETCH NEXT FROM MY_CURSOR INTO @PractitionerId 
END 
CLOSE MY_CURSOR 
DEALLOCATE MY_CURSOR 
1
DECLARE cur CURSOR FOR 

SELECT partyid from table1 // @partyID like 750005,750007,750009,7500011 

FETCH NEXT FROM cur INTO @partyID 

WHILE (@@FETCH_STATUS=0) 
BEGIN 

    IF NOT EXISTS (SELECT * FROM [QAdmin].[PartyLicenseInfo] WHERE PartyId = @partyID AND [State]='SC') 
     BEGIN 
       INSERT INTO QAdmin.PartyLicenseInfo (PartyId, [State], LicenseNumber, LicenseExpirationDate, CreatedBy, CreatedDate, ModifiedBy, ModifiedDate) 
       VALUES (@partyID, 'SC', 'SC1234', getdate()+360, 0, GETDATE(), null, null) 
     END 
    ELSE 
     BEGIN 
       UPDATE [QAdmin].[PartyLicenseInfo] SET LicenseExpirationDate = getdate()+360, ModifiedBy = 0, ModifiedDate = GETDATE() 
       WHERE PartyId = @partyID AND [State]='SC' 
     END 

FETCH NEXT FROM cur INTO @partyID 

END 

CLOSE cur 
DEALLOCATE cur 
0

最好的办法是摆脱光标并使用基于集合的方法来代替。

首先,声明表变量来存储所有ID:

DECLARE @partyID TABLE (partyID int) 

INSERT INTO @partyID VALUES 
(750005),(750007),(750009),(7500011) 

然后使用这个表变量进行INSERT INTO SELECTUPDATE操作:

INSERT INTO QAdmin.PartyLicenseInfo (PartyId, [State], LicenseNumber, 
      LicenseExpirationDate, CreatedBy, CreatedDate, ModifiedBy, 
      ModifiedDate) 
SELECT partyID, 'SC', 'SC1234', getdate()+360, 0, GETDATE(), null, null 
FROM @partyID AS p1 
WHERE NOT EXISTS (SELECT 1 
        FROM [QAdmin].[PartyLicenseInfo] AS p2 
        WHERE p2.PartyId = p1.partyID AND [State]='SC') 

以上将插入新的记录PartyLicenseInfo只有如果您的原始NOT EXISTS条款返回TRUE

UPDATE p1 
SET 
    LicenseExpirationDate = getdate()+360, ModifiedBy = 0, 
    ModifiedDate = GETDATE() 
FROM [QAdmin].[PartyLicenseInfo] AS p1 
INNER JOIN @partyID AS p2 ON p1.PartyID = p2.partyID 
WHERE [State]='SC' 

具有包含在@partyID[State]='SC'PartyIDPartyLicenseInfo的上述将更新记录。

相关问题