2
DECLARE @PaymentTime VARCHAR (50)

DECLARE @DueDate VARCHAR (50)
DECLARE @CustomerID int

DECLARE MYCURSOR5 CURSOR 
FOR SELECT   distinct  Payment.PaymentTime,Invoice.DueDate, Customer.CustomerID
FROM         Cus_Cred_Terms INNER JOIN
                      Customer ON Cus_Cred_Terms.CustomerID = Customer.CustomerID INNER JOIN
                      Payment ON Customer.CustomerID = Payment.CustomerID INNER JOIN
                      Invoice ON Payment.InvoiceID = Invoice.InvoiceID


open MYCURSOR5 

FETCH MYCURSOR5 INTO @PaymentTime, @DueDate, @CustomerID

WHILE @@FETCH_STATUS = 0
BEGIN 


if(@PaymentTime > @DueDate)
begin
print'payment time:'
PRINT @PaymentTime 
print'due date:'
PRINT @DueDate 

print''
print @CustomerID
print''
update dbo.Cus_Cred_Terms
set dbo.Cus_Cred_Terms.CreditAllowed = 0
FROM Cus_Cred_Terms INNER JOIN
 Customer ON Cus_Cred_Terms.CustomerID = Customer.CustomerID INNER JOIN
 Payment ON Customer.CustomerID = Payment.CustomerID
 where Customer.CustomerID = @CustomerID and dbo.Cus_Cred_Terms.CreditAllowed = 1
end



FETCH MYCURSOR5  INTO @PaymentTime, @DueDate, @CustomerID

END
CLOSE MYCURSOR5

各フィールドをループして、DueDate が実際の PaymentDate よりも小さいかどうかを確認し、小さい場合は、別のテーブルのフィールドを 0 (クレジットが許可されている場合は 1、クレジットが許可されていない場合は 0) に設定します。

問題は、これを行うためにカーソルを使用しないようにすることはできますか? さらに情報が必要な場合は、お問い合わせください。

4

1 に答える 1

1

次のようなものを試してください。

;WITH CTE AS 
(
    SELECT DISTINCT  
        Customer.CustomerID
    FROM         
        Cus_Cred_Terms 
    INNER JOIN
        Customer ON Cus_Cred_Terms.CustomerID = Customer.CustomerID 
    INNER JOIN
        Payment ON Customer.CustomerID = Payment.CustomerID 
    INNER JOIN
        Invoice ON Payment.InvoiceID = Invoice.InvoiceID
    WHERE
        Payment.PaymentTime > Invoice.DueDate
)
UPDATE
    dbo.Cus_Cred_Terms
SET
    dbo.Cus_Cred_Terms.CreditAllowed = 0
FROM 
    CTE 
WHERE 
    dbo.Cus_Cred_Terms.CustomerID = CTE.CustomerID
    AND dbo.Cus_Cred_Terms.CreditAllowed = 1

CTE(共通テーブル式)には、基本的にSELECTカーソルが持っていたものがあります。ただし、制約もチェックしますPayment.PaymentTime > Invoice.DueDate。この基準に一致する顧客IDのみが選択されます。

これらのCustomerID値から、そのテーブルのこの列が1に等しいdbo.Cus_Cred_Terms場合、テーブルが更新されます。CreditAllowedCustomerID

于 2012-11-22T16:39:40.390 に答える