- PR -

SQL文の文字数

投稿者投稿内容
ともこ
大ベテラン
会議室デビュー日: 2007/09/14
投稿数: 111
投稿日時: 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文の末尾が切れてしまう為)
こういった場合どのように対応したら良いのでしょうか?どなたか良い方法がありましたらアドバイスをお願いします。
nakaP
大ベテラン
会議室デビュー日: 2005/09/27
投稿数: 138
お住まい・勤務地: 高知
投稿日時: 2008-02-19 17:48
こんにちは。
引用:

ともこさんの書き込み (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文の末尾が切れてしまう為)
こういった場合どのように対応したら良いのでしょうか?どなたか良い方法がありましたらアドバイスをお願いします。


SQL文の内容にもよりますが、ストアドプロシジャの検討はどうでしょうか?
上総
大ベテラン
会議室デビュー日: 2006/06/22
投稿数: 107
投稿日時: 2008-02-19 18:25
引用:

nakaPさんの書き込み(2008-02-19 17:48)より
SQL文の内容にもよりますが、ストアドプロシジャの検討はどうでしょうか?


え〜と、スレ主さんが提示されているサンプルが、既にストアドプロシージャと
記載されています。

引用:

スレ主さんの書き込み(2008-02-19 16:00)より
ストアドプロシージャ----------
DECLARE @SQL NVARCHAR(4000)

SET @SQL = 'SELECT * FROM 〜〜〜〜〜〜'

EXEC sp_executesql @SQL
------------------------------



今回の場合だと、SQLが動的SQLとして定義されているが為に、文字数の制限が
出ているものと思われます。

もし、上記のSQLが外部パラメータ等により、SQLが置き換わると言う事が無ければ、
下記の形式でストアドを作成出来るかと思います。

コード:
CREATE PROCEDURE プロシージャ名
(
@引数1 型
)AS
SELECT * FROM テーブル名 WHERE カラム名=@引数1;



SQL文を格納する変数も必要なく、そのままのSQLを記述するだけです。

SQL Server 2000 でストアドプロシージャのお勉強
http://www.netdive.jp/storedprocedure.html
nakaP
大ベテラン
会議室デビュー日: 2005/09/27
投稿数: 138
お住まい・勤務地: 高知
投稿日時: 2008-02-19 20:19
引用:

上総さんの書き込み (2008-02-19 18:25) より:
引用:

nakaPさんの書き込み(2008-02-19 17:48)より
SQL文の内容にもよりますが、ストアドプロシジャの検討はどうでしょうか?


え〜と、スレ主さんが提示されているサンプルが、既にストアドプロシージャと
記載されています。


あぅ、ゴメンナサイ・・・orz
更に他のストアドプロシジャを呼ぶようにしてみては?っていうつもりでした。
#ですが、本文中の「ストアドプロシジャ」の部分を見逃していたのは事実です(ーー;

sp_executesqlを使っているのは動的にSQL文を発行しなければならない状況なのだと思いました。
しかし、そこまで長文になるようなSQL文を発行するよりは、幾つかのストアドプロシジャに分割したほうがいいのではないか?と思ったのです。

ただ、本文にはそこまで詳しくSQL文が書かれてなかったので、
引用:

SQL文の内容にもよりますが


と書きました。
ともこ
大ベテラン
会議室デビュー日: 2007/09/14
投稿数: 111
投稿日時: 2008-02-20 08:46
nakaPさん、上総さん、レスありがとうございます。

今回の内容は、動的SQLで、更に外部パラメータによってSQL文の中身が変化します。
また、そのSQL文をOPENQUERYとして使用します。
その為、出来る限り細かく抽出条件を指定したSQL文をリンクサーバーへ渡し、必要最低限の結果のみを受け取りたいのです。
SQL文を幾つかのストアドに分けて実行すると結果を抽出するまでの時間的なロスが発生するのでは?と思います。


oracle
常連さん
会議室デビュー日: 2003/12/04
投稿数: 29
お住まい・勤務地: さいたま
投稿日時: 2008-02-20 09:00
たとえば
declare @sql1 nvarchar(4000),@sql2 nvarchar(4000),@sql3 nvarchar(4000)

/*
SQL文作成のロジック
*/

exec @sql1+@sql2+@sql3

とかって僕はやってますけど、、、SQLServer2000です。

ともこ
大ベテラン
会議室デビュー日: 2007/09/14
投稿数: 111
投稿日時: 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」に変えても同じでした。
いーた
大ベテラン
会議室デビュー日: 2004/07/12
投稿数: 154
お住まい・勤務地: 東京
投稿日時: 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の方と相談された方が良いと思います。

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