2

我在 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错误。

你能告诉我我做错了什么吗?

4

4 回答 4

2

尝试首先将查询结果保存在时态表中,然后SELECT从时态表中执行:

SELECT @Sql = "select into #temp * from cds.ppl"

EXECUTE(@Sql)

SELECT * FROM #temp
于 2013-02-12T21:32:12.717 回答
2

这个问题与语法和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;

spacesdbo架构中的一个表,并且这些列与中指定的类型相同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

更多细节:

从过程返回结果集

创建过程语句

于 2012-04-22T18:54:13.560 回答
1

使用单引号。

SELECT @Sql = 'select * from cds.ppl'
于 2012-04-19T18:16:25.283 回答
0

经过一番研究,我编辑了我的答案。

关于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
于 2012-04-19T21:11:56.817 回答