Sql 在比较两个表的差异时,如何检测自动填充的列?

Sql 在比较两个表的差异时,如何检测自动填充的列?,sql,sql-server,database,tsql,Sql,Sql Server,Database,Tsql,我需要创建一个用于比较两个表的存储过程。输入参数是表名(包含架构)。知道要比较的表的名称后,我转到INFORMATION_SCHEMA.COLUMNS获取每个表的列列表 问题是,在数据库中,有些表的列是自动填充的,例如“created_by”和“created_date”。在比较表时,如果其余数据相同,我不应该注意这些列中的差异 有没有找到此类专栏的通用方法?我找到了这个答案,它可能会帮助您: 这样,您就删除了不想比较的列,这样您就可以在SP中自动填充用于比较的“诱人”列了列您的意思是使用默认约

我需要创建一个用于比较两个表的存储过程。输入参数是表名(包含架构)。知道要比较的表的名称后,我转到INFORMATION_SCHEMA.COLUMNS获取每个表的列列表

问题是,在数据库中,有些表的列是自动填充的,例如“created_by”和“created_date”。在比较表时,如果其余数据相同,我不应该注意这些列中的差异


有没有找到此类专栏的通用方法?

我找到了这个答案,它可能会帮助您:


这样,您就删除了不想比较的列,这样您就可以在SP中自动填充用于比较的“诱人”列了

您的意思是使用默认约束吗?检查
其中的列\u DEFAULT为NULL
如果我是你,我会使用,那么你可能只想包括
为\u computed=0且为\u identity=0且默认为\u object\u id=0的列
,再加上@GarethD的注释中的一列。另外,请注意:“**重要**不要使用信息模式视图来确定对象的模式。查找对象模式的唯一可靠方法是查询sys.objects目录视图。”(这一点非常重要,将其加粗并用**字符括起来。)不,没有通用方法。首先,假设始终使用默认约束。在插入过程中,通过为关联的列提供一个值,可以很容易(并且经常)重写它。当一行被更新时(一般来说),默认约束是不相关的。您可能希望忽略具有特定名称的列(这也假设您的db设计器使用了一致的名称),例如“created_date”。谢谢大家的宝贵意见!现在我知道sys.columns比SCHEMA.columns更适合用于比较信息。另外,很明显,最好过滤掉is_computed和is_identity列,在某些情况下可能会有所帮助。无意冒犯,但这似乎并不是我问题的答案。这更像是第二步,也就是说,当我知道我不需要的列列表时,它将非常有用。在我的例子中,我动态地接收列列表,因此我不知道可能不需要比较的列的确切位置或名称。
/* Get the data into a temp table */
SELECT * INTO #TempTable
FROM YourTable
/* Drop the columns that are not needed */
ALTER TABLE #TempTable
DROP COLUMN ColumnToDrop
/* Get results and drop temp table */
SELECT * FROM #TempTable
DROP TABLE #TempTable