0

プロパティのリース契約のレコードを保存しているテーブルがあります。レコードは次のように保存されます。

ID|PropertName|ContractStartDate|ContractEndDate|Status
 1| pqr     | 5/17/2012       | 5/17/2013     |leased
 2| xyz     | 10/25/2012      | 10/25/2013    |leased
 3| lmn     | 4/21/2012       | 4/21/2013     |leased   
 4| efg     | 4/22/2012       | 4/22/2013     |leased

ここで、今日の日付を確認するストア プロシージャを作成ContractEndDateし、有効期限が切れている場合は、前のレコードと同じ値を持つがステータスが期限切れの新しいレコードをデータベースに追加します。

これは、その後、私のテーブルがどのように見えるかです:

    ID|PropertName|ContractStartDate|ContractEndDate|Status
     1|   pqr     | 5/17/2012       | 5/17/2013     |leased
     2|   xyz     | 10/25/2012      | 10/25/2013    |leased
     3|   lmn     | 4/21/2012       | 4/21/2013     |leased   
     4|   efg     | 4/22/2012       | 4/22/2013     |leased
     5|   lmn     | 4/21/2012       | 4/21/2013     |expired
     6|   efg     | 4/22/2012       | 4/22/2013     |expired

私はこの投稿に従おうとしています: SQL to copy row and change 1 column value but I get syntax error for select sub query.

カーソルとトリガーを使用してこれを解決できますか? 私はカーソルとトリガーの知識がほとんどないので、サンプルのようなものは大歓迎です。ありがとう

4

3 に答える 3

2
DECLARE Cur CURSOR FOR
SELECT ID,PropertName,ContractStartDate,ContractEndDate,Status From TABLE_NAME

Open Cur
Declare @Id AS INT
DECLARE @PropertName AS VarChar(Max)
DECLARE @ContractStartDate AS DATETIME 
DECLARE @ContractEndDate AS DATETIME 
DECLARE @Status AS Varchar(80)
Fetch Next from Cur INTO @Id,@PropertName,@ContractStartDate,@ContractEndDate,@Status

While(@@fetch_status=0)
BEGIN
    IF(GETDATE() > @ContractEndDate)
    BEGIN
        DECLARE @newID bigint 
        set @newID = (select max(ID) FROM TABLE_NAME)
        INSERT INTO TABLE_NAME(ID,PropertName,ContractStartDate,ContractEndDate,Status)
        VALUES (@newID+1,@PropertName,@ContractStartDate,@ContractEndDate,'expired' )
        Fetch Next from Cur INTO @Id,@PropertName,@ContractStartDate,@ContractEndDate,@Status   
    END
    Fetch Next from Cur INTO @Id,@PropertName,@ContractStartDate,@ContractEndDate,@Status   
END

Close Cur
Deallocate Cur
于 2013-04-23T07:29:49.773 に答える
1

あなたは簡単にできますINSERT..... SELECT. IDあなたがIDENTITY列であると仮定します。

INSERT INTO TABLE1(PropertName,ContractStartDate,ContractEndDate,Status)
SELECT PropertName, ContractStartDate, ContractEndDate, 'expired' 
FROM TABLE1 
WHERE GETDATE() > CONTRACTENDDATE

SQL フィドルのデモ

于 2013-04-22T06:55:37.757 に答える
1

これはカーソルで解決できます。

Step 1:  Open cursor with the select statement.(select * from table where ContractEndDate = sysdate)
Step 2: Loop the cursor
        Insert the values as 
        insert into table (ID,PropertName,ContractStartDate ,ContractEndDate,Status) values (newid, cursorVariable.PropertName,... , 'expired');

Step 3: End of the loop / with in the loop commit the transaction.
于 2013-04-22T06:14:07.417 に答える