- PR -

SQLServerのストアードプロシジャについて

1
投稿者投稿内容
美咲
会議室デビュー日: 2004/07/02
投稿数: 4
投稿日時: 2004-07-02 14:27
Sybaseのプロシージャ(SP)でパラメータでDB名とオーナ名を引渡し、
Selectなどをしたいのですがコンパイルが通りません。
教えて下さい。宜しくお願いします。

※当処理は、2つのデータベースが存在します。
1つのプロシージャで、2つのデータベース内の
テーブルを制御します。isqlのログイン時は、USE文にて
DB1を指定し、ログインをしています。

1.DB1:boo_mst
2.DB2:foo_mst

問題は、
@DB_name .@DB_Owner .foo_mst
のみコンパイルエラーになります。

== SQL文 =======================
create procedure DM_SPC_foo_mst
(@DB_name varchar(15),
@DB_Owner varchar(15),
@foo_cd int) as

begin

select
count(*) from boo_mst

select
foo_cd,
foo_name,
foo_short_name,
foo_fb_name
from
@DB_name.@DB_Owner.foo_mst
where
@foo_cd = foo_cd


end
go
================================

Qoo
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 121
投稿日時: 2004-07-02 14:45
こんにちは。

どのようなコンパイルエラーがでてますか?
美咲
会議室デビュー日: 2004/07/02
投稿数: 4
投稿日時: 2004-07-02 16:38
返信を有難う御座います。
エラー内容ですが、次に添付しますがコーディングに
若干の違いがあります。


==== コード ====
1> create procedure DM_SPC_foo_mst
2> (@DB_name varchar(15), @DB_Owner varchar(15), @bank_cd int) as
3>
4> declare @a varchar(15) ← 確認で入れました。
5> declare @b varchar(15) ← 確認で入れました。
6>
7> select @a = 'foodb'        ← 確認で入れました。
8> select @b = 'dbo'         ← 確認で入れました。
9>
10> begin
11> select
12> bank_cd,
13> bank_name,
14> bank_short_name,
15> bank_fb_name
16> from
17> @a.@b.foo_mst
18> where
19> @bank_cd = bank_cd
20>
21> end
22> go

Msg 102, Level 15, State 1:
Server 'foo001', Procedure 'DM_SPC_foo_mst', Line 17:
'@a' の近くに、構文エラーがあります。
1>
soluna
ベテラン
会議室デビュー日: 2004/06/15
投稿数: 59
投稿日時: 2004-07-02 17:00
たぶん無理じゃないのかな?
私の知る限りそこに変数を指定できる物は知りません。
そういう場合、だいたい動的SQLを利用すると思いますが。

ところで、データベースは何なんでしょ?
タイトルはSQL Server、本文はSybase、どちらでしょうか?
美咲
会議室デビュー日: 2004/07/02
投稿数: 4
投稿日時: 2004-07-02 17:12
返信、有難う御座います。

DBはSybaseです。
無知で、すみませんが動的SQLと言うのは直接コードを
定義すると意味でしょうか?

例えば、
select
foo_cd,
foo_name,
foo_short_name,
foo_fb_name
from
foodb.dbo.foo_mst ← この意味ですか?
where
@foo_cd = foo_cd

上記の意味だと、複数環境でDB名、オーナー名が
異なる場合は、コードの変更が発生しますので、
これを防ぎたいのです。

ORACLEなどは、シノニムなので対応はできるのですが。

宜しくお願いします。
たーぞう
ぬし
会議室デビュー日: 2003/08/08
投稿数: 317
お住まい・勤務地: お花畑
投稿日時: 2004-07-02 17:21
SQL Serverのストアド・プロシージャでは、「テーブル変数」と呼ばれる特殊な変数を用いることにより、プロシージャ内でテーブルを定義し作成することができます。

しかし、テーブル変数をパラメータとして受け渡しすることはできません。(プロシージャの値として返すことはできます。)

ご提示の仕様で実現するとしたら、IF〜ELSEによりテーブル名やオーナ名を判定し、それの値ごとにSELECTを記述するしかないと思われます。
soluna
ベテラン
会議室デビュー日: 2004/06/15
投稿数: 59
投稿日時: 2004-07-02 17:31
動的SQLとはSQL文を文字列として編集してそれを実行するという物です。
まぁ、クライアントサイドでのパラメータを利用しないSQLの実行と同じ物です。

残念ながら、私はSybaseでの動的SQLの実行方法は知りません。

Googleで一発で出てくるかと思ったけど、出てきませんでした。
[動的SQL Sybase]
ちなみにSQL Serverではsp_executesql, OracleではIMMEDIATEを実行するようです。
Sybaseって国内ではマイナーすぎ。
1

スキルアップ/キャリアアップ(JOB@IT)