我有一个需求,需要将 Foxpro SQL 语法转换为 SQL Server。 SQL Server 中以下 Foxpro 代码的适当等效项是什么?
完整声明如下:
FoxPro 中的 DBF 更新语句:
REPLACE ALL Column1 WITH "N/A" FOR Column2="Some string value"=.f.
我想了解
Column2="Some string value"=.f.
部分的含义。
根据我的假设,此代码对应于 SQL Server 中的以下代码:
columnName <> "String Value"
请多指教!
根据 FoxPro 文档的方便的非官方备份镜像,(因为微软已经开始复制苹果的策略,假装其旧产品的文档不存在)我们可以将其分解:
REPLACE ALL Column1 WITH "N/A" FOR Column2="Some string value"=.f.
REPLACE
就像 SQL 的 UPDATE
或 MERGE
。
ALL
中的REPLACE ALL
表示应处理表中的所有记录。
WITH "N/A"
表示 "N/A"
是要存储在 Column1
中的新字符串/文本值。
FOR
表示行谓词的开始(这看起来很愚蠢,因为 ALL
也是 一个行谓词)。
Column2 = "Some string value" = .f.
是实际的谓词表达式。
=
和 ==
:==
运算符专门用于 精确 文本相等性,而 =
对于确定等价性有更宽松的规则。.F.
(或 .f.
)是文字 false
值,.T.
(或 .t.
)是文字 true
值。x = y = false
(而不是 ( x = y ) = false
或 x = ( y = false )
- 我找不到任何权威文档:FoxPro 的运算符结合性,但从上下文来看,很明显其意图是 ( Column2 = "Some string value" ) = false
-可以写成 FOR Column2 <> "Some string value"
。所以这个
REPLACE ALL
声明将:
Column2
不等于 "Some string value"
Column1 = "N/A"
。SQL Server 的等效 T-SQL 是:
UPDATE
tableNameGoesHere
SET
Column1 = 'N/A'
WHERE
Column2 <> N'Some string value';
UPDATE
(以及 MERGE
,如果你敢的话)DML 语句确实比 FoxPro 拥有更多的功能 - 例如,考虑使用 OUTPUT
子句返回实际更改的内容将数据发送到客户端或放入表中,而无需另一个 SELECT
- 并且 MERGE
让您可以在单个语句中同时执行 UPDATE
、INSERT
和 DELETE
(有警告) - 所以我的观点是,我认为您应该考虑利用这个机会来探索在进行 VFP 到 MSSQL 移植工作时如何积极改进产品/项目的代码库和功能/特性。