• ベストアンサー
  • すぐに回答を!

ストアドファンクションについて

最近SQL sarvarの勉強を始めた初心者です。 今、参考書を読みながらストアドファンクションを勉強してるんですが、 create function dbo.Fn_aaaaa (@dat datetime) returns char(14) as begin return cast(datepart(yyyy, @dat) as char(4)) + '年' + cast(datepart(mm, @dat) as char(2)) + '月' + cast(datepart(mm, @dat) as char(2)) + '日' + end という例題にある「returns char(14)」とはどういう意味なのかがよくわかりません。正直、戻り値という概念をしっかりと理解していない部分があり困っています。 本当に初歩的でもしかしたらSQLに関係のない質問かもしれませんがよろしければお教えください。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数512
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1

SQL Serverにはストアドファンクションが大別して2つあり、これはスカラー関数と呼ばれるものです。 もし、VBAでもjavaでも何かプログラミングをされたことがあれば、それらの関数と全く同じです。 今回挙げられている関数は日付を「YYYY年MM月DD日」という文字列に変換するものですが、RETURN CHAR(14)というのは、長さ14バイトの固定文字型(=char型)に変換されるということを意味します。 (「YYYY年MM月DD日」は全角2バイトとすれば14バイトです) SELECT GETDATE() ---------------------------------------- 2008-11-29 01:33:43.197 SELECT dbo.Fn_aaaaa(GETDATE()) ---------------------------------------- 2008年11月29日 他の例も見ればイメージできますかね? --1日後に変換する(戻りも日付型) create function dbo.Fn_bbbbb (@dat datetime) returns datetime as begin return dateadd(d,1,@dat) end SELECT dbo.Fn_bbbbb(GETDATE()) ---------------------------------------- 2008-11-30 01:33:43.197 --月だけ返す(戻りは整数型) create function dbo.Fn_ccccc (@dat datetime) returns int as begin return month(@dat) end SELECT dbo.Fn_ccccc(GETDATE()) ---------------------------------------- 11 ポイントがずれていればごめんなさい。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

とてもわかりやすく丁寧に説明ありがとうございます。 おかげさまででしっかりと理解できました。

