我有一个非常长的查询,它基本上是以下内容的扩展:
update property.lease_period
set scca_uplift = '110',
scca_notes_code = '21006'
where (suite_id = 'CCBG08' and lease_id = '205059')
or (suite_id = 'CCBG14' and lease_id = '152424')
or (suite_id = 'CCCF048' and lease_id = '150659')
完成后,where子句将包含~40行。为了使这项任务更容易,我希望做一些类似于以下的事情:
update property.lease_period
set scca_uplift = '110',
scca_notes_code = '21006'
where suite_id in('CCBG08', 'CCBG14', 'CCCF048')
and lease_id in('205059', '152424', '150659')
不幸的是,lease_id不是一个唯一的字段,并且可能有多个lease_id到同一个suite_id(因此随后第二个查询无法使用)。
鉴于此解决方案不起作用,是否有更好的方法来执行第一个更新语句?
答案 0 :(得分:3)
您可以创建表类型并通过它传递值,如下所示:
CREATE TYPE Suite_Lease AS TABLE
(
suite_id varchar(15) NOT NULL,
lease_id varchar(15) NOT NULL
)
GO
CREATE PROC DoUpdate
@Params Suite_Lease READONLY,
@uplift varchar(15),
@code varchar(15)
AS
update property.lease_period set
scca_uplift = @uplift,
scca_notes_code = @code
from property.lease_period tab
JOIN @params filt
on tab.suite_id=filt.suite_id AND tab.lease_id=filt.lease_id
这将使您的过程缓存保持干燥和清洁,相反,如果您使用多个“big”where子句
如何将表参数传递给存储过程(c#):
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("suite_id", typeof (string)) {AllowDBNull = false, MaxLength = 15});
dt.Columns.Add(new DataColumn("lease_id", typeof (string)) {AllowDBNull = false, MaxLength = 15});
dt.Rows.Add("CCBG08", "205059");
... add more rows for match
using (var c = new SqlConnection("ConnectionString"))
{
c.Open();
using(var sc = c.CreateCommand())
{
sc.CommandText = "DoUpdate";
sc.CommandType = CommandType.StoredProcedure;
sc.Parameters.AddWithValue("@uplift", "110");
sc.Parameters.AddWithValue("@code", "21006");
sc.Parameters.Add(new SqlParameter("@Params", SqlDbType.Structured) { TypeName = null, Value = dt });
sc.ExecuteNonQuery();
}
}
答案 1 :(得分:1)
使用来自this article的技巧。这看起来有点难看,但它确实有这个诀窍:
update property.lease_period
set scca_uplift = @uplift, scca_notes_code = @code
from property.lease_period tab
JOIN (
select 'CCBG08' as suite_id, '205059' as lease_id union all
select 'CCBG14', '152424' union all
select 'CCCF048', '150659'
) xxx
on tab.suite_id=xxx.suite_id AND tab.lease_id=xxx.lease_id
答案 2 :(得分:1)
试试这个
update property.lease_period
set scca_uplift = '110',
scca_notes_code = '21006'
where (suite_id in,lease_id) in
(select suite_id in,lease_id from XXX_table where CONDITION)
最后一个SELECT应该会给你40个组合。
答案 3 :(得分:0)
来自@dasblinkenlight(对于Oracle)的评论,另一种可能的方法是:
select *
from property.lease_period
where (suite_id + ' ' + lease_id)
in (
('CCBG08 205059'),
('CCBG14 152424'),
('CCCF048 150659')
)
这不是非常推荐的,因为它对于索引(在MicrosoftSQL上连接)会很糟糕,但是我认为这一切都很有趣。
dasblinkenlights原始评论:
@Michael我希望你问的是Oracle,它更清洁了 那里:你在哪里(lease_period,lease_id) (('CCBG08','205059'),('CCBG14','152424'),('CCCF048','150659')),它 诀窍。为什么SQL Server无法做到这一点超出我的范围。 -