我已經搜索了一段時間,但只是不知道是否有一個「銀彈」解決方案,我正在尋找做什麼。我在我的數據庫中有一張表(爲了討論的緣故,實際的列是不相關的)。我希望能夠從同一個表格中查看2行,並獲得2列之間不同的列表。我知道我可以編寫一大堆TSQL來使這發生在特定表格中,但我希望SQL Server中有內置的函數(我正在運行2008 R2)可以做到這一點。比較MS SQL中的2行並得到不同的列
我知道像CHECKSUM這樣的簡單函數會告訴我,如果2行不同,但我需要具體哪些列是不同的。
最好我想使它成爲一個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
你絕對不會是能夠做到這一點的UDF。它需要動態SQL來處理傳入的表名。 –
Good Point Martin,我現在正在對一個解決方案進行原型設計,以確定它是否可行,它將涉及表變量和光標,我可以告訴你;) –
我認爲你可以用CLR UDF來做到這一點。 –