使用SCOPE_IDENTITY会导致另一个查询

时间:2018-10-05 09:47:48

标签: sql sql-server

我在使用此代码时遇到困难

    ao = np.zeros((N,))
    ao[0] = 0.3         
    an = np.zeros((N,))

    q0o = np.zeros((N,))
    qo[0] = 0.3         
    q0n = np.zeros((N,))

    c0o = np.zeros((N,))
    c0o[0] = 69           
    c0n = np.zeros((N,))

    eo = np.zeros((N,))
    eo[0] = 0.1       
    en = np.zeros((N,))
    temp = 1e10 
    def 1(a,q):
            return a+q**2
    def 2(c,q):
            return c/sqrt(q)
    def 3(e,q):
            return q-e
    def TOTAL(a, c, e, q)  :
                      total =  1(a,q) + 2(c,q) + 3(e,q)
                      return total

    highest=0
    with open('outputs/poly.txt', 'w') as f:
            for i in range (1,N):
                num = 0
                R = np.random.uniform(0,1)    
                while True:
                    num += 1
                    an[i] = ao[i-1] + 0.001 * np.random.normal()
                    c0n[i] = c0o[i-1] + 0.01 * np.random.normal()
                    e0n[i] = e0o[i-1] + 0.01 * np.random.normal()

                    L = np.exp(-0.5 * (TOTAL(an[i], c0n[i], e0n[i], qn[i]) - TOTAL(ao[i-1], c0o[i-1], e0o[i-1], qo[i-1])))
                    LL=min(1,max(L,0))

                    if LL>R:          
                        ao[i]= an[i]
                        c0o[i] = c0n[i]
                        e0o[i] = e0n[i]
                        qo[i] = qn[i]
                        chi = TOTAL(ao[i], c0o[i], e0o[i], qo[i])
                    else:           
                        ao[i]= ao[i-1]
                        c0o[i] = co[i-1]
                        e0o[i] = e0o[i-1]
                        qo[i] = qo[i-1]
                        chi = TOTAL(ao[i], c0o[i], e0o[i], qo[i])


                    if (ao[i]>0 and c0o[i]>0 and e0o[i]>0)  or num>100:               
                        highest = max(num, highest)
                        break

                f.write("{0}\t{1}\t{2}\t{3}\t{4}\n".format(round(chi,5),'  ',round(c0o[i],5),'  ',round(qo[i],5)))

默认情况下,存储过程将插入一行带有标识和状态的行。 在执行存储过程之后,我使用scope_identity获取插入行的ID。 但是我无法使更新生效,我认为WHERE条件存在问题。

谢谢

1 个答案:

答案 0 :(得分:2)

之所以称为SCOPE_IDENTITY(),是因为它返回在当前作用域中插入的最后一个身份值-并且由于每个过程都有其自己的作用域-您无法获得预期的结果。

  

返回插入到同一作用域的标识列中的最后一个标识值。范围是一个模块:存储过程,触发器,函数或批处理。因此,如果两个语句在同一存储过程,函数或批处理中,则它们在同一范围内。

使用输出参数从实际执行scope_identity()语句的过程内部返回insert

另外,请注意,如果要插入多个记录,scope_identity()将仅返回最后一个值-在这种情况下,您可以使用insert语句上的output子句来获取包含所有新插入的标识值的表。

DECLARE @MyTableVar table( NewScrapReasonID smallint,  
                           Name varchar(50),  
                           ModifiedDate datetime);  
INSERT Production.ScrapReason  
    OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate  
        INTO @MyTableVar  
VALUES (N'Operator error', GETDATE());