动态比较链接服务器上的SQL表
问题描述:
我必须比较表(SIB $)以获得两个不同链接服务器(LATESTDUMP,OLDDUMP)上相同的不匹配记录。我已经尝试创建一个动态查询。有人可以帮我一下: 1)是否有一种方法,我不必将列名传递给代码,代码动态获取列名并将其用作列名单进行比较。
因此,所有我需要做的就是传递给存储过程两个表名动态比较链接服务器上的SQL表
代码,我的工作:
DECLARE @sql nvarchar(max) = ' ((SELECT * FROM LATESTDUMP...SIB$) t1 FULL
OUTER JOIN (SELECT * FROM OLDDUMP...SIB$) t2
ON t1.id = t2.id
WHERE
t1.id IS NULL OR
t2.id IS NULL)'
SELECT @sql += ' or t1.' + quotename(column_name) + ' <> t2.' +
quotename(column_name) from information_schema.columns where table_name =
'SIB$'
答
看起来你可能想看看,因为这一直是可用的MERGE语句SQL 2008. https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql
+0
全外连接工作非常适合我,当我有静止或固定列标签,但我的桌子上有大约200-220列,他们在列名中不断变化。这就是为什么我想要去动态sql的原因 – Nadeem
答
这里有一些代码让你开始。它提取一个主键(假设一列主键,这可能是或者可能不是你的有效假设),并且抓取剩余列的逗号分隔字符串列表。
从这里您可以使用拆分字符串构建一个sql字符串,该字符串从主键上的硬编码链接服务器连接两个相同名称的表,并将每个列进行比较以获得差异,然后执行动态SQL。我已经包括了一些测试脚手架,所以你可以通过它的工作:
DECLARE @tableName sysname;
SET @tableName = 'some table'
-- Validate parameter
IF @tableName IS NULL OR NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @tableName AND TABLE_TYPE = 'BASE TABLE')
BEGIN
RAISERROR ('Invalid table name specified', 16, 1);
RETURN;
END;
-- Validate table has a primary key
IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @tableName)
BEGIN
RAISERROR ('Specified table does not have a primary key', 16, 1);
RETURN;
END;
-- Get info about the Primary Key columns
DECLARE @pkcolName sysname;
SELECT @pkcolName = c.COLUMN_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.COLUMNS c ON kcu.TABLE_NAME = c.TABLE_NAME AND kcu.COLUMN_NAME = c.COLUMN_NAME
WHERE tc.CONSTRAINT_TYPE = 'PRIMARY KEY' AND tc.TABLE_NAME = @tableName AND kcu.ORDINAL_POSITION = 1
-- Grab the names of all the remaining columns
DECLARE @nonKeyColumns nvarchar(MAX);
SELECT @nonKeyColumns = STUFF ((SELECT N'], [' + c.name
FROM sys.columns c
WHERE object_id = (select top 1 object_id FROM sys.objects where name = @tableName)
AND c.name <> @pkcolName
ORDER BY c.column_id
FOR XML PATH('')), 1, 2, '') + ']';
SELECT @pkcolName
SELECT @nonKeyColumns
请不要使用不适用于您的问题 –