1

SQLSERVER(2008R2)に「Clients」というテーブルがあり、ClientIDとAddressがあります。次のようなクエリ/SPを作成したいと思います。

  1. アドレスのリストを受け取ります。
  2. これらのアドレスを持つレコードを削除します。
  3. 削除できない(行が見つからないなど)アドレスのリストを返します。
  4. 削除された行の数を返します。

私のアプリケーションはC#-ASP.NETベースのアプリケーションです。私は次の解決策を考えました:

  1. アドレスSPのリストを受け取るを作成し、それらを削除しようとします。削除できない場合は、ある種の配列/リストに追加します。-このソリューションに関する私の問題は、SQLSERVER(2008R2)でリストがどのように機能するかをよく知らないことです。

  2. で作業しDataTable、DBから必要なデータを選択し、で削除してSqlDataAdapter、で変更された行を確認しRowStateます。

私のデータベースの例:

Client ID    Address

111111111  'foo st. 2'

222222222  'foo bld 1'

333333333  'foo rd 22'

444444444  'foo st. 1'

入力の例:

input list{'foo st. 2','foo bld 1','foo st 22','foo st 1'}-最後の2つの項目は上の表に存在しないため、SP(または他の解決方法)を返したいと思います。

'Deleted rows: 2' //thats not a problem
'list of the records which weren't removed: {'foo st 22','foo st 1'} //thats a problem..

私が自分自身をできるだけ明確にしたことを願っています。

4

2 に答える 2

1

まず、DELETEステートメントを実行します。

sql="DELETE FROM TABLENAME where Col1='Something'";

そして、SELECTステートメントを実行した後、削除されていない行のリストを作成しますか?

 sql="SELECT * FROM TABLENAME where Col1='Something'";

編集:

List<string> addresses=new List<string>()
{
 "foo st. 2","foo bld 1","foo st 22","foo st 1"
};
List<string> deleted=new List<string>();
List<string> notdeleted=new List<string>();

using(SqlConnection cn=new SqlConnection("connStr"))
 {
  using(SqlCommand cmd=new SqlCommand())
  {
    cmd.CommandText="DELETE from TableName Where Address=@address";
    cmd.Connection=cn;
    cmd.Parameters.Add("@address",SqlDbType.VarChar,50);
    cn.Open();
    for(String address in addresses)
     {
       cmd.Parameters["@address"].Value=address;
       int result=cmd.ExecuteNonQuery();
       if(result!=-1)
        {
          //deleted
          deleted.Add(address);
        }
      else
        {
         //not deleted
         notdeleted.Add(address);
        }
     }
    cn.Close();
   }
 }
于 2012-07-23T06:55:33.207 に答える
1

SQLのdeleteステートメントで削除されていないアイテムを見つけることができないと思います。まず、文字列をコンマで分割する方法が必要です。この質問で提案されているようなテーブル関数を使用します

それができたら、一時テーブルに削除する前に選択し、そこにあるレコードを削除して、不足しているレコードを返す必要があります。

DECLARE @SplitString TABLE
(
    value varchar(MAX)
)

DECLARE @MissingRecords TABLE
(
    value varchar(MAX)
)


INSERT INTO @SplitString
SELECT  part
FROM    dbo.fSplitString('foo st 22, foo st 1', ',')



SELECT  value
FROM    @SplitString
WHERE   value NOT IN (  SELECT Address
                        FROM TableName
                     )

DELETE  FROM TableName
WHERE   Address IN (SELECT Value FROM @SplitString)

SELECT  *
FROM    @MissingRecords
于 2012-07-23T07:06:28.670 に答える