我有一个非常大的表(200+列),有1000行。我需要在列中显示2行之间的差异。我可以将所需的2行加载到临时表中,但我不确定如何从那里继续。
例如(我在这里只使用5行,并且只使用通用名称)
ID | GName | SName | Add1 | Add2
360111 | Billy | Bob | 1 Happy St | Sydney
360111 | Billy | Bob | 6 Sunny St | Melbourne我想要展示的是
Add1 | Add2
1 Happy St | Sydney
6 Sunny St | Melbourne因为这是两行之间唯一的区别。其他时候不会有区别,或者很多时候。
干杯
发布于 2012-01-24 20:06:00
您将需要创建一些动态sql,它将循环遍历临时表的元数据,并检查是否需要返回给定列。最后,动态地创建一个SELECT语句,该语句将返回键(您可以针对这种情况对其进行硬编码,或者如果您将此逻辑放入更通用的存储过程中,也可以将其作为参数)。
快速和脏,它看起来像这样:
-- setting up test-data
IF OBJECT_ID('tempdb..#test') IS NOT NULL DROP TABLE #test
SELECT ID = 360111,
GName = 'Billy',
SName = 'Bob',
Add1 = '1 Happy St',
Add2 = 'Sydney'
INTO #test
UNION ALL
SELECT ID = 360111,
GName = 'Billy',
SName = 'Bob',
Add1 = '6 Sunny St',
Add2 = 'Melbourne'
GO
-- find different columns and list them
DECLARE @c_column_name sysname
DECLARE @sql nvarchar(max)
IF OBJECT_ID('tempdb..#diff_columns') IS NOT NULL DROP TABLE #diff_columns
SELECT column_name = name
INTO #diff_columns
FROM sys.columns
WHERE 1 = 2
DECLARE column_loop CURSOR LOCAL FAST_FORWARD
FOR SELECT diff_columns = name
FROM tempdb.sys.columns
WHERE object_id = object_id('tempdb..#test')
AND name <> 'ID' -- no need to test the key-field
OPEN column_loop
FETCH NEXT FROM column_loop INTO @c_column_name
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @sql = 'INSERT #diff_columns (column_name)
SELECT ''' + @c_column_name + '''
WHERE EXISTS ( SELECT * FROM #test HAVING COUNT (DISTINCT ' + @c_column_name + ') > 1)'
EXEC (@sql)
FETCH NEXT FROM column_loop INTO @c_column_name
END
CLOSE column_loop
DEALLOCATE column_loop
SELECT @sql = 'SELECT ID'
SELECT @sql = @sql + ', ' + column_name
FROM #diff_columns
SELECT @sql = @sql + ' FROM #test'
EXEC (@sql) https://stackoverflow.com/questions/8934898
复制相似问题