SQLEXEC(nConnectionHandle, [cSQLCommand, [cCursorName]])
我现在提出的问题是:其中的SQLCommand语句是否可以是较复杂的select语句?需要从多个建立关联后的SQL数据库表取数据。
具体实例是:
SQL数据库有4个表,4个表的表名为:表商品购进、表商品信息、表供货企业、表财务汇款,其中:表商品购进中的字段“商品编号”与表商品信息的字段“商品编号”关联,表商品购进中的字段“单据编号”与表财务汇款的字段“单据编号”关联,表财务汇款中的字段“单位编号”与表供货企业的字段“单位编号”关联。
所使用的SQLEXEC语句是:
SQLEXEC(nConnectionHandle, ;
"Select 查询结果中包含的字段 from表商品购进,表商品信息,表供货企业,表财务汇款;
where 表商品购进.商品编号=表商品信息.商品编号;
.and. 表商品购进.单据编号=表财务汇款. 单据编号;
.and. 表财务汇款.单位编号=表供货企业.单位编号" , cCursorName)
但在实际运行SQLEXEC语句时,提示出错:“命令中有不能识别的短语或关键字”。
后来我又将所使用的SQLEXEC语句改为:
SQLEXEC(nConnectionHandle, ;
"Select 查询结果中包含的字段 from表商品购进;
inner join 表商品信息 on 表商品购进.商品编号=表商品信息. 商品编号;
inner join 表财务汇款 on 表商品购进.单据编号=表财务汇款. 单据编号;
inner join 表供货企业 on 表财务汇款.单位编号=表供货企业.单位编号" , cCursorName)
但在实际运行SQLEXEC语句时,仍然提示出错:“命令中有不能识别的短语或关键字”。
请电脑专家帮助分析,错在哪里?应如何正确编程?敬请指导,不胜感激!
8 个解决方案
#1
老问题了,命令太长了
#2
测试一下SQL语句长度,如果超过255,用N个变量累加,优化SQL语句,加入别名
Select * from 表商品购进 d;
inner join 表商品信息 a on d.商品编号=a. 商品编号;
inner join 表财务汇款 b on d.单据编号=b. 单据编号;
inner join 表供货企业 c on d.单位编号=c.单位编号
OR
用TEXT TO DD
Select * from 表商品购进 d;
inner join 表商品信息 a on d.商品编号=a. 商品编号;
inner join 表财务汇款 b on d.单据编号=b. 单据编号;
inner join 表供货企业 c on d.单位编号=c.单位编号
ENDTEXT
SQLEXEC(nConnectionHandle,DD)
Select * from 表商品购进 d;
inner join 表商品信息 a on d.商品编号=a. 商品编号;
inner join 表财务汇款 b on d.单据编号=b. 单据编号;
inner join 表供货企业 c on d.单位编号=c.单位编号
OR
用TEXT TO DD
Select * from 表商品购进 d;
inner join 表商品信息 a on d.商品编号=a. 商品编号;
inner join 表财务汇款 b on d.单据编号=b. 单据编号;
inner join 表供货企业 c on d.单位编号=c.单位编号
ENDTEXT
SQLEXEC(nConnectionHandle,DD)
#3
测试SQL语句长度就明白问题所在了,
是否是 查询结果中包含的字段 这个地方内容太多了?
是否是 查询结果中包含的字段 这个地方内容太多了?
#4
你将语句在 SQL Server 查询分析器中运行通过后,再写到程序中。
#5
注意: SQLEXEC 发送的字符串不能超过 VFP 的限制(255),但是, 如果你把它们分割到多个相连的串中, 你可以传递长的 SQL 语句。
如:以下为 VFP 自带帮助中的说明:
如果你要传递的 SQL 语句太长, 检查它是否超过了 Visual FoxPro 串长的最大限度 255 字符。太长的串会产生 "命令中含有不能识别的短语或关键字。" 错误。但是, 如果你把它们分割到多个相连的串中, 你可以传递长的 SQL 语句。例如:
如:以下为 VFP 自带帮助中的说明:
如果你要传递的 SQL 语句太长, 检查它是否超过了 Visual FoxPro 串长的最大限度 255 字符。太长的串会产生 "命令中含有不能识别的短语或关键字。" 错误。但是, 如果你把它们分割到多个相连的串中, 你可以传递长的 SQL 语句。例如:
lnRetVal = SQLEXEC(lnHandle, "SELECT <long list of fields> " + ;
"FROM <several tables> " + ;
"WHERE <complex filter expression>")
#6
你升级到VFP9SP2吧,字符变量长度几乎无限制了。
另外这种SQL语法最后用TEXT TO <变量> NOSHOW来赋值
如:
TEXT TO lcSQLCommand NOSHOW
select * from table1
where ...
order ...
ENDTEXT
SQLEXEC(<连接句柄>,lcSQLCommand)
这样就行.
另外这种SQL语法最后用TEXT TO <变量> NOSHOW来赋值
如:
TEXT TO lcSQLCommand NOSHOW
select * from table1
where ...
order ...
ENDTEXT
SQLEXEC(<连接句柄>,lcSQLCommand)
这样就行.
#7
还有一种解决办法,是在sql server上做一个视图,在sqlexec中查询这个视图即可,再复杂也不怕,而且方便维护,占用资源也少。
#8
每一行以;结束的,必须添加一个空格,如:
语句1 ;
语句2
否则将自视为与下一行的字符连在一起,而报错。
语句1 ;
语句2
否则将自视为与下一行的字符连在一起,而报错。
#1
老问题了,命令太长了
#2
测试一下SQL语句长度,如果超过255,用N个变量累加,优化SQL语句,加入别名
Select * from 表商品购进 d;
inner join 表商品信息 a on d.商品编号=a. 商品编号;
inner join 表财务汇款 b on d.单据编号=b. 单据编号;
inner join 表供货企业 c on d.单位编号=c.单位编号
OR
用TEXT TO DD
Select * from 表商品购进 d;
inner join 表商品信息 a on d.商品编号=a. 商品编号;
inner join 表财务汇款 b on d.单据编号=b. 单据编号;
inner join 表供货企业 c on d.单位编号=c.单位编号
ENDTEXT
SQLEXEC(nConnectionHandle,DD)
Select * from 表商品购进 d;
inner join 表商品信息 a on d.商品编号=a. 商品编号;
inner join 表财务汇款 b on d.单据编号=b. 单据编号;
inner join 表供货企业 c on d.单位编号=c.单位编号
OR
用TEXT TO DD
Select * from 表商品购进 d;
inner join 表商品信息 a on d.商品编号=a. 商品编号;
inner join 表财务汇款 b on d.单据编号=b. 单据编号;
inner join 表供货企业 c on d.单位编号=c.单位编号
ENDTEXT
SQLEXEC(nConnectionHandle,DD)
#3
测试SQL语句长度就明白问题所在了,
是否是 查询结果中包含的字段 这个地方内容太多了?
是否是 查询结果中包含的字段 这个地方内容太多了?
#4
你将语句在 SQL Server 查询分析器中运行通过后,再写到程序中。
#5
注意: SQLEXEC 发送的字符串不能超过 VFP 的限制(255),但是, 如果你把它们分割到多个相连的串中, 你可以传递长的 SQL 语句。
如:以下为 VFP 自带帮助中的说明:
如果你要传递的 SQL 语句太长, 检查它是否超过了 Visual FoxPro 串长的最大限度 255 字符。太长的串会产生 "命令中含有不能识别的短语或关键字。" 错误。但是, 如果你把它们分割到多个相连的串中, 你可以传递长的 SQL 语句。例如:
如:以下为 VFP 自带帮助中的说明:
如果你要传递的 SQL 语句太长, 检查它是否超过了 Visual FoxPro 串长的最大限度 255 字符。太长的串会产生 "命令中含有不能识别的短语或关键字。" 错误。但是, 如果你把它们分割到多个相连的串中, 你可以传递长的 SQL 语句。例如:
lnRetVal = SQLEXEC(lnHandle, "SELECT <long list of fields> " + ;
"FROM <several tables> " + ;
"WHERE <complex filter expression>")
#6
你升级到VFP9SP2吧,字符变量长度几乎无限制了。
另外这种SQL语法最后用TEXT TO <变量> NOSHOW来赋值
如:
TEXT TO lcSQLCommand NOSHOW
select * from table1
where ...
order ...
ENDTEXT
SQLEXEC(<连接句柄>,lcSQLCommand)
这样就行.
另外这种SQL语法最后用TEXT TO <变量> NOSHOW来赋值
如:
TEXT TO lcSQLCommand NOSHOW
select * from table1
where ...
order ...
ENDTEXT
SQLEXEC(<连接句柄>,lcSQLCommand)
这样就行.
#7
还有一种解决办法,是在sql server上做一个视图,在sqlexec中查询这个视图即可,再复杂也不怕,而且方便维护,占用资源也少。
#8
每一行以;结束的,必须添加一个空格,如:
语句1 ;
语句2
否则将自视为与下一行的字符连在一起,而报错。
语句1 ;
语句2
否则将自视为与下一行的字符连在一起,而报错。