重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

いつも大変助かっております。

下記のようなテーブル値関数を作成したのですが、条件(Where句)が加味されずにテーブルが返ります。
このような結果になってしまう原因をご存知の方、ご教示ください。

<テーブル>
CREATE TABLE Table1(
[性別] [int] NULL,
) ON [PRIMARY]
GO
CREATE TABLE Table2(
[physical_name] [nvarchar](100) NOT NULL,
[target_value] [nvarchar](10) NOT NULL,
) ON [PRIMARY]
GO

<テーブルの中身>
insert into Table1 values (1);
insert into Table1 values (5);
insert into Table1 values (99)

insert into Table2 values(男女の別,1);
insert into Table2 values(男女の別,2);
insert into Table2 values(男女の別,5);

<テーブル値関数>
CREATE FUNCTION Verify(
@Trandata nvarchar(100) ,
@Physicalname nvarchar(100)
)RETURNS TABLE
AS
RETURN
(
select * from Table1
where @Trandata >
(select MAX(target_value) from Table2 where physical_name = @Physicalname)
)

<呼び出しSQL>
select * from Verify('性別','男女の別')

<呼び出しSQL結果>
希望…Table1の 性別=99 のみ返る
現実…Table1の 性別=*が返る

A 回答 (1件)

where @Trandata > (select MAX(target_value) from Table2 where physical_name = @Physicalname)



これでは
@Trandataに入っている文字列と、((select MAX(〜 との比較
になり、
select * from Verify('性別','男女の別')
ならば
'性別' > 〜
と書いたのと同じになります。


対処法としては
・SQLを文字列として作成して、その文字列を実行する。
 「動的 SQL Server」とかで検索すると出てきます。
 なんでも有りになるので、セキュリティに注意。
・Case When 等で @Trandata の内容によって列を選ぶ
Case @Trandata When '性別' then 性別 when 〜 end > (select MAX(〜
SQLが長くなるし、テーブルが変わったら変更が必要
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す