我有一个带有记录的几个表的SQL Server数据库。我的输入是IMEI号,只有当这个IMEI号没有保存在所有表中时,我才必须存储在表中。我的代码是:
public int Find_IMEI(string IMEI_NUM)
{
IMEI_lab.Text = IMEI_NUM.ToString();
int dflag = 0;
object result;
SqlConnection sqlConn = new SqlConnection(@"Data Source=\SQLEXPRESS;Initial Catalog=manager_db;Integrated Security=True;Pooling=False");
sqlConn.Open();
int test = 0;
for(int kk = 0; kk < comboBox2.Items.Count; kk++)
{
string data_sql = string.Format("IF EXISTS(SELECT 1 FROM {0} WHERE IMEI={1}) SELECT 1 AS FOUND ELSE SELECT 0 AS FOUND", data[kk], IMEI_NUM);
SqlCommand da = new SqlCommand(data_sql, sqlConn);
result = da.ExecuteScalar(); // ExecuteScalar fails on null
if (result.GetType() == typeof(DBNull)) // checking IMEI number in all Tables(orders)
{
dflag = 0;
test = test + dflag;
}
else
{
dflag = (int)result; //(Int32)da.ExecuteScalar();
test = test + dflag;
}
}
sqlConn.Close();
return test;
}
此代码工作正常,返回所有表中找到的重复IMEI编号的计数。但是我想知道SQL是否有查询以更优化的方式或没有循环来完成工作
表格定义:
id | IMEI | Serial | date
----------------------------------------
1 3548690... 0001 15/2/15
2 3548690... 0002 15/2/15
P.S data [kk] - 表名为
的数组答案 0 :(得分:1)
您可以使用UNION
子句将单个请求发送到SQL服务器而不是 N 请求,其中 N 是表的数量。
你需要这样的请求:
SELECT SUM(C) FROM
(
SELECT COUNT(*) AS C FROM {Table1} WHERE IMEI = @IMEI
UNION
SELECT COUNT(*) AS C FROM {Table2} WHERE IMEI = @IMEI
UNION
. . .
UNION
SELECT COUNT(*) AS C FROM {TableN} WHERE IMEI = @IMEI
)
据我了解,您的data[]
数组存储了表的名称。
var tableRequests = data.Select(tableName => string.Format("SELECT COUNT(*) AS C FROM [{0}] WHERE IMEI = @IMEI", tableName));
var innerRequest = string.Join(" UNION ", tableRequests);
var finalRequest = string.Format("SELECT SUM(C) FROM ({0})", innerRequest);
using (var command = new SqlCommmand(finalRequest, sqlConn))
{
commman.Parameters.Add("@IMEI", IMEI_NUM);
return (int)command.ExecuteScalar();
}
答案 1 :(得分:0)
var tableRequests = data.Select(tableName => string.Format("SELECT COUNT(*) AS C FROM {0} WHERE (IMEI = {1})", tableName, IMEI_NUM));
var innerRequest = string.Join(" UNION ", tableRequests);
var finalRequest = string.Format("SELECT SUM(C) AS EXP FROM ({0}) AS ANS", innerRequest);
using (var command = new SqlCommand(finalRequest, sqlConn))
{
return (int)command.ExecuteScalar();
}
感谢@Mark Shevchenko