最初のアプローチは素朴です(私はT-SQLに慣れていないので、PL / SQLをもっとやりました)、さらに先に進むのに役立つかもしれません.SQL SERVER 2008でテストされています.2005年に動作することを願っています...)
したがって、2 つのプロシージャを作成し、一方が他方を呼び出します。
提供されたコードは、2 つの異なる ID について、関連するすべてのフィールド (Account、AccountNum、AccountNumber) について、一度にのみチェックできます。
アイデア (AccountNumber 列のチェック)
指定された 3 つの名前のいずれかを持つ列を持つテーブル (データベース テーブルをリストするテーブル INFORMATION_SCHEMA.columns 内) を見つけます。
見つかったすべてのテーブルに対して: 動的クエリを作成します:
select count(*) from <THE_TABLE> where <Account_column_name> IN (123456 654321);
2 つの結果が得られた場合 (ID が両方ともテーブルに存在することを意味します)、次のパラメーターを使用して 2 番目のプロシージャを起動します: @TableName = <THE_TABLE>
、@FieldName = <Account_column_name>
、@FirstId = 123456
、@SecondId = 654321
<THE_TABLE>
(再び INFORMATION_SCHEMA.columns で)の列名を見つけます。見つかったすべての列について: 動的クエリを作成します
select count(*) from <THE_TABLE> as T1
inner join <THE_TABLE> as T2 on T1.<COLUMN_NAME> = T2.<COLUMN_NAME>
where T1.<Account_column_name>= 123456
and T2.<Account_column_name>= 654321
の場合count(*) = 1
、指定された ID に対して同じテーブルの同じ列に同じ値が存在することを意味します。
その場合、印刷<THE_TABLE>
して<THE_COLUMN>
検索を開始するには、SQL Management Studio で、make するだけです。
EXEC GetSimilarValuesForFieldAndValue 123456, 654321
「メッセージ」部分には、「結果」のリストが必要です。
CREATE procedure [dbo].[GetSimilarValuesForFieldAndValue](@FirstId int, @SecondId int)
AS
DECLARE @sql nvarchar(MAX);
DECLARE @params NVARCHAR(MAX);
DECLARE @Count int;
DECLARE @Name NVARCHAR(MAX);
DECLARE @FieldName NVARCHAR(MAX);
DECLARE db_cursor CURSOR for
select TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.columns
where COLUMN_NAME IN('Account', 'AccountNumber', 'AccountNum');
OPEN db_cursor
FETCH next from db_cursor into @Name, @FieldName
while @@FETCH_STATUS = 0
begin
select @sql =
N' SELECT @Count=Count(*) FROM ' + @Name +
N' WHERE ' +@FieldName+' IN (@FirstId,@SecondId)'
SELECT @params = N'@FieldName NVARCHAR(MAX), @FirstId int, @SecondId int, @Count int out'
EXEC sp_executesql @sql, @params, @FieldName, @FirstId, @SecondId, @Count OUT
if (@Count = 2)
begin
exec dbo.CompareFields @Name, @FieldName, @FirstId, @SecondId
end
FETCH NEXT FROM db_cursor INTO @Name, @FieldName
end
close db_cursor
DEALLOCATE db_cursor
GO
二つ目:
CREATE procedure [dbo].[CompareFields](@TableName NVARCHAR(MAX), @FieldName NVARCHAR(MAX), @FirstId int, @SecondId int)
as
DECLARE @ColumnName NVARCHAR(MAX)
DECLARE @Sql NVARCHAR(MAX)
DECLARE @Params NVARCHAR(MAX)
DECLARE @Count int
DECLARE cfCursor CURSOR FOR
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = ''+@TableName+' '
AND COLUMN_NAME <> ' '+@FieldName+''
OPEN cfCursor
FETCH next from cfCursor into @ColumnName
while @@FETCH_STATUS = 0
begin
select @Sql =
N' SELECT @Count = count(*) from ' +@TableName + ' T1 '+
N' INNER JOIN ' + @TableName + ' T2 ON T1.' +@ColumnName + ' = T2.' + @ColumnName +
N' WHERE T1.' +@FieldName + ' = '+ CAST(@FirstId as varchar) +
N' AND T2.' + @FieldName + ' = '+CAST(@SecondId as varchar)
SELECT @Params =
N'@TableName VARCHAR(MAX), @ColumnName VARCHAR(MAX), '+
N'@FieldName VARCHAR(MAX), @FirstId int, @SecondId int, @Count int out'
exec sp_executesql @sql, @Params, @TableName, @ColumnName, @FieldName, @FirstId, @SecondId, @Count OUT
if @Count = 1
begin
--print tableName and column Name if value is identic
print 'Table : ' + @TableName + ' : same value for ' + @ColumnName
end
FETCH NEXT FROM cfCursor INTO @ColumnName
end
close cfCursor
DEALLOCATE cfCursor
GO