ストアドファンクション作成でエラーが発生する

このQ&Aのポイント
  • SQL Server 2005にてストアドファンクションを作成する際に、エラーメッセージが表示されてしまい、うまく作成できません。
  • 調査した結果、文法には問題がないようですが、どこに問題があるのか分かりません。
  • 正しいtypeを指定してくださいというエラーメッセージが表示されています。
回答を見る
  • ベストアンサー

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

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 --------------------------------

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

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

変な所にカンマがついていますよ。 >EndDate,

junzo_ex
質問者

お礼

失礼しました。。!!

関連するQ&A

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

    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 お恥ずかしいですがいくらコードを見てもどこが原因なのかわかりません。 申し訳ありませんがご教授お願いできませんでしょうか。 昨日から悩んでいます。 どうか助けて下さい、宜しくお願いします。

  • SQL ServerのストアドでUPDATEを実行すると・・・

    SQL Serverのストアド中でUPDATEを実行すると OUTパラメータの値が取得できなくなってしまいます。 何か制約などあるのでしょうか? わかる方よろしくお願いします。 1.UPDATE文をコメントアウトすると取得できます。 2.UPDATEは正常に実行されています。 /**参考ソース**/ /** 下記プログラムは、引数で取得した文字列に 連番テーブルの値をインクリメントした値と 結合しOUTパラメータに、連番テーブルには、 インクリメント結果をセットしています。 **/ CREATE procedure xml_get_document_seq @inDate varchar(14), @outSeq varchar(18) output as begin declare @Work varchar(4) declare @Seq varchar(18) declare @Number decimal(5) declare @SeqDoc varchar(18) if not exists(SELECT SEQ FROM XML_DOCUMENT_SEQ) begin INSERT INTO XML_DOCUMENT_SEQ(SEQ) VALUES(0) end set @Seq = ISNULL(@inDate,'') SELECT @Number = SEQ FROM XML_DOCUMENT_SEQ set @Number = @Number + 1 if @Number > 9999 begin  set @Number = 1 end set @Work = ISNULL(convert(varchar,@Number),'') set @SeqDoc= @Seq + replicate('0', 4 - datalength(@Work)) + @Work UPDATE XML_DOCUMENT_SEQ SET SEQ = @Number Set @outSeq = @SeqDoc return @Number end GO

  • ストアドファンクション⇒プロシージャ呼出し失敗する

    参考の通りに、ストアドプロシージャ作成SQL文を発行し、 コマンドライン上からは、以下の通りの結果1となり、 レコードがinsertされます。 <結果1> mysql> call logger('ほげ', 'ホゲ'); Query OK, 1 row affected (0.01 sec) mysql> select * from PROCEDURE_LOG; +--------+--------+---------------------+ | NAME | QUERY | EXECUTE_DATE | +--------+--------+---------------------+ | ほげ | ホゲ | 2014-03-26 10:41:26 | +--------+--------+---------------------+ 1 row in set (0.00 sec) ですが、testというストアドファンクションから呼び出してみましたが、 以下の結果2の通り、失敗します。 <結果2> mysql> select test(); ERROR 1336 (0A000): Dynamic SQL is not allowed in stored function or trigger <test> BEGIN CALL logger('test','1'); RETURN CONCAT('END'); END 現在動作している環境では、どこでエラーが発生したかがわからず、 ロガーの処理をなんとしても実装したいのですが、 いろいろ試してみても、解決できませんでした。 ご教示のほど、よろしくお願いします。 <参考> http://treeapps.hatenablog.com/entry/20120106/p1 <ストアドプロシージャ作成SQL文(logger)> SET NAMES UTF8; delimiter // -- ログ出力 DROP PROCEDURE IF EXISTS logger// CREATE PROCEDURE logger( IN PROCEDURE_NAME TEXT, IN SQL_TEXT TEXT ) BEGIN DECLARE CNT INT; CREATE TABLE IF NOT EXISTS PROCEDURE_LOG ( NAME VARCHAR(64), QUERY TEXT, EXECUTE_DATE TIMESTAMP, KEY IDX1 (NAME, QUERY(64), EXECUTE_DATE) ) ENGINE=MYISAM DEFAULT CHARSET=UTF8; -- 古いログを削除 SELECT COUNT(*) INTO CNT FROM PROCEDURE_LOG; IF CNT >= 1000 THEN DELETE FROM PROCEDURE_LOG LIMIT 1; END IF; -- テーブルにログを記録 SET @sql = CONCAT('INSERT INTO PROCEDURE_LOG VALUES (', QUOTE(PROCEDURE_NAME), ',', QUOTE(SQL_TEXT), ', null)'); PREPARE stmt FROM @sql; EXECUTE stmt; END // delimiter ;

    • ベストアンサー
    • MySQL
  • ODBC SQLサーバーでSQLを使いたい・・・

    ODBC SQLサーバーでSQLを使いたい・・・ SET NOCOUNT ON DECLARE @EDATE DATETIME DECLARE @CUNT INT SET @COUNT = 0 WHILE ( @I <> -7 ) BEGIN IF ( DATANAME( WEEKDAY, DATEADD( DD, -1, GETDATE()))) = "金曜" BREAK ELSE SELECT @CUNT = @CUNT + 1 END SET @EDATE = CONVERT( CHAR, CONVERT( VARCHAR, DATEADD(DD, @COUNT, GETDATE()), 112) SELECT @EDATE 実行日からさかのぼり、金曜日の日付を表示したいSQLを作成しています。 なぜか"金曜"がおかしいとエラーが出てしまいます。 どなたかわかる方いましたらご教授お願い致します。

  • ストアドプロシージャのbegin、end

    下記の様なストアドプロシージャを作成し、VB側から実行させています。 どうしても、★SQL文2★の後のreturn文を実行してくれません。 (VB側ではreturn値が0と判断します。) このreturn文を★SQL文2★の前に移動すると、return値が-1として正常に取得できます。 begin、endのブロックの記述に何か間違いがあるのでしょうか? 環境:sqlserver2000,windows2000,vb6 よろしくお願いします。 CREATE PROCEDURE [sp_AAA] @PARAM1 varchar(16) AS begin if (~) begin ★SQL文1★ if (@@ERROR <> 0) begin return @@ERROR end end ★SQL文2★ return -1 ←ココ end

  • MYSQL ストアドプロシージャの記述方法

    MYSQLのストアドプロシージャについて分からないことがあり質問させて頂きます。 SQLのwhere句の部分を引数によって条件分で変更させたいと考えています。そこでORACLEの場合は変数にいれて最後に明示的にSQLを発行して いたので可能だったのですが、MYSQLの場合はどういった記述になる のかわかりません。やりたいことは下記のような感じです。 ORACLEの場合は procedure prctest(pc out refcur,a in varchar2,b in varchar2) is sqldata varchar2(1000); whereinfo varchar2(1000); begin sqldata := 'select ID , NAME from testTbl '; if (a IS NOT NULL) then   whereinfo := whereinfo || ' acol = a ' ; end if; if (b IS NOT NULL) then   if (whereinfo IS NOT NULL) then  whereinfo := whereinfo || ' and ';   end if;   whereinfo := whereinfo || ' acol = b ' ; end if; if (whereinfo IS NOT NULL) then  sqldata := sqldata || ' where ' || whereinfo ; end if; open pc for sqldata; (ここでSQLが入ったSQLを発行) end prctest; (抜粋) ストアドをあまり使用したことがなく良い説明ではないかも しれませんが、アドバイスの方頂けたらと思います。 よろしくお願いします。

  • ループしてUPDATEするストアドについて

    よろしくお願いいたします。 表題の件どうしてもわからなかったので、皆様どうかご教示お願いいたします。 下記ストアドを作成いたしました。 内容としては UPDATE文 「ユーザー情報 SET 通知f1 = 1 WHERE (送信先1 IS NOT NULL) AND (送信先1 <> '')」 の 通知fが1から30 送信先が1から30 をループして実行するといったいたってシンプルなのもです。 が、なんか上手くいかないんです。 ALTER PROCEDURE [dbo].[test] AS DECLARE @Counter int DECLARE @StrFileds1 varchar(1000) DECLARE @StrFileds2 varchar(1000) SET NOCOUNT ON SET @Counter = 1 SET @StrFileds1='' SET @StrFileds2='' WHILE @Counter <= 30 BEGIN SET @StrFileds1='通知f'+Convert(varchar,@Counter) SET @StrFileds2='送信先'+Convert(varchar,@Counter) SET @Counter=@Counter+1 BEGIN UPDATE ユーザー情報 SET @StrFileds1 = 1 WHERE (@StrFileds2 IS NOT NULL) AND (@StrFileds2 <> '') END END

  • ストアドプロシージャによる動的SQLについて

    いつもお世話になっています。 SQLServer・ストアドプロシージャの、WHERE句を動的にしたいのですがうまくできません。 やりたいことは、履歴テーブルの受付、回答が済んでいる件数を取得したいのです。 回答時間は0時から5時までを一まとめ、20時から23時を一まとめ、その他は一時間毎に抽出したいのです。 CASE文で書いたのですが、エラーが起こってしまいます。 どのように書いたらよいのかご教授下さい。 受付時間が8時代の件数を取得する時、 このように書きました。 DECLARE @from_date datetime DECLARE @to_date_last datetime DECLARE @answer_count int SET @from_date = '2004/04/06' SET @to_date_last = '2004/06/05' SET @answer_time = 9 SELECT Count(R.受付時間) FROM 履歴 AS R WHERE LEFT(CONVERT ( varchar(20) ,R.受付時間, 8),2) = '08'    AND R.受付時間 between @from_date and @to_date_last CASE  WHEN @answertime = 5 THEN    AND LEFT(CONVERT ( varchar(20) ,R.回答時間, 8),2) <= '0' + LEFT( Convert(varchar(20),@answer_time),1)  WHEN @answertime > 5 AND @answertime < 10 THEN    AND LEFT(CONVERT ( varchar(20) ,R.回答時間, 8),2) = '0' + LEFT( Convert(varchar(20),@answer_time),1)  WHEN @answertime > 10 AND @answertime < 20 THEN    AND LEFT(CONVERT ( varchar(20) ,R.回答時間, 8),2) = Convert(varchar(20),@answer_time)  WHEN @answertime = 20 THEN    AND LEFT(CONVERT ( varchar(20) ,R.回答時間, 8),2) >= Convert(varchar(20),@answer_time) END

  • SQLの重大度エラーがうまく検知できません

    お世話になっています。 WindowsXP(SP3)、SQL2005(SP3)、VB6.0(SP6)で開発を行っています。 今、データベースにINSERTするトリガを作成していますが、TRY-CATCHがうまくいきません。今現在のコードは、次のようになっています。 ---コードはじめ DECLARE @ERR VARCHAR (2000) DECLARE @STR VARCHAR (2000) DECLARE @res int begin try EXEC @res = sp_executesql N'INSERT INTO TEST (SEIYMD,ZENYYYYMM,STYMD,SIMEBI) VALUES (null,0,0,0)'     if @res<>0 begin     raiserror('テストエラー1',11,1) end end try BEGIN CATCH     raiserror('テストエラー2',11,1) END CATCH ---コード終わり ここで、TEST(SEIYMD,ZENYYYYMM,STYMD,SIMEBI)は、すべてnumeric型で、null型を認めていません。 調べたところ、これでCATCHステートメントへ飛ぶようになると思うのですが、うまくいきません。 この原因、対策等を知っていましたら、ご教授ください。お願いいたします。

  • Mysql ストアドファンクション 意図しない結果

    以下の通りストアドファンクションを作成しました。 関数名:fgetLineNew インパラメータ:shop Varchar 8 ※1つだけ。。。 戻り値: Int 11 <ソース> BEGIN DECLARE pline INTEGER(11) DEFAULT NULL; SELECT COUNT(1) INTO pline FROM `hoge` WHERE `SHOP` = shop; IF pline IS NULL THEN SET pline = 10000; END IF; RETURN pline; END 上記のように、作成したストアドファンクションですが、 どんな引数を入れても、戻り値が全ての行(817行)になってしまいます。 以下を参照。 Where区がまったく働いていないのですが、何が原因なのでしょうか。 教えてください。 <ストアドファンクション実行> mysql> select fgetLineNew(1); +----------------+ | fgetLineNew(1) | +----------------+ | 817 | +----------------+ 1 row in set (0.01 sec) mysql> select fgetLineNew(525); +------------------+ | fgetLineNew(525) | +------------------+ | 817 | +------------------+ 1 row in set (0.01 sec) mysql> select fgetLineNew(101); +------------------+ | fgetLineNew(101) | +------------------+ | 817 | +------------------+ 1 row in set (0.00 sec) mysql> select fgetLineNew(525); +------------------+ | fgetLineNew(525) | +------------------+ | 817 | +------------------+ 1 row in set (0.00 sec) mysql> select fgetLineNew('525'); +--------------------+ | fgetLineNew('525') | +--------------------+ | 817 | +--------------------+ 1 row in set (0.01 sec)

    • ベストアンサー
    • MySQL