sql-server - 将 Foxpro 转换为 T-SQL
问题描述
我不知道这篇文章的标题是什么,如果你能想到更好的标题,请随时编辑我的文章。
我有一些看起来像这样的视觉 foxpro:
* Get the vendor code for case management hours
Select op_value ;
FROM dbfs\am_opts ;
WHERE op_code = "CMGT_VENDOR" ;
INTO CURSOR cmgt_vndr
lcCMGTVendor = padr(cmgt_vndr.op_value, 4)
* Determine if we need to include CMGT hours
llIncludeCMGT = .f.
Select sub_code ;
FROM tempsrv ;
WHERE Is_It_Case_Service(sub_code) ;
AND selected ;
INTO CURSOR c_dummy1
*
If _tally
> 0 or pcService = "ALL"
llIncludeCMGT = .t.
Endif
*
If m.llIncludeCMGT
* Pick only certain Vendors?
If m.pcVendor=="ALL"
* No, then leave the CMGT flag as DO Include.
Else
* Yes, only get CMGT if the "Default CMGT Vendor"
* is one of the selected vendors.
Select 'TempVnd'
Locate FOR provkey=m.lcCMGTVendor .AND. Selected
m.llIncludeCMGT = FOUND()
*
*
Endif
*
Endif
*
*
* Merge in CMGT hours if necessary
If llIncludeCMGT
Wait WINDOW NOWAIT ;
'Gathering Case-Management entries'
*
* 10/25/2001 JDB Take into account f_rpt.sub_code
*
Select 0
Use 'dbfs\f_Rpt' AGAIN ALIAS 'SQL_F_Rpt' NOUPDATE
*
* Build basic WHERE-clause, and name basic tables.
m.SQL_FROM = "SQL_F_Rpt"
m.SQL_WHERE = "SQL_F_Rpt.End_Dt BETWEEN m.pdBegin_Date AND m.pdEnd_Date" ;
+ " AND !(IS_IT_WAIVER(SQL_F_Rpt.Payor, .F.))"
*
* Do they only want certain Fund-Sources?
If m.pcPayor=="ALL"
* No, ignore the Payor-field
Else
* Yes, only get matching/selected payors.
m.SQL_FROM = m.SQL_FROM + ", TempPay"
m.SQL_WHERE = m.SQL_WHERE ;
+ " AND SQL_F_Rpt.Payor=TempPay.Payor_CD" ;
+ " AND TempPay.Selected"
*
Endif
*
* Pick only certain Service-Codes?
If m.pcService=="ALL"
* No, ignore the SubCode-field
Else
* Yes, only get matching/selected Services.
m.SQL_FROM = m.SQL_FROM + ", TempSrv"
m.SQL_WHERE = m.SQL_WHERE ;
+ " AND IIF(EMPTY(SQL_F_Rpt.Sub_Code), 'CMGT', SQL_F_Rpt.Sub_Code)=TempSrv.Sub_Code" ;
+ " AND TempSrv.Selected"
*
Endif
*
*
Select * from pass2 union all ;
select lcCMGTVendor as provkey, ;
iif(empty(SQL_F_Rpt.sub_code), "CMGT", SQL_F_Rpt.sub_code) as sub_code, ;
SQL_F_Rpt.keyfld, ;
00000.00 as tot_auth, ;
(SQL_F_Rpt.unit * SQL_F_Rpt.cost) as tot_deliv, ;
SQL_F_Rpt.start_dt as plandt ;
from &SQL_FROM ;
where &SQL_WHERE ;
into cursor pass3
我不知道它lcCMGTVendor
是如何被纳入最终的 foxpro 查询的。它不在SQL_WHERE
任何地方的子句中。代码中的其他任何地方都没有引用它,只是这一部分。
有人可以帮我弄清楚我缺少什么,以便弄清楚它在底部的 Foxpro 查询中的情况吗?
在我目前的理解中,我们采用任何 provkey 值并将其应用于每一行,这似乎是错误的。
解决方案
好的,你想转换它的一部分,那么你要求的“部分”实际上对应于:
Foxpro 代码:
* Get the vendor code for case management hours
Select op_value ;
FROM dbfs\am_opts ;
WHERE op_code = "CMGT_VENDOR" ;
INTO CURSOR cmgt_vndr
lcCMGTVendor = padr(cmgt_vndr.op_value, 4)
T-SQL:
declare @lcCMGTVendor char(20+4); -- if op_value size is char(20)
Select top(1) @lcCMGTVendor = op_value
FROM am_opts
WHERE op_code = 'CMGT_VENDOR';
恕我直言,即使在 foxpro 代码中,padr() 也不是必需的。上面的代码无论如何都使用 char(20+4) 而不是 varchar() - foxpro 字段有尾随空格。
推荐阅读
- mysql - 将一列中的多行选择到不同的列中(SQL)
- firebase - 使用 php curl 从 google fcm HTTP v1 api 获取 411 错误响应
- c# - JSON数据转C# Winforms TreeView的一些问题
- linux - 在 fedora 版本 21 上安装 Openssl 1.0.2 失败
- c - Web 项目中 AES 加密密钥的位置
- php - 如何使用 PHP 获取或拆分某些特定的 json 值
- href - 在 a-frame 中为光标侦听器添加延迟
- php - 用php解析文本
- node.js - Node.js - 在 excel 中获取上标和下标
- sql - 根据 sql server 中立即可用的数据填充当前行