Microsoft SQL Serverのみカーソル -- sql-server フィールド 関連 問題

Microsoft SQL Server only cursor












0
vote

問題

日本語

カーソルを使用して上級させたい。下の小さなテーブルがあり、基本的に私がやりたいことはMS SQL Serverにカーソルを書いて2つの日付記録を比較することです。違いが2つの日付から5日未満の場合、私は2つの日付の早い段階を維持したいです。両方の日付が5日以上離れている場合は、両方を保持し、カーソルは次のレコードと次のレコードを比較し続けるべきです。しかし、私が意図したように機能していません。カーソルから探している出力は、「維持」という単語を持つレコードを持つFinal14と呼ばれるテーブルです。

私はどの日付を維持するべきかを示すために3番目の列を追加しました。

SQL列

<事前> <コード> Name Date Mary 2/2/2016 Keep Mary 2/3/2016 Delete Mary 2/5/2016 Keep Mary 2/11/2016 keep Mary 2/17/2016 Keep Mary 2/19/delete delete

下のマイカーソル:

<事前> <コード> /* CREATE TABLE FIND14 --DROP TABLE FIND14 ( Name NVARCHAR(20) , DATE1 DATETIME ) ; CREATE TABLE FINAL14 ( Name NVARCHAR(20) , DATE1 DATETIME ) INSERT INTO FIND14(Name, DATE1) VALUES('Mary', '2/2/2016'), ('Mary', '2/3/2016'), ('Mary', '2/5/2016'), ('Mary', '2/11/2016') , ('Mary', '2/17/2016'), ('Mary', '2/19/2016') */ TRUNCATE TABLE FINAL14; DECLARE @Member1 NVARCHAR(20), @SD1 DATETIME DECLARE @Member2 NVARCHAR(20), @SD2 DATETIME DECLARE CDATE CURSOR FOR SELECT Name, DATE1 FROM FIND14 ORDER BY DATE1 OPEN CDATE FETCH NEXT FROM CDATE INTO @Member1, @SD1 FETCH NEXT FROM CDATE INTO @Member2, @SD2 WHILE(@@FETCH_STATUS = 0) BEGIN IF DATEDIFF(dd, @SD1, @SD2) < 5 BEGIN INSERT INTO FINAL14 SELECT @Member1, @SD1 FROM FIND14 END ELSE IF DATEDIFF(dd, @SD1, @SD2) >= 5 BEGIN INSERT INTO FINAL14 SELECT DISTINCT @Member1, @SD1 FROM FIND14 ; INSERT INTO FINAL14 SELECT DISTINCT @Member2, @SD2 FROM FIND14 END FETCH NEXT FROM CDATE INTO @Member1, @SD1 END CLOSE CDATE DEALLOCATE CDATE ; SELECT * FROM FIND14

;

出力は次のようになります。

<事前> <コード> Name Date Mary 2/2/2016 Keep Mary 2/5/2016 Keep Mary 2/11/2016 keep Mary 2/17/2016 Keep
英語

I want to get advanced with using Cursor, only. I have a small table below and basically what I want to do is write a cursor in MS SQL Server to compare two date records. If the difference is less than 5 days between the two dates then I want to keep the earlier of the two dates. If both dates are more than 5 days apart then I want to keep both and the cursor should continue comparing the next record and so on. However it's not working as I intended. The output that I am looking for from the Cursor is a table called Final14 with the records that has the word "Keep" next to it.

I added a third column to show which date should be kept.

SQL Columns

Name    Date     Mary    2/2/2016    Keep Mary    2/3/2016    Delete Mary    2/5/2016    Keep Mary    2/11/2016   keep Mary    2/17/2016   Keep Mary    2/19/delete delete 

My Cursor below:

/* CREATE TABLE FIND14 --DROP TABLE FIND14 (     Name NVARCHAR(20)     , DATE1 DATETIME ) ;  CREATE TABLE FINAL14 (     Name NVARCHAR(20)     , DATE1 DATETIME )  INSERT INTO FIND14(Name, DATE1) VALUES('Mary', '2/2/2016'), ('Mary', '2/3/2016'), ('Mary', '2/5/2016'), ('Mary', '2/11/2016') , ('Mary', '2/17/2016'), ('Mary', '2/19/2016') */  TRUNCATE TABLE FINAL14;  DECLARE @Member1 NVARCHAR(20), @SD1 DATETIME DECLARE @Member2 NVARCHAR(20), @SD2 DATETIME  DECLARE CDATE CURSOR FOR      SELECT Name, DATE1     FROM FIND14       ORDER BY DATE1  OPEN CDATE      FETCH NEXT FROM CDATE INTO @Member1, @SD1      FETCH NEXT FROM CDATE INTO @Member2, @SD2   WHILE(@@FETCH_STATUS = 0)      BEGIN          IF DATEDIFF(dd, @SD1, @SD2) < 5              BEGIN                  INSERT INTO FINAL14                      SELECT @Member1, @SD1                     FROM FIND14              END          ELSE               IF DATEDIFF(dd, @SD1, @SD2) >= 5              BEGIN                      INSERT INTO FINAL14                      SELECT DISTINCT @Member1, @SD1                     FROM FIND14                     ;                      INSERT INTO FINAL14                      SELECT DISTINCT @Member2, @SD2                     FROM FIND14              END  FETCH NEXT FROM CDATE INTO @Member1, @SD1 END  CLOSE CDATE DEALLOCATE CDATE ;  SELECT * FROM FIND14 

