• 締切済み

ユーザ定義関数を使用して、列名を返すことは可能?

22歳男性です。SQLServerについて質問があります。 =============================================== select * from テーブル名 where F_xxx(@a) like '%あ' ----------------------------------- create function F_xxx (@a int) returns ■■■ as begin return ( case @a when 1 then '社員ID' when 2 then '社員名' end ) end =============================================== 上記のように、ユーザ定義関数(F_xxx)を作り、特定の数値が来た場合に列名を返すプログラムを作りたいのですが、戻り値のデータ型(■■■)がわかりません。 データ型に「Column型」みたいのはあるのでしょうか? 知っている方がいましたら、教えてくださいマシ。

みんなの回答

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

文字通り、動的にクエリを構築することです。 今回の目的とは一致しないでしょうが、SQL Serverでは以下のようなストアドプロシージャを書くことはできますので、これを見て動的クエリが何か察して頂ければと思います。 --テーブル名、カラム番号、キーワードを指定して、 --そのカラムの末尾にキーワードがあるかどうか検索するストアド CREATE PROCEDURE sp_srch (@TABLENAME sysname, @COLNO int,@SRCHWORD varchar(100)) AS BEGIN SET NOCOUNT ON --指定されたテーブルの列が検索可能な型かどうか調べる DECLARE @COLNAME sysname SELECT @COLNAME=name from sys.columns WHERE object_id=object_id(@TABLENAME) AND column_id=@COLNO AND user_type_id in (SELECT user_type_id from sys.types WHERE name in ('varchar','nvarchar','char','nchar')) IF (@@ROWCOUNT=0) BEGIN SELECT 'Wrong Parameter' RETURN END --動的クエリを組み立てる DECLARE @sql varchar(max) SET @sql = 'SELECT * FROM '+@TABLENAME +' WHERE '+@COLNAME+' LIKE ''%'+@SRCHWORD+'''' EXEC (@sql) END --実行例 EXEC sp_srch 'テーブル名',2,'あ'

hacker_d
質問者

補足

む、むずかしぃ・・・・

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

アプリケーションプログラマの発想で理解はできますが、考えておられるような関数はつくれないです。 テーブル名、列名は動的には指定できません。動的クエリを使うしかないです。

hacker_d
質問者

補足

動的クエリとは何でしょうか?

関連するQ&A

  • ストアドでの値のとり方について

    以下のようなストアドでac_valueのcase文3の時は'ZZZ'のところに ac_testの値を入れたいのですが、どうすればよろしいでしょうか? SQLServer2000です。 よろしくお願い致します。 CREATE PROCEDURE usp_testA AS BEGIN SELECT A.filed1, A.filed2, (CASE A.filed3 WHEN 1 THEN 'SSS' ELSE 'TTT' END )ac_test, B.filed1, (CASE B.filed5 WHEN 1 THEN 'WWW' WHEN 2 THEN 'XXX' WHEN 3 THEN 'ZZZ' )ac_value FROM Ytable A Wtable B WHERE ・・・・・・ END GO

  • GROUP BY で列名は指定できないの?

    いつもお世話になっております。 SQLで GROUP BY を使うときに SELECT部分で指定した 列名を指定したいことがよくあると思います。 列名を指定する方法はないのでしょうか? 例) SELECT 項目A, CASE WHEN 項目B = 1 THEN '○' WHEN 項目B IN (2,3) THEN '×' END AS 丸バツ, SUM(数量) FROM TABLE GROUP BY 項目A, 丸バツ こんな風にGROUP BYで指定したいのですが・・・。

  • COPYを関数内で使用する時

    はじめまして。 下記のようにCOPYを関数内で使用したいと考えています。 CREATE FUNCTION test(TEXT) RETURNS void AS $$ BEGIN COPY(SELECT * FROM table1) TO $1 DELIMITER ','; END; $$ LANGUAGE plpgsql; これをpgAdmin3で実行すると$1の部分でsyntax errorとなり関数が作成できません。 $1の代わりに 'C://temp/foo.txt' と書けば通るのですが、何か良い方法はないでしょうか? やりたいことは、関数に保存先のファイル名を渡してデータをエクスポートするという処理です。 アドバイスお願いいたします。

  • SQLの条件式

    CASE WHEN データ列=1 THEN 列1 WHEN データ列=2 THEN 列2 WHEN データ列=3 THEN 列3 END AS 表示列名 上の様にデータ列の値によって取ってくる列を 変えたいのですがエラーが出て列の内容が取れません。 列1~3の型はそれぞれ別の型です。 条件によって取ってくる列を 指定する方法を教えてください。 よろしくお願いします。 環境はWin2kでSQLServer2000です。

  • ACCESS Viewでユーザー定義関数を使いたい

    ACCESS2000+MSDEで開発をしていますが、Viewの中でユーザ定義関数を使用したいのですが、できません。 1> create function dbo.count1(@linkNo int) 2> returns int 3> as 4> 5> begin 6> declare @cnt int 7> 8> select @cnt = count(*) from dbo.TBL_OA where [link] = @linkNO 9> 10> return @cnt 11> end 12> go 1> select dbo.count1(100) 2> go ----------- 1 (1 件処理されました) ここまでは上手く行くのですが、 ACCESS側でViewの列へ count1(100)と記述すると 「ADOエラー:'count1'は関数名として認識されません。」 とエラーになってしまいます。 方法は問いませんが、Viewの中でユーザー定義関数が使用できる方法、ご存知の方いらっしゃいましたら、よろしくお願いします。

  • AccessとSqlServer

    いまだ、Accessプロジェクトを利用しているものです。 SqlServerにユーザー定義関数(スカラ値関数)があり、Access(adp)からそのユーザー定義関数に、フォーム上のコントロール値をパラメータとして渡し、その戻り値をAccessで受け取りたいのですが、そのやり方で躓いています。   例 SqlServerのユーザー定義関数      Alter Function dbo.Total (@Para1 int,@Para2 int) Returns int As Begin Declare @Total int End BEGIN @Total = Para1 + Para2 Teturn(@Total) End      とし、      AccessのForm1のテキストボックス1、2をパラメータとして、テキストボックス3      に、SqlServerのユーザー定義関数の戻り値「@Total」を表示させたいと望んでいる     のですが。      お知恵を借りたく、質問させていただきました。

  • T-SQL ユーザ定義関数 指定したバイト数までの文字列を返したい

    お世話になります。 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 宜しくお願い致します。

  • oracleのfunctionで戻り値複数個

    oracleのストアドプロシージャのファンクションについてですが、 ファンクションは、戻り値を返すことができますが、 それを、複数個返すことはできるのでしょうか。 CREATE [OR REPLACE] FUNCTION ファンクション名(引数 IN データ型[, ...]) RETURN 戻り値の型 IS 宣言部 BEGIN 処理部 END ; お願いします。

  • ユーザ定義関数がうまく動きません。

    ユーザ定義関数がうまく動きません。 2月のA1セル値が1になっていたりします。 どこがおかしいのかわかりません。解決方法を教えていただけませんでしょうか。 よろしくお願いします。 【シートの設定】 シート名は1月・・・12月です。 各シートの A1セルは「=sheetname()」 B1セルは「月のチェックシート」 が入っています。 【VBAの設定】 Function SheetName() As String 'Application.Volatile If Len(ActiveSheet.Name) = 3 Then SheetName = Left(ActiveSheet.Name, 2) Else SheetName = Left(ActiveSheet.Name, 1) End If End Function

  • 【SQLServer】何も処理しない場合の記述について

    【SQLServer】何も処理しない場合の記述について お世話になってます。 ご存知の方いらっしゃいましたら教えてください。 Oracleでは、IF文の中で何も処理したくない場合、明示的にNULLと書けば、コンパイルできます。 IF XXXXX THEN A = 100 ELSE -- 何もしない NULL END たとえ何も処理しない場合でも、明示的にELSE句を 書きたい場合は、 SQLServerの場合、何をかけばよいのでしょうか? 今のところ下記のように、ELSEの場合は意味の無い処理を記述しています。 IF XXX BEGIN A=100 END ELSE IF BEGIN -- 何も処理しない A = A END A=Aは意味の無い処理なのですが、削除するとコンパイルが通らなくなってしまうのでやむなく記述してます。 どなたかいいアイデアありましたらご教授くださいませ。 よろしくおねがいします。