dポイントプレゼントキャンペーン実施中!

お世話になります。

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


宜しくお願い致します。

A 回答 (2件)

パラメータの@valueが長さを指定していないので、1バイトとみなされ、どんなにやっても@maxbyte以上にならないから、無限ループなんだと思いますよ。



ちなみに、2005でtext型を勧めるのもどうかと思いつつ、
SELECT substring(convert(text,@value),1,@maxbyte)
はたまに使います。

この回答への補足

こんな感じで実現しました!
ありがとうございます!!

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

補足日時:2009/12/11 09:46
    • good
    • 0

Oracleだったら


substr(元の文字列, 切り出し位置, 切り出し文字数)
が使えるけど、SQL Serverでは無理ですか?

ACCESSならだったら
Mid(元の文字列, 切り出し位置, 切り出し文字数)
ですね。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!