私はこれをしばらく検索しましたが、私がやろうとしていることに対する「特効薬」の解決策があるかどうかはわかりません。DB にテーブルがあります (この議論のために、実際の列は関係ありません)。同じテーブルから 2 つの行を見て、2 つの間で異なる列のリストを取得できるようにしたいと考えています。
特定のテーブルに対してこれを実現するために大量の TSQL を記述できることはわかっていますが、これを実行できる SQL Server (2008 R2 を実行しています) に組み込み関数があることを望んでいました。
2 つの行が異なるかどうかを教えてくれる CHECKSUM のような単純な関数があることは知っていますが、どの列が異なるかの詳細が必要です。
できれば、それをUDFにして、テーブル名と、比較したい2行の主キーを渡したいと思います。
何か考えや提案はありますか?
--編集--これが私が思いついた解決策です:
Well, It is certainly not the most elegant solution...but it will work in a pinch.
CREATE PROCEDURE sp_Compare_Table_Rows
(
@TablePK varchar(1000), -- The Name of the Primary Key in that Table
@TableName varchar(1000), -- The Name of the Table
@PK1 int, -- The ID of the 1st table
@PK2 int -- The ID of the 2nd table
)
AS
DECLARE @Holder table
(
Column_Name varchar(250),
Different bit
)
INSERT INTO @Holder(Column_Name,Different)
select
COLUMN_NAME,0
from
LPS_DEV.INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = @TableName
and ORDINAL_POSITION >1
DECLARE @LoopedColumnName varchar(250)
DECLARE @DynamicQuery nvarchar(max)
DECLARE @ORD1 int
DECLARE @ORD2 int
SET @DynamicQuery = ''
SET @LoopedColumnName = ''
SET @ORD1 = 0
SET @ORD2 = 0
DECLARE MYCUR CURSOR FOR SELECT Column_Name FROM @Holder
OPEN MYCUR
FETCH NEXT FROM MYCUR INTO @LoopedColumnName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @DynamicQuery = 'SELECT @Outer= CHECKSUM(' + @LoopedColumnName + ') FROM ' + @TableName + ' WHERE ' + @TablePK + ' = ' + CONVERT(varchar(100),@PK1)
exec sp_executesql @DynamicQuery, N'@Outer int output',@ORD1 out
SET @DynamicQuery = 'SELECT @Outer= CHECKSUM(' + @LoopedColumnName + ') FROM ' + @TableName + ' WHERE ' + @TablePK + ' = ' + CONVERT(varchar(100),@PK2)
exec sp_executesql @DynamicQuery, N'@Outer int output',@ORD2 out
IF @ORD1 <> @ORD2
BEGIN
UPDATE @Holder SET Different = 1 WHERE Column_Name = @LoopedColumnName
END
FETCH NEXT FROM MYCUR INTO @LoopedColumnName
END
CLOSE MYCUR
DEALLOCATE MYCUR
select * from @Holder