使用交叉申请更新

时间:2017-03-21 13:10:04

标签: sql cross-apply

我在#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语句根本不会给出期望的结果,但只有极少数行用值更新。我不知道为什么?!

def包含多次服务的所有订单的列表。

编辑:根据@sqlzim的回复我改变了查询。他的反应也给出了同样的答案。

1 个答案:

答案 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