機能チェック用のストアド プロシージャ テスト ケースを作成しようとしています。更新操作で行われた挿入および/または削除操作があることを確認する必要があります。更新のためにBINARY_CHECKSUM(*)を試しましたが、結果セットを介した更新操作でテーブルが挿入または削除されたかどうかをどのように知ることができますか。
MS SQL Server 2005 を使用しています
ありがとうございます。
機能チェック用のストアド プロシージャ テスト ケースを作成しようとしています。更新操作で行われた挿入および/または削除操作があることを確認する必要があります。更新のためにBINARY_CHECKSUM(*)を試しましたが、結果セットを介した更新操作でテーブルが挿入または削除されたかどうかをどのように知ることができますか。
MS SQL Server 2005 を使用しています
ありがとうございます。
見積もり:
私が従うのは、tempにデータを挿入することです。テーブルと実際のテーブルのいずれかで操作を実行し、... プロシージャの機能をチェックします。
最終的な問題が、2 つのテーブル内で実際のデータと期待されるデータを比較することであると説明できる場合は、次のアプローチを試すことができます -except
句を使用した比較:
create table [tb_source] (id int primary key identity(1,1), value varchar(50));
create table [tb_dest] (id int primary key, value varchar(50));
insert into [tb_source] (value) values ('a');
insert into [tb_source] (value) values ('b');
insert into [tb_source] (value) values ('c');
-- tables are equal
insert into [tb_dest] select * from [tb_source];
-- one row inserted
insert [tb_dest] (id, value) values (4, 'd');
-- one row deleted
delete from [tb_dest] where id = 1;
-- one row updated
update [tb_dest] set value = 'b_' where id = 2;
-- answering the question "how many number of rows with update operation through result"
with [raw] as (
(select *, 'deleted' [operation] from [tb_source]
except
select *, 'deleted' from [tb_dest])
union all
(select *, 'inserted' from [tb_dest]
except
select *, 'inserted' from [tb_source])),
[updates] as (
select id
from [raw]
group by id
having count(*) > 1),
[results] as (
select * from [raw] where id not in (select id from [updates])
union all
select id, value, 'updated' from [raw] where id in (select id from [updates]))
select [operation], count(distinct id)
from [results]
group by [operation]
order by count(*) desc
結果:
operation count
---------------------------------
updated 1
deleted 1
inserted 1
すぐに次の場合:
オプションとして、トリガーを使用して操作のタイプを調べることができます。
ALTER TRIGGER [dbo].[MyTrigger]
ON [dbo].[MyTable]
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
SET NOCOUNT ON;
declare
@i int = (select count(*) from (select top (1) * from inserted) as i),
@d int = (select count(*) from (select top (1) * from deleted) as d),
@type varchar(20);
if @i = 1 and @d = 1 set @type = 'update'
else if @i = 1 and @d = 0 set @type = 'insert'
else if @i = 0 and @d = 1 set @type = 'delete'
else set @type = 'empty';
if @type = 'insert'
begin
-- YOUR CODE HERE
end
if @type = 'delete'
begin
-- YOUR CODE HERE
end
if @type = 'update'
begin
-- YOUR CODE HERE
end
if @type = 'empty'
begin
-- YOUR CODE HERE
end
END