- PR -

Text型の文字列連結(SQL Server 2000)

1
投稿者投稿内容
OASIS
会議室デビュー日: 2005/07/28
投稿数: 4
投稿日時: 2005-07-28 14:51
SQL Server 2000 とVB.NETで開発を行っています。

ストアド内でText型の変数にVarChar型文字列を追加したいのですが
方法が分からなくて困っています。

SET Text型変数 = Text型変数 + VarChar型文字列

のようにしたいのですが
エラー「データ型の演算子が無効です。データ型演算子は add、データ型は ntext です。」
が発生してしまいます。

上手く連結する方法を教えて頂けますでしょうか?
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-07-28 16:14
引用:

OASISさんの書き込み (2005-07-28 14:51) より:
SQL Server 2000 とVB.NETで開発を行っています。

ストアド内でText型の変数にVarChar型文字列を追加したいのですが
方法が分からなくて困っています。

SET Text型変数 = Text型変数 + VarChar型文字列

のようにしたいのですが
エラー「データ型の演算子が無効です。データ型演算子は add、データ型は ntext です。」
が発生してしまいます。

上手く連結する方法を教えて頂けますでしょうか?




TEXT型を+演算子に渡せないと思います。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/tsqlref/ts_ca-co_2f3o.asp
#「image 型、ntext 型、および text 型は除きます」と書かれていますしね。

TEXT型変数に入るサイズはどれぐらいでしょうか?

単純な考えで行くと
1)TEXT型変数をVARCHAR型へ変換
2)変換したものとVARCHAR型を+演算子で結合
3)結合した結果をTEXT型へ変換
っていうパターンがあるのですが、TEXT型⇒VARCHAR型にはサイズ制限があるので
注意が必要になります。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/tsqlref/ts_ca-co_2f3o.asp
#このページの真ん中ぐらいに
#「データ型の自動変換は、text 型および image 型ではサポートしていません。
#text 型データから文字型データへの変換、および image 型データから binary 型
#または varbinary 型への変換は、明示的に行うことができますが、最大の長さは 8000 です。」
#という記述がありますし。
OASIS
会議室デビュー日: 2005/07/28
投稿数: 4
投稿日時: 2005-07-28 16:25
夏椰さん、ありがとうございます。

説明不足で申し訳ありません。

TEXT型変数に入るサイズは8000バイトを超える文字列です。
初めはVarChar型の変数に文字列を追加していたのですが
8000バイトを超えることが分かった為、Text型に変更しました。

Text型への文字列の追加はどのようにすれば宜しいでしょうか?
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-07-28 16:54
引用:

OASISさんの書き込み (2005-07-28 16:25) より:

Text型への文字列の追加はどのようにすれば宜しいでしょうか?


最終的にTEXT型変数の内容をUpdateするという目的であればの話ですが、

TEXT型変数の文字列追加ではなく、
直接のUpdateはどうですか?
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/tsqlref/ts_ua-uz_6i2c.asp
でOFFSETを最後にして文字の追加って形をとってみては?
と思ったのですが。

どうでしょう?
OASIS
会議室デビュー日: 2005/07/28
投稿数: 4
投稿日時: 2005-07-28 17:24
早急なご回答ありがとうございます。

TEXT型変数は出力パラメータなので
TEXT型変数の内容を変更したいです。

下記のようにUpdateを使用してみましたが
エラー「 '@PO_Moji' の近くに無効な構文があります。」が発生しました。

UpdateはテーブルのText型の列を更新するものなんですね。
勉強になります。

TEXT型変数の内容を変更するのは不可能なのでしょうか?

-----------------------------------------
CREATE PROCEDURE Proc_test
(
@PO_Moji TEXT = '' OUTPUT
)
AS
DECLARE @Moji VARCHAR(200)
DECLARE @Ptrval BINARY(16)

SET @Moji = 'あいうえお'

SELECT @Ptrval = TEXTPTR(@PO_Moji)
UPDATETEXT @PO_Moji @Ptrval null 0 @Moji

RETURN 0
GO
-----------------------------------------


[ メッセージ編集済み 編集者: OASIS 編集日時 2005-07-28 17:33 ]
TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2005-07-29 00:39
引用:

OASISさんの書き込み (2005-07-28 17:24) より:

下記のようにUpdateを使用してみましたが
エラー「 '@PO_Moji' の近くに無効な構文があります。」が発生しました。




お疲れ様です。
text 型の OUTPUT パラメータでなければならない制限はありますでしょうか?
ストアドプロシージャ内でも text(ntext)型には非常に制限が多くて難しいと思います。
UPDATETEXT もテーブル内のカラムしか指定できませんので,パラメータの加工はできないと思います。

そこで,
一時テーブル内でテキストを加工して,その結果セットを返す方式では要件は満たせないでしょうか?

[code]-----
CREATE PROCEDURE [TextTest]
AS

--一時テーブル作成
CREATE TABLE #TempText
(
tempField text
)

--組み立て用のダミー行を追加
INSERT [#TempText](tempField) VALUES('')

--テキストを組み立て
DECLARE @insertText VARCHAR(8000)
DECLARE @pointer BINARY(16)

SET @insertText = SPACE(7999) + 'a'

SELECT @pointer = TEXTPTR(tempField) FROM #TempText
UPDATETEXT #TempText.tempField @pointer null 0 @insertText
UPDATETEXT #TempText.tempField @pointer null 0 @insertText

SELECT tempField FROM #TempText

RETURN 0
GO
[code]----

このストアドプロシージャを .NET からコールすると,
長さ16,000の文字列を返すことができます。

テキストの組み立て部分を変更して適用してください。

----------
TimberLandChapel
http://blogs.timberlandchapel.com
OASIS
会議室デビュー日: 2005/07/28
投稿数: 4
投稿日時: 2005-07-29 16:09
TLCさん、ありがとうございます。

VB.NETでストアドを呼び出し、その結果セットから目的の文字列を取得できました。

ご教授頂きありがとうございました。
1

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