関連するQ&A

  • ストアドファンクションがうまく作成できない

    SQL Server 2005 にて、 以下のようなストアドファンクションを作成しようとしても、 「メッセージ 156、レベル 15、状態 1、プロシージャ TestKansu、行 30 キーワード 'end' 付近に不適切な構文があります。」 といったエラーメッセージが表示されてしまい、 うまく作成できません。。 文法など、いろいろ調べてみたところ、特に問題なさそうな 感じではあるのですが。。 どこに問題があるのか、どなたかご教授願えないでしょうか? なにとぞ、よろしくお願いいたします。 -------------------------------- use tempdb go -- 呼び出し形式 create function TestKansu ( @Date as datetime, @Type as varchar(1) ) returns @ReturnTable table ( StartDate varchar(8), EndDate varchar(8) ) as begin if @Type is null begin raiserror('正しいtypeを指定してください',-1,-1) end if @Date is null begin SET @Date = getdate() end if @Type = '0' begin insert into @ReturnTable select convert(varchar(8), dateadd(dd ,-2 ,@Date), 112) as StartDate, convert(varchar(8), dateadd(dd ,-2 ,@Date), 112) as EndDate, end if @Type = '1' begin insert into @ReturnTable select convert(varchar(8), @Date, 112) as StartDate, convert(varchar(8), @Date, 112) as EndDate end return end --------------------------------

  • ストアドファンクションのエラーについて

    PostgreSQLでストアドファンクションを作成しました。 ファンクションの内容は下記の通りです。 CREATE FUNCTION getRenban (VARCHAR) RETURNS VARCHAR(7) AS ' DECLARE key ALIAS FOR $1; code VARCHAR(7); code2 VARCHAR(2); code5 VARCHAR(5); renban INTEGER; new_code VARCHAR(7); BEGIN SELECT MAX(code) INTO code FROM M_ITEM WHERE flg = TRIM($1); code2 := TRIM($1); IF code IS NULL THEN renban := 1; ELSE SELECT SUBSTR(code, 2) INTO code5; SELECT TO_NUMBER(code5, ''99999'') INTO renban; renban := renban + 1; END IF; code5 := ''''; SELECT TO_CHAR(renban, ''00000'') INTO code5; SELECT code2 || code5 INTO new_code; RETURN new_code; END; ' language 'plpgsql' ; コンソール上で下記のコマンドを実行したらエラーが出力されました。 SELECT getrenban('01'); 出力されたエラーの内容は下記の通りです。 ERROR: value too long for type character varying(5) CONTEXT: PL/pgSQL function "getrenban" line 19 at SQL statement お恥ずかしいですがいくらコードを見てもどこが原因なのかわかりません。 申し訳ありませんがご教授お願いできませんでしょうか。 昨日から悩んでいます。 どうか助けて下さい、宜しくお願いします。

  • ODBC SQLサーバーでSQLを実行したい・・・

    ODBC SQLサーバーでSQLを実行したい・・・ 昨日から入り浸っている初心者PGです。 昨日は、実行日から直近の金曜日の日付を抽出するというSQLを質問させて頂きました。 今回は前月の月初第一金曜日に当たる日付を出力するSQLについての質問となります。 下記のSQLは先輩が作成したSQLになります。 もっと簡単に書けないか悩んでいます。 補足として日付は8桁で出力をしたいです。(例:20100507) 宜しければご教授賜りたいです。(原文そのままコピーしてますw) /* いけてるsql */ SELECT case (6 - (datepart(Dw,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime)))) when '-1' then datename(year,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime) + 6) + datename(month,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime) + 6) + RIGHT('00'+CONVERT(varchar,datename(day,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime) + 6) ),2) else datename(year,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime) + (6 - (datepart(Dw,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime))))) + datename(month,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime) + (6 - (datepart(Dw,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime))))) + RIGHT('00'+CONVERT(varchar,datename(day,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime) + (6 - (datepart(Dw,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime))))) ),2) end

  • ストアドファンクションを差し替えたい

    VIEW は、CREATE OR REPLACE VIEW のようにして差し替えることができますが、 ストアドファンクションは、このような差し替えには対応していないのでしょうか? 本番稼動しているデータベースのストアドファンクションを差し替えたい場合は、 BEGIN DROP FUNCTION CREATE FUNCTION COMMIT とすればよろしいでしょうか?

  • ストアドファンクションで

    ストアドファンクションで、複数の値を返すことはできないのでしょうか? 例えば、Oracleなら構造体のユーザ型の値を返したりできます。 versionは、5.1.28です。 よろしくお願いします。

  • ストアドでVB.NetのDataGridにDataTime型のデータの時間だけを返したいです。

    DBはMSDE。 肝心のフィールドはTimeでDateTime型で、以下のようなデータがあります。 Time 5:00:00PM 5:30:00AM . . これをストアドで返します。普通に SELECT Time ... 以下略。 クライアント側、sqlCommand -> パラメタ の設定 -> sqlDataAdapter -> DataSetにエントリを返し -> DataGrid1.DataSource = DataSet.Tables(0) これで、実行すると、返ってくる値は すべて 30/12/1899 となります。時間の部分は何も出ません。これはDB側に、日にちを入れてないので出てくるデフォルト値と思われます。 次に、前の SELECT文に CAST(sql_variant、Time) を加えると、30/12/1899 5:00:00PM と出ますが、sql_variant型なので、SABSTRINGで切れません、上のCAST文にさらにCONVERT(Varchar(30),,)をかぶせると、30/12/1899 に戻ってしまいます。 今まで試した方法は、 CONVERT(Varchar(30),Time,108) CONVERT(Varchar(30),Time,8) CONVERT(char(30),Time,108) CONVERT(Varchar(30),Time) EXTRACT (Time.....) 等などあらゆる方法(データ型のバリエーションを含む)を試みましたが、返されのは30/12/1899ばかりです。 DateTimeはDB側で比較のクエリに使用するのでをVCharに変えることはできません、Timeのデータにダミーの日にちを付け加えたくもありません。 なんとか時間だけを取る方法をご教授ください。お願いします。

  • ストアド cast演算子 char型→int型に変換

    SQLServerのストアドで困ってます。 int型の数値(suuti1)とchar型の数値(suuti2)を計算させたくて、 以下のようなSQL文を書いたのですが、実行できなくて困ってます。 ※エラーはでません。 kekka = suuti1 + CAST(suuti2 AS INTEGER) どうすれば計算できるでしょうか? 教えてください。

  • ストアドファンクションの再帰呼び出しについて

    「ストアドファンクションの再帰呼び出し」はできないのでしょうか。 hoge関数をhoge関数の中で呼び出しています。 hoge関数では、条件に当てはまらないと第三引数を、 編集して再帰呼出しをしています。 再帰呼出しする条件を引数に設定して実行すると、以下の実行結果(ERROR)が表示されます。 <実行結果> mysql> select hoge('7','1234','1234567891012'); ERROR 1424 (HY000): Recursive stored functions and triggers are not allowed. よろしくお願いします。

    • ベストアンサー
    • MySQL
  • ストアドファンクションの実行

    CREATE OR REPLACE FUNCTION hoge(str IN VARCHAR2) ~ を作成した後、 PL*SQLにてSQL> exec hoge('fuga'); を実行すると、 行1でエラーが発生しました。: ORA-06550: 行1、列7: PLS-00221: 'hoge'がプロシージャではないか、または未定義です・ ORA-06550: 行1、列7: PL/SQL: Statement ignore と言われます。 どうすればエラーを解決できますでしょうか? 助言を宜しくお願い致します。

  • DateTime.ParseExactについて

    DateTime.ParseExactについてハマっております。 VB2010環境にてDateTime.ParseExactの質問をさせてください。 http://www.atmarkit.co.jp/fdotnet/dotnettips/203dateparse/dateparse.html こちらのページを参考してDateTime.ParseExactの使い方を練習しております。 この2つについては希望通り出力されました。 Dim d, f As String Dim dt As DateTime d = "20040824202306" f = "yyyyMMddHHmmss" dt = DateTime.ParseExact(d, f, Nothing) d = "2004年08月24日20時23分06秒" f = "yyyy年MM月dd日HH時mm分ss秒" dt = DateTime.ParseExact(d, f, Nothing) しかし、これについてエラーが出てしまいます。 d = "2004/08/24 20:23:06" f = "yyyy/MM/dd HH:mm:ss" dt = DateTime.ParseExact(d, f, Nothing) 「FormatException はハンドルされませんでした。  文字列は有効な DateTime ではありませんでした。」 試しに日付だけにして試してみましたがやはり同じエラーが出ます。 d = "2004/08/24" f = "yyyy/MM/dd" dt = DateTime.ParseExact(d, f, Nothing) どこが間違っているのでしょうか。 ご指導のほど、よろしくお願い致します。