我正在开发一个MS Access DB重写项目,我们正在转换为2005 SQL服务器后端/ Winform前端。我在Access中有一个查询,我需要将其转换为在SQL Server中运行。这是Access查询:
UPDATE DISTINCTROW VAR, CancelsinTrans
INNER JOIN Trans ON (CancelsinTrans.ACCT = Trans.ACCT) AND (CancelsinTrans.ITEM_ID = Trans.ITEM_ID)
SET Trans.TRAN_CD = "1", Trans.LastUpdated = Date()
WHERE (((Trans.TRAN_CD)<>"1" Or (Trans.TRAN_CD) Is Null) AND
((CancelsinTrans.TRAN_DT)<[VAR]![Import1]) AND
((Trans.TRAN_DT)<[VAR]![Import1]));
CancelsinTrans是一个从Trans表中提取帐户的查询 - 所以基本上它正在加入自身并执行更新。
这是CancelsInTrans查询:
SELECT Trans.ACCT, Trans.TRAN_TYPE_CD, Trans.TRAN_SUBOR_CD, Trans.M_SRCE_CD, Trans.TRAN_RQST_CD, Trans.TRAN_AM, Trans.TRAN_DR_CR_CD, Trans.TRAN_CXL_CD, Trans.ACCTG_CD, Trans.ITEM_ID, Trans.TRAN_DT, Trans.TRAN_EXEC_TM, Trans.TRAN_QY, Trans.TRAN_NET, Trans.TRAN_EXEC_PR, Trans.M_SECURITY_NR, Trans.M_ORF_OR_ORDRNO, Trans.M_SEQ_NBR, Trans.TRAN_SETTL, Trans.M_ORDER_TAKER_ID, Trans.QUOTR_SEC, Trans.PROD_CD, Trans.SEC_CD, Trans.TRAN_EXEC_DT
FROM Trans
WHERE (((Trans.TRAN_TYPE_CD)="TR") AND ((Trans.TRAN_SUBOR_CD)="TR") AND ((Trans.TRAN_CD)="1") AND ((Trans.ACCTG_CD)="1"));
我正在试图找出编写此查询的最佳方法。我打算使用存储过程来运行此更新,但是我应该使用表函数来获取记录集。
任何帮助都会很棒。
谢谢
答案 0 :(得分:2)
SQL Server等效项将类似于以下内容:
Update Trans
Set TRAN_CD = '1'
, LastUpdated = GETDATE()
Where ( Trans.TRAN_CD <> '1' Or Trans.TRAN_CD Is Null )
And Trans.TRAN_DT < 'some var value'
And Exists (
Select 1
From CancelsinTrans As C1
Where C1.ACCT= Trans.ACCT
And C1.ITEM_ID = Trans.ITEM_ID
And C1.TRAN_DT < 'some var value'
)
在这种情况下,通过参数化查询,您可以使用我认为是表单值的some var value
中的值替换[VAR]![Import1]
。
<强>更新强>
鉴于CancelsInTran查询封装了Trans表,你可以像这样删除连接:
Update Trans
Set TRAN_CD = '1'
, LastUpdated = GetDate()
Where TRAN_TYPE_CD = 'TR'
And TRAN_SUBOR_CD = 'TR'
And ACCTG_CD = '1'
And ( TRAN_CD <> '1' Or TRAN_CD Is Null )
And TRAN_DT < 'some value'