• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQL中の自作関数)

SQL中の自作関数で都道府県別に連番取得

このQ&Aのポイント
  • ADOとADO.NETを使用してSQL中の自作関数を作成し、都道府県別に連番を取得する方法についての質問です。
  • ADOで関数を作成すると正常に処理されますが、ADO.NETでは実行時エラーが発生します。
  • どうすればADO.NETでも関数が正常に処理されるようになるのでしょうか?

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

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

今回質問者さんは、 「ADO.NETだと自作の関数を組み込んだSQL文が発行できない」 ということですが、 私もADO.NETに自作関数を組み込んだSQLを発行しようとしたことがあります。 実現できなかったので、クエリ化したりして対応をいたしました。 そこで、 「テーブルに存在する都道府県をID化するSQL文を発行したい」 というのであれば、関数から値を引っ張るのではなく、マスタテーブルを参照させて、それから値を引っ張るという方法があります。 むしろその方が、今後の事を考えると、良いと思います。 まず ※1.[都道府県マスタ]テーブルを作成 カラム1:都道府県[テキスト型] ←主キー カラム2:Pref_Code[テキスト型] 続いて、 ※2.[]テーブルをにデータを入力 [都道府県][Pref_Code] 北海道 01 青森県 02 岩手県 03 宮城県 04 秋田県 05 山形県 06 福島県 07 茨城県 08 ・・・・・・・・・・ って感じ それから ※3.以下のSQL文を発行 UPDATE KEN_ALL LEFT JOIN 都道府県マスタ ON KEN_ALL.Pref = 都道府県マスタ.都道府県 SET KEN_ALL.Pref_Code = [都道府県マスタ].[Pref_Code]

noname#27115
質問者

お礼

やっぱり、自作関数はダメですか・・ ADO.NetでダメというよりVB2005ではダメって感じですね。 VB2005上のADOでもやってみたのですが、怒られました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • miyuyu
  • ベストアンサー率61% (30/49)
回答No.2

ちょっと気になるのですがAC2002で動いていると言う mySQL = "UPDATE KEN_ALL SET KEN_ALL.Pref_Code = Get_Pref_Code([Pref])"...は mySQL = "UPDATE KEN_ALL SET KEN_ALL.Pref_Code = " & Get_Pref_Code(Pref) ではないのですか?

noname#27115
質問者

補足