;

OUTPUT should look like this:

Name    Date     Mary    2/2/2016    Keep Mary    2/5/2016    Keep Mary    2/11/2016   keep Mary    2/17/2016   Keep 
</div
  
         
         

回答リスト

0
 
vote
vote
ベストアンサー
 

挿入の場合は、変数のみを挿入しているので、選択の代わりに値を使用してください。

<事前> <コード> INSERT INTO FINAL14 VALUES (@Member1, @SD1) ;

編集:

大丈夫、私はあなたが常に比較を行った後に次の行のペアにスキップしたいことを理解してから、次の行のペアを取得するためにループの最後に行を追加する必要があります。次の行だけです。だからあなたはこれを置き換える必要があります:

<事前> <コード> FETCH NEXT FROM CDATE INTO @Member1, @SD1 END

これで:

<事前> <コード> FETCH NEXT FROM CDATE INTO @Member1, @SD1 FETCH NEXT FROM CDATE INTO @Member2, @SD2 END

ループを起動する前にしているだけです。

 

For your inserts, since you are inserting only variables, use VALUES instead of SELECT:

                INSERT INTO FINAL14                 VALUES (@Member1, @SD1)                 ; 

EDIT:

Okay, now that I understand that you always want to skip to the next PAIR of rows after doing a comparison, then you just need to add a line at the end of your loop to fetch the next PAIR of rows, and not just the next row. So you need to replace this:

    FETCH NEXT FROM CDATE INTO @Member1, @SD1  END 

With this:

    FETCH NEXT FROM CDATE INTO @Member1, @SD1      FETCH NEXT FROM CDATE INTO @Member2, @SD2  END 

Just like you do before you start the loop.

</div
 
 
       
       

関連する質問

26  SQL全文索引付けが#を含む単語の結果を返すのはなぜですか?  ( Why doesnt sql full text indexing return results for words containing ) 
例えば、SQL Server 2005を使用して、次のようなマイクエリは次のようなものです。 <事前> <コード> SELECT * FROM Table WHERE FREETEXT(SearchField, 'c#') 使用時に結果を返す列Searc...

146  SQL Serverテーブルへの変更を確認してください。  ( Check for changes to an sql server table ) 
トリガを使用せずにテーブルへの変更のためにSQL Serverデータベースを監視する方法やデータベースの構造を変更する方法はありますか。私の優先プログラミング環境は、 .NET とc#。 私は SQL Server 2000 SP4以降をサポートできるように...

88  SQL Server 2005からMySQLにデータをエクスポートする方法[閉じた]  ( How to export data from sql server 2005 to mysql ) 
閉じたこの質問はオフトピックです。現在答えを受け付けていません。 この質問を改善したいですか?質問を更新するスタックオーバーフロ...

30  複数のユーザーによるデータベースレコードの編集  ( Editing database records by multiple users ) 
私はデータベーステーブル(MS SQL Server上で正規化された)を設計し、一握りのユーザーが情報を追加および編集するために使用されるアプリケーションのスタンドアロンウィンドウのフロントエンドを作成しました。後日の生産域の検索を許可するためのWebインター...

27  Windows Server 2008 "Server Core"はSQL Serverインスタンスに適していますか?  ( Is windows server 2008 server core appropriate for a sql server instance ) 
今週のWindows Server 2008で専用のSQL Server 2005ボックスを設定しています。 その最後に、 "Server Core"オプションは魅力的に聞こえますが、そのSQL ServerがそのSKUで実行できるかどうかは明確ではありません...

37  SQL Server 6.5のアップグレード  ( Upgrading sql server 6 5 ) 
はい、私は知っています。 2008年の SQL Server 6.5 の実行中のコピーの存在は不合理です。 その規定された、 6.5 から<コード> 2005 に移行する最善の方法は何ですか?直接パスはありますか?私が見つけたほとんどのドキュメント 6.5 ...

30  TestからLiveにSQL Serverデータベースを展開する  ( Deploying sql server databases from test to live ) 
2つのSQLサーバ、特にSQL Server 2005間のデータベースの展開を管理する方法を疑問に思います。 今、開発とライブのものがあります。これはBuildScriptの一部(標準のWindowsバッチ、それらのスクリプトの現在の複雑さでさえも、Powe...

14  クライアント照合とSQL Server 2005  ( Client collation and sql server 2005 ) 
Win2k/SQL Server 2k から Windows 2003 and SQL Server 2005 への既存のプログラムをアップグレードしています。 2k3/2k5 を使用する新しいプログラムを購入します。ベンダーは、ソフトウェアクライアントが...

87  SQL Server 2005 MySQLの実装は?  ( Sql server 2005 implementation of mysql replace into ) 
MySQLには、これが非常に便利な REPLACE INTO sqlコマンドを持っています。 これはSQL Server 2005で簡単にエミュレートできますか? 新しいトランザクションの開始、<コード> Select() 、次に<コード> UPDATE...

321  SQL Serverデータベースのバージョン管理  ( Versioning sql server database ) 
バージョン管理下でデータベースを取得したい。誰かが私を始めたアドバイスや推奨記事を持っていますか? 常に少なくとものデータをデータにしたいのですが( alumb 説明:ユーザータイプと管理者)。また、パフォーマンス測定のために生成されたテストデータの大規模なコ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有