我在#def中有这样的表:
#def table 我想计算当前期间'201702'的每个服务订单之间的天数。 Reservice = 0表示之前没有服务。每个服务都会增加服务的计数。
var strArray = new byte[100][];
for (int i = 0; i < strArray.Length; i++)
{
// 49 characters + NUL
strArray[i] = new byte[50]; // or a size you choose
}
var handles = new GCHandle[strArray.Length];
string[] strings;
try
{
var ptrs = new IntPtr[strArray.Length];
for (int i = 0; i < strArray.Length; i++)
{
handles[i] = GCHandle.Alloc(strArray[i], GCHandleType.Pinned);
ptrs[i] = handles[i].AddrOfPinnedObject();
}
modifyStringInCpp(ptrs);
strings = new string[strArray.Length];
for (int i = 0; i < strArray.Length; i++)
{
strings[i] = Marshal.PtrToStringAnsi(ptrs[i]);
}
}
finally
{
for (int i = 0; i < strArray.Length; i++)
{
if (handles[i].IsAllocated)
{
handles[i].Free();
}
}
}
上面的选择查询为我提供了所需的结果。奇怪地使用具有相同查询的UPDATE语句根本不会给出期望的结果,但只有极少数行用值更新。我不知道为什么?!
编辑:根据@sqlzim的回复我改变了查询。他的反应也给出了同样的答案。
答案 0 :(得分:2)
这看起来像sql-server,所以这个答案适用于sql-server。
我不明白为什么你会从这些查询得到两个不同的结果,但是如果你用select
语句得到正确的结果,你可以把它放在common table expression和{{1使用update
。
cte
可以为空吗?如果没有,那么除非您使用serv_date
代替T.serv_date
,否则outer apply()
不能为空。
cross apply()
检查;with cte as (
select
s1.ord_id
, s1.period
, s1.company
, s1.prod
, s1.id1
, S1.id2
, s1.serv_date
, s1.days_btwn_service
, t.last_servdate
, datediff(day,isnull(T.last_servdate,s1.[serv_Date]),s1.serv_date) as [Days_Since_Last]
from #def s1
cross apply (
select top 1 serv_date as last_servdate
from #def s2
where s1.prod = s2.prod
and s1.id1 = s2.id1
and s1.id2 = s2.id2
and s1.company = s2.company
and s2.reservice = s1.reservice - 1
) T
where s1.company_code = 'abc'
and s1.period = '201702'
)
--select * from cte;
update cte
set days_btwn_service = [Days_Since_Last];
/* This will update the underlying table #def */
/* -- Alternate version
update d
set d.days_btwn_service = cte.[Days_Since_Last]
from #def d join cte on cte.ord_id=d.ord_id
--*/
的结果,如果它们正确,请运行select
而不是update
。