>mySQL = "UPDATE KEN_ALL SET KEN_ALL.Pref_Code = " & Get_Pref_Code(Pref) ではないのですか? これだとSQLの実行時でなくてSQLの作成時に関数が評価されてしまいますね。また、[Pref]はフィールで名であって、変数名じゃないので・・・・エラーになります。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • access 自作関数をフォームで使うとき

    お世話になります。 ACCESS2000でシステムを作っています。 商品コードを年・月をコード化したものに、日付2ケタを足したものを作成する scdという関数を作り、フォームのフィールドに、表示したのですが、 #Name!?と表示されていうまくいきません。 どうすればいいですか? 関数は以下のようになっています。 Public Function scd() As String Dim hiduke As Date Dim yc As String Dim mc As String Dim dc As String Dim strtmp As String hiduke = Date '年コードを設定 Select Case Year(hiduke) Case Is = 2012 yc = "a" Case Is = 2013 yc = "b" Case Is = 2014 yc = "c" Case Is = 2015 yc = "d" Case Is = 2016 yc = "e" Case Is = 2017 yc = "f" Case Else MsgBox "年コードを追加してください" End Select '年コードを設定 Select Case Month(hiduke) Case Is = 1 mc = "a" Case Is = 2 mc = "b" Case Is = 3 mc = "c" Case Is = 4 mc = "d" Case Is = 5 mc = "e" Case Is = 6 mc = "f" Case Is = 7 mc = "g" Case Is = 8 mc = "h" Case Is = 9 mc = "i" Case Is = 10 mc = "j" Case Is = 11 mc = "k" Case Is = 12 mc = "l" End Select '日付を設定 dc = Format(hiduke, "dd") strtmp = yc & mc & dc scd = strtmp End Function

  • 【php】改行にエスケープ文字が入る

    phpで  $_GET['a'] = stripslashes($_GET['a']); $_GET['a'] = mysql_real_escape_string($_GET['a']); $_GET['a'] → インサート と途中に stripslashes mysql_real_escape_string をはさんでから GETやPOSTを取得してるんですが改行が改行コードに変わってしまいます。 例えば質問フォームとかで  ---------------------------------------- 質問内容 ---------------------------------------- なんたら かんたら  ↓ サブミット ---------------------------------------- 投稿確認 ---------------------------------------- なんたら\n\rかんたら みたいなかんじです。 一旦文字コードをEUCにかえてから mysql_real_escape_stringを挟んだりしたりもしてみてますが 改行が改行コードになってしまいます。

    • ベストアンサー
    • PHP
  • SQLのグループ化動作について

    グループ化と集計関数の動作について質問させてください。 MySQL、SQLiteて実行しました。 [テーブル:ninzu_tbl] ken sex ninzu 福岡 1 50 福岡 2 60 佐賀 1 40 佐賀 2 30 長崎 1 60 長崎 2 50 性別(sex)でgroup byして人数を求めるSQLを実行した場合、 sumを使用するSQL(1)を実行すると福岡、佐賀、長崎のそれぞれの人数が表示されますが、 sumを使用しないSQL(2)を実行した場合、長崎の人数のみが表示され、福岡、佐賀の人数が 空白になります。 group byでグループ化した場合に、最後尾のキー項目以外のデータが 上書きされ、福岡、佐賀のデータが飛んでしまったのではと考えましたが、 (1)を実行した場合に県ごとのデータが表示される理由がわかりません。 理由がわかる方、教えていただけませんか? もしくは、グループ化の処理イメージができるサイトを教えてください。 よろしくお願いします。 (1) 結果が表示されるSQL select sex as '性別' , sum(case when ken = '福岡' then ninzu else null end) as '福岡' , sum(case when ken = '佐賀' then ninzu else null end) as '佐賀' , sum(case when ken = '長崎' then ninzu else null end) as '長崎' from ninzu_tbl group by sex (2) 福岡と佐賀の結果が表示されないSQL select sex as '性別' , case when ken = '福岡' then ninzu else null end as '福岡' , case when ken = '佐賀' then ninzu else null end as '佐賀' , case when ken = '長崎' then ninzu else null end as '長崎' from ninzu_tbl group by sex

  • SQL文の実行に失敗しました???

    すみませんが、お助けください。私は、PHPの初心者で現在猛特訓でマスター中です。よろしくお願いします。現在、本を購入し、そこに記述されている通りやってみているのですが、今まで上手くできていたのですが、ここの記述ではどうしてもエラーが出てしまいます。そこでお願いで投稿しました。 <利用環境> ・レンタルサーバー/ラピッドサーバー RV-310 ・MYSQL/MySQL 4.1.18 ・「動物名」と「動物の年齢」を入力する練習フォームとPHP ■php内容 insert.php ※フォームは文字数の関係で省略しました <?php // データベースへの接続情報を設定します。 $dbUser = "***"; $dbPass = "***"; $dbHost = "localhost"; $dbName = "***"; // フォームから送信されたデータを取得します。 $animal_c = $_POST['animal_c']; $age_c = $_POST['age_c']; // mysqli_escape_stringを使用してエスケープを行うため、 // magic_quotes_gpcがOnの場合、エスケープされた文字を元に戻します。 if( get_magic_quotes_gpc() ){ $animal_c = stripslashes( $animal_c ); $age_c = stripslashes( $age_c ); } // MySQLとの接続を行ないます。 $db = mysql_connect( $dbHost, $dbUser, $dbPass ) or die( "MySQL DBとの接続に失敗しました" ); // クライアントの文字コードセットをEUC-JPに変更します。 mysql_query( "SET NAMES ujis", $db ); // データベースを選択します。 mysql_select_db( $dbName, $db ) or die( "データベース" . $dbName . "との接続に失敗しました。" ); // エスケープ処理を行います。 // 数値が入る事が予測される値もエスケープ処理は必ず行います。 $animal_c = convSqlString( $animal_c ); $age_c = convSqlString( $age_c ); // SQL文を記述します。 // フォームより送信されたデータを追加します。 $query = "INSERT INTO zoo SET animal_c='$animal_c', age_c='$age_c'"; // SQL文を実行します。 mysql_query( $query, $db ) or die( "SQL文の実行に失敗しましたbbbbb" ); // SQL文に使用するための文字列をエスケープする関数です。 function convSqlString( $string ){ global $db; // SJISでは2バイト目にメタ文字\のコード(0x5c)を含む場合に、 // このコードもエスケープしてしまうので、 // EUC-JPに変換してエスケープします。 // Linuxでの実行などファイルをEUC-JPにエンコードした場合には // コメントアウトしてください。 // $string = mb_convert_encoding( $string, "EUC-JP", "SJIS" ); // mysqli_escape_stringを使うことにより、 // 'や\などが適切にエスケープされます。 // MySQLのバージョン4.1.2未満を使用している場合は、 // 下の1行を$string = mysql_escape_string( $string ); // に変更してください。 $string = mysql_escape_string( $string ); // 再度SJISに変換して返します。 // Linuxでの実行などファイルをEUC-JPにエンコードした場合には // コメントアウトしてください。 // $string = mb_convert_encoding( $string, "SJIS", "EUC-JP" ); return $string; } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=EUC-JP"> <title>PHPサンプルスクリプト</title> </head> <body bgcolor=#FFFFFF> データを追加しました。 </body> </html> <? // データベースから切断します。 mysql_close( $db ); ?> ■エラー内容(ブラウザ表示) SQL文の実行に失敗しましたbbbb でエラー構文が出てしまいます。 もしお分かりの方がいればアドバイスいただければ幸いです。

    • 締切済み
    • PHP
  • VBAで使う「MySQL」と言う変数名について

    ネットなどでVBAのサンプルコードを見ていると Dim MySQL As String としているのを何度か見かけますが MySQLとはACCESSとは別のアプリケーションだと思っているのですが なぜ MySQL と言う変数名を使うのでしょうか? ADOで Set RS = New ADODB.Recordset SQL = "SELECT * FROM T生徒名" RS.Open SQL, CN, adOpenKeyset, adLockOptimistic としたいために Dim SQL As String と宣言するなら納得できますが MySQLは違和感を感じます。 どうでもいいことですが教えてください。 よろしくお願い致します。

  • SQLインジェンクション対応について

    現在、PHPでのセキュリティ対策の一環として、SQLインジェンクション対応のためのユーザ入力値をチェックするための関数を検討しています。 以下のサイトなどを参考に、以下のようなサンプルコードを検討してみました。 特筆すべき点は、PHPのマジッククォートがONになっているかどうかのチェックを最初に入れ、余分に不正コードをエスケープしないようにしたことでしょうか。 あまりセキュリティについて詳しくないので、有識者の方の見解を伺いたく投稿いたしました。その他付け加えるべきチェックなどありましたら、ご意見賜りたく存じます。 (参考にしたサイト) http://jp.php.net/manual/ja/security.database.sql-injection.php (サンプルコード) function str_check($value) { // strip slashes if (get_magic_quotes_gpc()) { $value = stripslashes($value); } // quote except numbers if (!is_numeric($value)) { $value = "'" . mysql_real_escape_string($value) . "'"; } return $value; } (使用例) $query = sprintf("SELECT * FROM users WHERE user=%s AND password=%s", str_chec($_POST['username']), str_chec($_POST['password'])); mysql_query($query);

    • 締切済み
    • PHP
  • これでSQLインジェクション対策できてますか??

    $search_query = "select SQL_CALC_FOUND_ROWS * from king"; $usersearch= mysql_real_escape_string($_GET['usersearch']); $clean_search = str_replace('、', ' ',$clean_search); $clean_search = str_replace(' ', ' ',$usersearch); $search_words = explode(' ', $clean_search); $final_search_words = array(); if (count($search_words) > 0) { foreach ($search_words as $word) { if (!empty($word)) { $final_search_words[] = $word; } } } // Generate a WHERE clause using all of the search keywords $where_list = array(); if (count($final_search_words) > 0) { foreach($final_search_words as $word) { $where_list[] = "syou LIKE '%$word%'"; } } $where_clause = implode(' AND ', $where_list); // Add the keyword WHERE clause to the search query if (!empty($where_clause)) { $search_query .= " WHERE $where_clause"; } $pid = intval($_GET['pid']); if ($pid < 1) $pid = 1; $limit_start_rows = ( $pid - 1 ) * 10; $search_query .= " LIMIT {$limit_start_rows}, 10"; $result = mysql_query($search_query); $num_rows_result = mysql_query("SELECT FOUND_ROWS()"); $num_rows = mysql_fetch_assoc($num_rows_result); $num_rows = $num_rows['FOUND_ROWS()']; if($num_rows== 0){ $message="該当データは見つかりませんでした。"; } else $message=$num_rows ."件該当しました<br/>"; echo $message; while($row = mysql_fetch_array($result) 2行目でGETした文字をmysql_real_escape_string()で囲っただけですが大丈夫でしょうか。。

    • ベストアンサー
    • PHP
  • 検索結果の分割表示時のSQLエラー

    PHP, MySQLで検索システムを作り、検索結果の分割表示をしようとしています。 その際、SQL文にエラーが生じるのですが、原因が調べてみてもわかりません。 検索条件のSQL文内のNUM_SHOPSという部分を数値に変えると1ページ目はきちんと分割表示されますが2ページ目以降が全件表示されてしまいます。 そして、NUM_SHOPSの部分をそのままにすると、SQLがエラーを起こします。var_dumpで$queryを確認すると、SQL文が二重に入ってしまっているのですが、どうしてこのような現象が起きるのかがいまいちわかりません。 アドバイス、ご指摘等いただけないでしょうか。 よろしくお願い致します。 以下に該当箇所のコードを記載します。 【result.php】 <?php require_once('config.php'); require_once('functions.php'); connectDb(); if (preg_match('/^[1-9][0-9]*$/', $_GET['page'])) { $page = (int)$_GET['page']; } else { $page = 1; } $offset = NUM_SHOPS * ($page - 1); //クエリ生成 $query = "SELECT * FROM テーブル名"; //検索条件抽出 $where = array(); if (isset($_GET['area'])and($_GET['area'] !== '')) { $where[] = sprintf("(area='%s')", mysql_real_escape_string($_GET['area'])); } if (count($where) <> 0) { $query .= ' where ' . implode(' and ', $where) . ' ORDER BY id DESC '; } if (count($where) <> 0) { $query .= "limit " . $offset . ", NUM_SHOPS" ; } var_dump($query); //Result $result = mysql_query($query) or die($query . '<br />' . mysql_error() . '<hr />'); //検索結果件数カウント $query = "SELECT COUNT(id) FROM テーブル名"; $where = array(); if (isset($_GET['area'])and($_GET['area'] !== '')) { $where[] = sprintf("(area='%s')", mysql_real_escape_string($_GET['area'])); } if (count($where) <> 0) { $query .= ' where ' . implode(' and ', $where) . ' ORDER BY id DESC'; } $total = mysql_result(mysql_query($query), 0); $from = $offset + 1; $to = ($offset + NUM_SHOPS) < $total ? ($offset + NUM_SHOPS) : $total; ?> 【config.php】 <?php define('DB_HOST', '*************'); define('DB_USER', '*************'); define('DB_PASSWORD', '*************'); define('DB_NAME', '*************'); //ページごとのショップ数 define('NUM_SHOPS', 10); //エラー表示 error_reporting(E_ALL & ~E_NOTICE); 【functions.php】 <?php function connectDb() { mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) or die("can not connect to DB:".mysql_error()); mysql_select_db(DB_NAME) or die("can not select DB: ".mysql_error()); } function h($s) { return htmlspecialchars($s); }

    • ベストアンサー
    • PHP
  • googlemapとphp

    PHPで都道府県プルダウンをつくり、プルダウンで選択された情報をgooglemapを表示しているhtmlに渡し、googlemapで表示したいと思っています。 以下はソースです。 main.php <html> <head> <title></title> </head> <body> <form method="get" action="<?=$_SERVER['PHP_SELF']?>"> <select name="pref"> <?=pref_form($_GET['pref'])?> </select> <input type="submit" value="選択"> </form> <?php … … $location ="千葉";←この部分☆☆☆ … if (ereg($location ,$title)) { … } function pref_code($prefno=''){ $pref_array=array( '北海道','青森県','岩手県','宮城県','秋田県','山形県','福島県', '茨城県','栃木県','群馬県','埼玉県','千葉県','東京都','神奈川県', '新潟県','富山県','石川県','福井県','山梨県','長野県','岐阜県', '静岡県','愛知県','三重県','滋賀県','京都府','大阪府','兵庫県', '奈良県','和歌山県','鳥取県','島根県','岡山県','広島県','山口県', '徳島県','香川県','愛媛県','高知県','福岡県','佐賀県','長崎県', '熊本県','大分県','宮崎県','鹿児島県','沖縄県' ); if($prefno==''){ return $pref_array; }else{ return $pref_array[$prefno]; } } //-------------------------------------------------------------------------- // 都道府県表示HTMLコードを生成する //-------------------------------------------------------------------------- function pref_form($pref=''){ $pa=pref_code(); if($pref){ $form="<option value=\"\">都道府県</option>\n"; }else{ $form="<option value=\"\" selected>都道府県</option>\n"; } foreach($pa as $p){ $form.="<option value=\"".$p."\""; if($pref==$p){ $form.=" selected"; } $form.=">".$p."</option>\n"; } return $form; } ?> </body> </html> test.html↓ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> … <script src="http://maps.google.com/maps?file=api&v=2&key=キー" type="text/javascript"></script> … … <script type="text/javascript"> //<![CDATA[ … function createmarker(){ … … } //]]> </script> </body> </html> PHPで選択された内容をhtml側で受け取らせgooglemapで表示する方法はありますでしょうか? またプログラム中盤の$location ="千葉";の部分で 現在は都道府県名を直接入れているのですが、 function pref_code($prefno=''){ から始まる都道府県プルダウンで選択された都道府県を変数に代入 して$location ="変数"; という形にしたいのですが、なにかいい方法はありませんでしょうか? ご教授の方お願いします。

    • ベストアンサー
    • PHP
  • 列を行に変換したいです。

    列を行に変換したいです。 SQLServer2008初心者です。 テーブル関数のFETCH内で以下のような図の列1~21を行に変換したいのですが、 うまくいきません。 CODE1 CODE2 CODE3 … CODE21 ----------+----------+----------+----------+---------- AAA BBB CCC … UUU ↓ 列1 ------ AAA BBB CCC … UUU 自分で調べたところ、SQLServer2005ではUNPIVOTを使えるということで 同じように書いたのですが、「'UNPIVOT'の近くに無効な構文があります」というエラーが出てきてしまいます。 ちなみに、以下のように書きました。 SELECT CODE FROM( SELECT CODE1, CODE2, …, CODE21 FROM 商品マスタ    WHERE SYCODE = @SYCODE ) AS TBL UNPIVOT (CODE for ColName in (CODE1, CODE2, …, CODE21)) AS CD UNPIVOTの使い方が間違っているようでしたらご指摘をお願いします。 また、UNPIVOTが使えない場合、 SELECT CODE1 FROM 商品マスタ WHERE SYCODE = 11111 UNION ALL SELECT CODE2 FROM 商品マスタ WHERE SYCODE = 11111 UNION ALL … という風に列21までのSELECT文をずらずらと統合することになるのかなぁ、と考えているのですが、 もっと簡潔な方法がありましたらご指導頂きたいです。 よろしくお願いします。