Date: Sat, 8 Nov 2003 16:33:43 +0900
From: "Akira Horikawa" <who@example.ne.jp>
堀川です、こんにちは
-----Original Message-----
From: ko miguchi [mailto:who@sub.example.jp]
Sent: Wednesday, November 05, 2003 11:56 PM
To: who@example.ne.jp
Subject: [ml-msde:01224] nText の利用方法について
テキスト型列を設計するときに、行内テキスト文字列を許可するかどうかを
テーブルオプションで選択することができます。
(sp_tableoption ストアドプロシージャ参照)
行内テキストを許可すると、プログラムが面倒になるので、ここでは行内
テキストを使わない例にします。
データベースは、Sampleとする
Use Sample
GO
CREATE TABLE TBL(
ID INT PRIMARY KEY ,
TXT TEXT
)
GO
--行内BLOBは使わない
EXEC sp_tableoption 'TBL' , 'text in row', 'off'
GO
ストアドプロシージャを登録します。
CREATE PROCEDURE READ_TXT
@P VARBINARY(16) ,
@SKIP INT ,
@LENG INT
AS
SET NOCOUNT ON
READTEXT TBL.TXT @P @SKIP @LENG
このストアドプロシージャは、テキスト型列の部分文字列の読み出しに使います。
Use Sample
GO
SET NOCOUNT ON
DECLARE @STR VARCHAR(8000)
INSERT INTO TBL( ID ,TXT ) VALUES( 1 , 'AAAAA' )
--小さな文字列長であれば取得可能
SELECT @STR=TXT FROM TBL WHERE ID=1
PRINT @STR
GO
DECLARE @LN INT
DECLARE @pTXT VARBINARY(16)
DECLARE @TXT_1 VARCHAR(8000)
DECLARE @TXT_2 VARCHAR(8000)
DECLARE @TXT_3 VARCHAR(8000)
SELECT @TXT_1 = REPLICATE('A',8000)
SELECT @TXT_2 = REPLICATE('B',8000)
SELECT @TXT_3 = REPLICATE('C',8000)
INSERT INTO TBL( ID ) VALUES( 2 )
SELECT @pTXT = TEXTPTR(TXT) FROM TBL WHERE( ID = 2 )
IF( TEXTVALID('TBL.TXT', @pTXT) = 0 )
BEGIN
--無効なテキストポインタになっている
--UPDATE命令を実行し、初期化しなければいけない(適当な値を入れておく)
PRINT 'テキストポインタが無効な状態です'
UPDATE TBL SET TXT='dummy' WHERE ID = 2
END
--テキストデータを挿入する
SELECT @pTXT = TEXTPTR(TXT) FROM TBL WHERE( ID = 2 )
WRITETEXT TBL.TXT @pTXT @TXT_1
UPDATETEXT TBL.TXT @pTXT NULL 0 @TXT_2
UPDATETEXT TBL.TXT @pTXT NULL 0 @TXT_3
SELECT @LN=DATALENGTH(TXT) FROM TBL WHERE ID = 2
PRINT 'テキストの文字列長は=' + CAST(@LN AS VARCHAR)
--テキストデータの読み出し
DECLARE @TXT_11 VARCHAR(8000)
DECLARE @TXT_22 VARCHAR(8000)
DECLARE @TXT_33 VARCHAR(8000)
SET TEXTSIZE 8000
READTEXT TBL.TXT @pTXT 0 8000
READTEXT TBL.TXT @pTXT 8000 8000
READTEXT TBL.TXT @pTXT 16000 8000
--ストアドプロシージャでテキストの部分文字列の表示を行う
EXEC READ_TXT @pTXT , 0 , 8000
EXEC READ_TXT @pTXT , 8000 , 8000
EXEC READ_TXT @pTXT , 16000 , 8000
--ローカル一時テーブルに格納する
CREATE TABLE #TMP( PART INT IDENTITY(1,1) , STR VARCHAR(8000) )
INSERT INTO #TMP EXEC READ_TXT @pTXT , 0 , 8000
INSERT INTO #TMP EXEC READ_TXT @pTXT , 8000 , 8000
INSERT INTO #TMP EXEC READ_TXT @pTXT , 16000 , 8000
SELECT * FROM #TMP
SELECT @TXT_11=STR FROM #TMP WHERE PART=1
SELECT @TXT_22=STR FROM #TMP WHERE PART=2
SELECT @TXT_33=STR FROM #TMP WHERE PART=3
IF( @TXT_11=@TXT_1 ) PRINT '1:一致しました。OK'
IF( @TXT_22=@TXT_2 ) PRINT '2:一致しました。OK'
IF( @TXT_33=@TXT_3 ) PRINT '3:一致しました。OK'
DROP TABLE #TMP
DELETE FROM TBL
GO
TEXT型列の処理は面倒なので、T-SQLで処理するのを止めて、ADOなどの
オブジェクトを通じて、クライアント側で処理すれば、より簡単になります。
------------------------------------
(株)日本技術ソフト開発
堀川 明 (Akira Horikawa)
11月08日(土曜日) 15時46分記
mailto:who@example.ne.jp
http://www.horikawa.ne.jp/msde/
[MSDE/SQLServerに関して、今、どんなことにお困りですか?] |
よろしければお困りの内容を、電子メールで教えて下さい。 |
質問を電子メールで作成する
|
[ウィンドを閉じる][MSDE/SQLServer FAQ ][MSDE / MSDE2000 技術サポート情報一覧]
|