ifistsコマンド(sybaseをデータベースとして)を使用すると、unixスクリプトで誤った構文エラーが発生します。

ifistsコマンド(sybaseをデータベースとして)を使用すると、unixスクリプトで誤った構文エラーが発生します。

次のスクリプトで次のエラーが発生します。

isql -U$DBLogin -PDBPAss -S$DBName -e <<!
   use $db
go
   if exists (select 1 from syscolumns where id = object_id('Main_table')  and name = 'Stamm')
   begin
   insert into Main_table select * from temp_table
   end
   else
   begin
   create table Main_table
   (
    Stamm char (5),
    Datum int,
    Perdat char (5) null
   )
go
   insert into Main_table select * from temp_table
   end
go
DROP TABLE temp_table
go
!

これを行うと、何度も試しても次のエラーが発生します。

エラーの詳細:(ログ)

1>    use db
1>    if exists (select 1 from syscolumns where id = object_id('Main_table') and name = 'Stamm')
2>    begin
3>    insert into Main_table select * from temp_table
4>    end
5>    else
6>    begin
7>    create table Main_table
8>    (
9>         Stamm char (5),
10>         Datum int,
11>         Perscd char (5) null
12>    )
Msg 102, Level 15, State 181:
Server 'DB_DEVP', Line 12:
Incorrect syntax near ')'.
1>    insert into Main_table select * from temp_table
2>    end
Msg 156, Level 15, State 2:
Server 'DB_DEVP', Line 2:
Incorrect syntax near the keyword 'end'.
1>    DROP TABLE db..temp_table

答え1

これはシェルスクリプトの問題ではなく、SQL構文の問題です。

エラー出力と判断すると次のようになります。

1>    use db
1>    if exists (select 1 from syscolumns where id = object_id('Main_table') and name = 'Stamm')
2>    begin

最初の 2 行は 1 つのコマンドで処理されるように見えます。これがデータベースエンジンが構文エラーを検出する理由である可能性があります。 2 つのコマンドに分ける必要があります。私はSybaseについて知りませんが、use $db;ここの記事の最初の行として試してみてください。

それ以外はシェルスクリプトに深刻な問題はありません。私が言及しなければならない唯一のものは、二重引用符と引数拡張が$DBLogin不足しており、コマンドにリダイレクトされる$DBName文書の枠組みにとらわれない(法的であるにもかかわらず)区切り文字ですisql(使用されたかEND_SQL類似しているでしょう)。

関連情報