我在 SQL Anywhere 中创建动态 sql 语句时遇到问题。
CREATE PROCEDURE pplAnalysis
AS
BEGIN
DECLARE @Sql NVARCHAR(4000)
SELECT @Sql = "select * from cds.ppl"
EXECUTE(@Sql)
END
当我执行这个过程时,我得到一个Column 'select * from cds.ppl' not found
错误。
你能告诉我我做错了什么吗?
尝试首先将查询结果保存在时态表中,然后SELECT
从时态表中执行:
SELECT @Sql = "select into #temp * from cds.ppl"
EXECUTE(@Sql)
SELECT * FROM #temp
这个问题与语法和RESULT
子句有关;添加分号、RESULT
子句并用于SET
初始化 Sql 变量后,以下是有效的(在 SQL Anywhere 网络服务器版本 12.0.1 中测试):
drop proc pplAnalysis;
CREATE PROCEDURE pplAnalysis()
RESULT (cnot CHAR(5), cnull CHAR(5), vnot VARCHAR(5), vnull VARCHAR(5), explanation VARCHAR(50))
BEGIN
DECLARE @Sql NVARCHAR(4000);
SET @Sql = 'select cnot, cnull, vnot, vnull, explanation from dbo.spaces';
EXECUTE ( @Sql );
END;
spaces
是dbo
架构中的一个表,并且这些列与中指定的类型相同RESULT
测试了这两种执行过程的方式,都返回了结果:
call pplAnalysis();
cnot cnull vnot vnull explanation
----- ----- ----- ----- --------------------------------------------------
Execution time: 0.027 seconds
Procedure completed
或者
exec pplAnalysis;
cnot cnull vnot vnull explanation
----- ----- ----- ----- --------------------------------------------------
Execution time: 0.018 seconds
更多细节:
使用单引号。
SELECT @Sql = 'select * from cds.ppl'
经过一番研究,我编辑了我的答案。
关于EXECUTE ( string-expression )
语句,是的,您必须对字符串表达式使用单引号而不是双引号。该页面提到:
它允许您执行动态准备的语句,例如使用传递给过程的参数构造的语句。语句中的文字字符串必须用单引号括起来,并且语句必须在单行上。
这将消除未找到列的错误,但该过程将返回此其他错误:
Result set not permitted in '<batch statement>'
尝试单独执行此语句时返回相同的错误:
execute ('select * from sysusers')
有可能的原因:
您试图在不允许结果集的上下文中执行 SELECT 语句。
有关解决方案,请参阅我最近的答案。
关于模式,这里是如何引用对象:
通过模式名称和对象名称(以句点 (.) 分隔)来引用数据库对象始终是一种很好的做法。对于一个完整的示例,从当前数据库的 HumanResources 模式中的 Employee 表中选择记录如下所示:
SELECT * FROM HumanResources.Employee
要引用位于远程数据库中的对象,完全限定的对象名称包括服务器名称和数据库名称。例如,要从 MyServer 上 AdventureWorks 数据库的 HumanResources 架构中的 Employee 表中选择记录,如下所示:
SELECT * FROM MyServer.AdventureWorks.HumanResources.Employee
我在 SQL Anywhere 12 中对其进行了测试,它的工作原理相同。即使我不熟悉模式,我在下面建议您实际上是使用模式,dbowner 将是模式名称:
1)select * from dbname.dbowner.tablename
2)select * from dbowner.tablename
3)select * from dbname..tablename
(假设表存在于dbo
模式中)
底线....在您的选择语句cds.ppl
中必须是在架构中ppl
创建的名为的表。cds
或者,如果cds
您的数据库名称和ppl
表名称是在dbo
架构中创建的,则您缺少一个点:
select * from cds..ppl