1

この質問をご覧いただきありがとうございます。MSSQL Server Express を使用しています。年齢と収入に基づいてクライアントの適格性を更新するトリガーを作成しようとしています。年齢の部分を書きましたが、適格性の部分で完全に立ち往生しています。収入、周期(月/年)、世帯人数に基づいて適格でないクライアントを選択できるステートメントがあります

Select ClientID,c.HshldSize,c.MonthlyYearly,c.AnnualHshldIncome,i.SeniorMo,
       StatusID,i.HshldSize
from Clients c 
join IncomeEligibility i on c.HshldSize = i.HshldSize
where c.HshldSize= i.HshldSize and c.AnnualHshldIncome >= i.SeniorMo 
      and StatusID in (1,2) 
      and c.CategCode = 'SR' and MonthlyYearly ='month'

この選択は、適格でないすべてのクライアントを表示します 応答の例

   ClientID HshldSize   MonthlyYearly   AnnualHshldIncome  SeniorMo StatusID HshldSize
    28       1             month         1095                977    2         1
    51       1             month         1253                977    1         1
    63       1             month         1300                977    1         1
    73       1             month         1200                977    1         1
    96       1             month         1300                977    1         1
    101      1             month         1255                977    1         1
    160      2             month         1800                1513   1         2

収入資格はこんな感じ

HshldSize   AKGuidline  WomanChildYr    WomanChildMo    SeniorYr    SeniorMo    PFDYr   PFDMo
1   9020    16687   1391    11726   977 878 73
2   13970   25845   2154    18161   1513    1756    146
3   18920   35002   2917    24596   2050    2634    219
4   23870   44160   3680    31031   2586    3512    292
5   28820   53317   4443    37466   3122    4390    365
6   33770   62475   5206    43901   3658    5268    439
7   38720   71632   5969    50336   4195    6146    512
8   43670   80790   6733    56771   4731    7024    585
9   48620   89947   7496    63206   5267    7902    658
10  53570   99105   8259    69641   5803    8780    731
11  58520   108262  9022    76076   6340    9658    804
12  63470   117420  9785    82511   6876    10536   878
13  68420   126577  10548   88946   7412    11414   951
14  73370   135735  11311   95381   7948    12292   1024
15  78320   144892  12074   101816  8485    13170   1097
16  83270   154050  12838   108251  9021    14048   1170
17  88220   163207  13601   114686  9557    14926   1243
18  93170   172365  14364   121121  10093   15804   1317
19  98120   181522  15127   127556  10630   16682   1390
20  103070  190680  15890   133991  11166   17560   1463

適格でない場合、トリガーは clientrow で StatusID =5 を設定する必要があります。これまでのところ、私はこのトリガーを持っています

create trigger tr_EligebilityCheck
on dbo.Clients
FOR INSERT,UPDATE
as 
/*Check if Senior  not eligible by age*/
If (select CategCode from inserted )='SR'
declare 
@DOB date
SET @DOB = (select dob from inserted)
if DATEDIFF(YEAR,@DOB,GETDATE())<60

BEGIN
Update Clients
set StatusID = 5
From Clients c, inserted i
where c.CategCode = 'SR' and i.ClientID = C.ClientID
END

/*Check if Children eligebel by age*/
If (select CategCode from inserted )='CH'
declare 
@DOBCH date
SET @DOBCH = (select dob from inserted)
if DATEDIFF(YEAR,@DOBCH,GETDATE()) >=6

BEGIN
Update Clients
set StatusID = 5
From Clients c, inserted i
where c.CategCode ='CH' and i.ClientID = C.ClientID
END

しかし、収入によるチェックを追加する方法がわかりません。これを行う方法がわかっている場合は助けてください。また、新しいレコードを挿入するときに、トリガーが機能しないというエラーが発生するようです

Msg 512, Level 16, State 1, Procedure tr_EligebilityCheck, Line 6
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

ありがとうございました!

4

1 に答える 1

1

それが資格のない人を特定する唯一の方法である場合は、selectステートメントを準備します。したがって、その基準に該当するものを更新する必要があります。サブクエリでそれを行います(私はSQLFiddleをしませんでした)。トリガー内の必要な位置に更新を配置できます。

UPDATE Clients 
SET 
theColName = 'value' 
WHERE 
ClientID IN (Select ClientID
             from Clients c 
             join IncomeEligibility i 
                  on c.HshldSize = i.HshldSize
             where c.HshldSize= i.HshldSize 
                   and c.AnnualHshldIncome >= i.SeniorMo 
                   and StatusID in (1,2) 
                   and c.CategCode = 'SR' 
                   and MonthlyYearly ='month')

エラーはこの行に関するものでIf (select CategCode from inserted )='SR' 、select CategCodeクエリは複数の値を返すため、等号は間違った演算子です。'SR'を変数に入れますが、このアプローチを試してください。

if @var IN (select CategCode from inserted)

このステートメントは、結果セット内の値を検索しますが、複数の値と等しいかどうかは確認しません。クエリ結果を見て、複数のCategCodeが返されるかどうかを確認します。これが、エラーの原因です。

于 2013-03-05T02:05:59.437 に答える