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

問題は構文と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

プロシージャを実行するためにこれらの2つの方法をテストし、両方とも結果を返しました。

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 に答える
2

最初にクエリの結果をテンポラル テーブルに保存してSELECTから、テンポラル テーブルから次の操作を行います。

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

EXECUTE(@Sql)

SELECT * FROM #temp
于 2013-02-12T21:32:12.717 に答える
1

一重引用符を使用します。

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

いくつかの調査の後、私は自分の答えを編集しました。

EXECUTE ( string-expression )ステートメントに関しては、はい、文字列式に二重引用符ではなく一重引用符を使用する必要があります。このページは言及します:

プロシージャに渡されたパラメータを使用して構築されたステートメントなど、動的に準備されたステートメントを実行できます。ステートメント内のリテラル文字列は一重引用符で囲む必要があり、ステートメントは1行である必要があります。

これにより、列が見つからないというエラーは解消されますが、プロシージャは次の別のエラーを返します。

Result set not permitted in '<batch statement>'

このステートメントを単独で実行しようとすると、同じエラーが返されます。

execute ('select * from sysusers')

考えられる原因

結果セットが許可されていないコンテキストでSELECTステートメントを実行しようとしました。

解決策については、私の最新の回答を参照してください。

スキーマに関しては、オブジェクトを参照する方法は次のとおりです。

データベースオブジェクトは、ピリオド(。)で区切ったスキーマ名とオブジェクト名で参照することをお勧めします。完全な例として、現在のデータベースのHumanResourcesスキーマのEmployeeテーブルからレコードをSELECTするには、次のようになります。

SELECT * FROM HumanResources.Employee

リモートデータベースにあるオブジェクトを参照するために、完全修飾オブジェクト名にはサーバー名とデータベース名が含まれます。たとえば、MyServerのAdventureWorksデータベースのHumanResourcesスキーマのEmployeeテーブルからレコードをSELECTするには、次のようになります。

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スキーマに存在すると想定)

結論....selectステートメントには、スキーマで作成されたcds.pplという名前のテーブルが含まれている必要があります。pplcds

またはcds、データベース名とpplテーブル名がdboスキーマで作成されている場合は、ドットがありません。

select * from cds..ppl
于 2012-04-19T21:11:56.817 に答える