この場合、を使用する必要はありませんsp_executesql
。1 つのステートメントで一度にすべてのレコードの結果を取得できます。
select Result = case
when ct.Abbreviation='=' and t.ValueOne=t.ValueTwo then 1
when ct.Abbreviation='>' and t.ValueOne>t.ValueTwo then 1
when ct.Abbreviation='>=' and t.ValueOne>=t.ValueTwo then 1
when ct.Abbreviation='<=' and t.ValueOne<=t.ValueTwo then 1
when ct.Abbreviation='<>' and t.ValueOne<>t.ValueTwo then 1
when ct.Abbreviation='<' and t.ValueOne<t.ValueTwo then 1
else 0 end
from YourTable t
join ConditionType ct on ct.ID = t.ConditionTypeID
次のようなもので追加の列を更新します。
;with cte as (
select t.AdditionalColumn, Result = case
when ct.Abbreviation='=' and t.ValueOne=t.ValueTwo then 1
when ct.Abbreviation='>' and t.ValueOne>t.ValueTwo then 1
when ct.Abbreviation='>=' and t.ValueOne>=t.ValueTwo then 1
when ct.Abbreviation='<=' and t.ValueOne<=t.ValueTwo then 1
when ct.Abbreviation='<>' and t.ValueOne<>t.ValueTwo then 1
when ct.Abbreviation='<' and t.ValueOne<t.ValueTwo then 1
else 0 end
from YourTable t
join ConditionType ct on ct.ID = t.ConditionTypeID
)
update cte
set AdditionalColumn = Result
上記のロジックが 1 つのテーブルだけでなく、多くの場所に適用されることになっている場合は、機能について考えることができます。私はかなりインラインのテーブル値関数 ( scalarではありません) を使用しますが、ユーザー定義のスカラー関数 (呼び出して返すため) を使用するとオーバーヘッドが発生し、処理する行が増えるほど時間が浪費されます)。
create function ftComparison
(
@v1 float,
@v2 float,
@cType int
)
returns table
as return
select
Result = case
when ct.Abbreviation='=' and @v1=@v2 then 1
when ct.Abbreviation='>' and @v1>@v2 then 1
when ct.Abbreviation='>=' and @v1>=@v2 then 1
when ct.Abbreviation='<=' and @v1<=@v2 then 1
when ct.Abbreviation='<>' and @v1<>@v2 then 1
when ct.Abbreviation='<' and @v1<@v2 then 1
else 0
end
from ConditionType ct
where ct.ID = @cType
これは次のように適用できます。
select f.Result
from YourTable t
cross apply ftComparison(ValueOne, ValueTwo, t.ConditionTypeID) f
また
select f.Result
from YourAnotherTable t
cross apply ftComparison(SomeValueColumn, SomeOtherValueColumn, @someConditionType) f