- - PR -
SQL文の文字数
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-02-19 16:00
お世話になります。
現在、VB(6.0)からSQLサーバー(2000SP4)のデータを取得するといった開発を行なっています。 下記のような処理を行なっています。 ストアドプロシージャ---------- DECLARE @SQL NVARCHAR(4000) SET @SQL = 'SELECT * FROM 〜〜〜〜〜〜' EXEC sp_executesql @SQL ------------------------------ その際、どうしてもSQL文が長くなりNVARCHAR(4000)のサイズを超えてしまい、正常にSQL文が実行されません。(SQL文の末尾が切れてしまう為) こういった場合どのように対応したら良いのでしょうか?どなたか良い方法がありましたらアドバイスをお願いします。 | ||||||||||||
|
投稿日時: 2008-02-19 17:48
こんにちは。
SQL文の内容にもよりますが、ストアドプロシジャの検討はどうでしょうか? | ||||||||||||
|
投稿日時: 2008-02-19 18:25
え〜と、スレ主さんが提示されているサンプルが、既にストアドプロシージャと 記載されています。
今回の場合だと、SQLが動的SQLとして定義されているが為に、文字数の制限が 出ているものと思われます。 もし、上記のSQLが外部パラメータ等により、SQLが置き換わると言う事が無ければ、 下記の形式でストアドを作成出来るかと思います。
↑ SQL文を格納する変数も必要なく、そのままのSQLを記述するだけです。 SQL Server 2000 でストアドプロシージャのお勉強 http://www.netdive.jp/storedprocedure.html | ||||||||||||
|
投稿日時: 2008-02-19 20:19
あぅ、ゴメンナサイ・・・orz 更に他のストアドプロシジャを呼ぶようにしてみては?っていうつもりでした。 #ですが、本文中の「ストアドプロシジャ」の部分を見逃していたのは事実です(ーー; sp_executesqlを使っているのは動的にSQL文を発行しなければならない状況なのだと思いました。 しかし、そこまで長文になるようなSQL文を発行するよりは、幾つかのストアドプロシジャに分割したほうがいいのではないか?と思ったのです。 ただ、本文にはそこまで詳しくSQL文が書かれてなかったので、
と書きました。 | ||||||||||||
|
投稿日時: 2008-02-20 08:46
nakaPさん、上総さん、レスありがとうございます。
今回の内容は、動的SQLで、更に外部パラメータによってSQL文の中身が変化します。 また、そのSQL文をOPENQUERYとして使用します。 その為、出来る限り細かく抽出条件を指定したSQL文をリンクサーバーへ渡し、必要最低限の結果のみを受け取りたいのです。 SQL文を幾つかのストアドに分けて実行すると結果を抽出するまでの時間的なロスが発生するのでは?と思います。 | ||||||||||||
|
投稿日時: 2008-02-20 09:00
たとえば
declare @sql1 nvarchar(4000),@sql2 nvarchar(4000),@sql3 nvarchar(4000) /* SQL文作成のロジック */ exec @sql1+@sql2+@sql3 とかって僕はやってますけど、、、SQLServer2000です。 | ||||||||||||
|
投稿日時: 2008-02-20 09:42
oracleさん、レスありがとうございます。
ちなみにoracleさんはどのようなSQLを使用しているのでしょうか?具体的に教えていただけないでしょうか? 私がクエリアナライザで試したところ、エラーが表示され「+」は使用できませんでした。 --------------------------------------------- DECLARE @SQL1 NVARCHAR(4000) DECLARE @SQL2 NVARCHAR(4000) SET @SQL1 = 'SELECT * FROM ACCESSLOG' SET @SQL2 = 'WHERE HOSTNAME = ''19840013A''' EXEC @SQL1 + @SQL2 ============================================ サーバー : メッセージ 170、レベル 15、状態 1、行 26 行 26: '+' の近くに無効な構文があります。 --------------------------------------------- ちなみに、「EXEC」を「EXECUTE sp_executesql」に変えても同じでした。 | ||||||||||||
|
投稿日時: 2008-02-20 10:00
括弧でくくってあげて下さい。
--------------------------------------------- DECLARE @SQL1 NVARCHAR(4000) DECLARE @SQL2 NVARCHAR(4000) SET @SQL1 = 'SELECT * FROM ACCESSLOG' SET @SQL2 = 'WHERE HOSTNAME = ''19840013A''' EXEC(@SQL1 + @SQL2) --------------------------------------------- EXECUTEステートメントを使用した場合はアドホッククエリとなりますので 同一SQLでも実行プランがキャッシュされませんので注意して下さい。 使用の際にはDBAの方と相談された方が良いと思います。 |