- ベストアンサー
T-SQL ユーザ定義関数 指定したバイト数までの文字列を返したい
お世話になります。 SQLserver2005でユーザー定義関数に初めてトライしているのですが デバッグツールがなく、うまく動かない理由がわからず困っております。 ある文字列に対して、指定したバイト数までの文字を返すような関数を作りたいです。VBAでいうLEFT関数のバイト数指定版というのでしょうか。(すでにそんな関数があったりして。。) 以下のように作ってみたのですが、無限ループのようで、いつまでたってもデータが返ってきません。。どなたか教えていただけませんでしょうか? set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go CREATE FUNCTION [dbo].[LeftByte] (@value nvarchar,@maxbyte bigint) RETURNS nvarchar(max) AS BEGIN declare @Countvalue as bigint declare @byte as bigint declare @result as nvarchar select @byte = 0 select @Countvalue = 0 select @result = '' while @byte < @maxbyte begin select @Countvalue = (@Countvalue + 1) select @result = (left(@value,@Countvalue)) select @byte = (datalength(@result)) if @byte >= @maxbyte break else continue end RETURN @result END 宜しくお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
パラメータの@valueが長さを指定していないので、1バイトとみなされ、どんなにやっても@maxbyte以上にならないから、無限ループなんだと思いますよ。 ちなみに、2005でtext型を勧めるのもどうかと思いつつ、 SELECT substring(convert(text,@value),1,@maxbyte) はたまに使います。
その他の回答 (1)
- bin-chan
- ベストアンサー率33% (1403/4213)
Oracleだったら substr(元の文字列, 切り出し位置, 切り出し文字数) が使えるけど、SQL Serverでは無理ですか? ACCESSならだったら Mid(元の文字列, 切り出し位置, 切り出し文字数) ですね。
補足
こんな感じで実現しました! ありがとうございます!! set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER FUNCTION [dbo].[LeftByte] (@value varchar(max),@maxbyte int) RETURNS varchar(max) AS BEGIN declare @Countvalue as int declare @Counter as int declare @byte as int declare @result as varchar(max) select @byte = 0 select @Countvalue = 0 select @result = '' select @Counter = len(@value) IF ISNULL(@VALUE,'') <> '' BEGIN while @Countvalue <= @Counter begin select @Countvalue = (@Countvalue + 1) select @result = (left(@value,@Countvalue)) select @byte = (datalength(@result)) if @byte = @maxbyte break else if @byte > @maxbyte begin select @result = (left(@value,@Countvalue - 1)) break end else continue end END RETURN @result END