1

我的 SQLSERVER(2008R2) 上有一个名为“Clients”的表,它有 ClientID 和 Address。我想做一个查询/SP,它执行以下操作:

  1. 接收地址列表。
  2. 删除具有这些地址的记录。
  3. 返回无法删除的地址列表(未找到行等)。
  4. 返回删除的行数。

我的应用程序是基于 C#-ASP.NET 的应用程序。我想到了以下解决方案:

  1. 制作一个SP接收地址列表,然后尝试删除它们,如果无法删除它,将其添加到某种数组/列表中。- 我对这个解决方案的问题是我不熟悉列表在 SQLSERVER(2008R2) 上的工作方式。

  2. 使用DataTable,从数据库中选择我需要的数据,然后使用 删除它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'}- 最后两项在上表中不存在,所以我希望我的 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

我不认为你可以找到哪些项目没有被 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 回答
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 回答