お世話になります。
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
宜しくお願い致します。
No.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
No.1
- 回答日時:
Oracleだったら
substr(元の文字列, 切り出し位置, 切り出し文字数)
が使えるけど、SQL Serverでは無理ですか?
ACCESSならだったら
Mid(元の文字列, 切り出し位置, 切り出し文字数)
ですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- JavaScript console.logがどうしても2つ機能しないのでアドバイスをくださいお願いします 2 2022/07/07 22:13
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) countifsについての質問 3 2023/03/08 13:45
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Oracleのデータ型、NUMBERについて
-
文字列をsplitするSQL文を教え...
-
SQLServerで文字列の末尾からあ...
-
データの先頭文字の置換
-
あいまい検索で数字から始まるもの
-
文字列からアルファベットだけ...
-
差し込み後、元データを変更し...
-
フィルターかけた後、重複を除...
-
SELECT 文 GROUP での1件目を...
-
access2021 VBA メソッドまたは...
-
エクセルで最後の文字だけ置き...
-
datetime型でNULL値を入れたい。
-
重複していないレコードの抽出...
-
EXISTSを使ったDELETE文
-
カーソル0件の時にエラーを発生...
-
INSERT文でフィールドの1つだ...
-
for whichの使い方
-
COBOL プログラミング
-
PL/SQLの変数について
-
access2003 クエリSQL文に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Oracleのデータ型、NUMBERについて
-
SQLServerで文字列の末尾からあ...
-
データの先頭文字の置換
-
数値フィールドのワイルドカー...
-
文字列をsplitするSQL文を教え...
-
文字列を time 型に変換するには。
-
文字列からアルファベットだけ...
-
select文の書き方で分からない...
-
あいまい検索で数字から始まるもの
-
数値が定期的にあらわれる文字...
-
PostgreSQLのvarcharとtext
-
VBA 3重ループ 独学勉強中
-
v$sysstatの値がオーバーフロー
-
select条件で文字列項目...
-
差し込み後、元データを変更し...
-
フィルターかけた後、重複を除...
-
エクセルで最後の文字だけ置き...
-
外部参照してるキーを主キーに...
-
SELECT 文 GROUP での1件目を...
-
for whichの使い方
おすすめ情報