我的SQLSERVER(2008R2)上有一个名为“Clients”的表,它有ClientID和Address。 我想做一个查询/ SP执行以下操作:
我的应用程序是基于C#-ASP.NET的应用程序。 我想到了以下解决方案:
创建一个收到地址列表的SP
,然后尝试删除它们,如果无法删除它,则将其添加到某种数组/列表中。 - 我对这个解决方案的问题是我不熟悉SQLSERVER(2008R2)中列表的工作方式。
使用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..
希望我尽可能地保持清醒。
答案 0 :(得分: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();
}
}
答案 1 :(得分:1)
我认为你不能找到sql中的删除语句没有删除哪些项目。首先,您需要一种用逗号分割字符串的方法。我会使用像this question
中建议的表函数如果你有,那么你需要在删除临时表之前选择,然后删除那里的记录,然后返回丢失的记录:
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