T-SQL检查主键是否存在于重复表中

问题描述:

我遇到了一个问题,我需要弄清楚表中是否存在主键值。T-SQL检查主键是否存在于重复表中

我将ERP系统中的数据传输到我的SQL Server数据库中,这些数据在很多表中都被拆分,所有这些数据都有不同的集群PK。

为了防止通过锁定数据导致的数据通过,我构建了一种方式,在我的SQL Server中公布所有表并将数据从表a复制到表b。

为了获得更好的性能,我只将数据从ERP转移回来,而不是全部数据。另外,我可能需要跟踪新数据的变化。

我的问题是,有没有办法,我可以动态地复制数据,这是新的,并更新数据发生了变化?

+0

您的意思是重复(** **不是** **)。另外“如果主键存在”仅仅是使用'WHERE NOT EXISTS(...)'的问题,您可以考虑很多现有问题。 ***但是:***你继续说你想更新更改的数据。这是一个完全独立的问题。请[编辑]你的问题来澄清。 –

如果您有机会获得SSIS您可以快速创建一个SSIS包来实现渐变维度..

+0

我使用ssis获取数据,但包已经构建得如此详细,以至于如果我在查找表中创建内容,或者我必须改变比我更多的内容才能简化预算。可悲的。 – user2157063

+0

参考下面的链接https://docs.microsoft.com/en-us/sql/integration-services/data-flow/transformations/slowly-changing-dimension-transformation – Anand

我的问题是,有没有办法,我可以dynamicaly只复制数据,这是新的,更新已更改的数据?

首先我的技术做到这一点:

- 制作一个动态查询

主要思想是,以检查是否ID已经不存在或者虽然存在这取决于on script

True:存在(插入)

错误:不存在(更新)

现在:动态查询像这样

select 
'Begin' + Char(13) + Char(10) -- Now i do this becouse i well declare a variblae So every time generate make a seperator to avoid error 

'Declare @ID Int '+ Char(13) + Char(10) 
'select @ID =' + A.ID -- now make Select Fields or supQuery To GEt the ID From Old Data Base 

'if Not EXISTS (SELECT 1 FROM MyTable WHERE ID [email protected] ) ' + Char(13) + Char(10) -- @ID Come From OLD Data Base And i Check it in the new Data base 
'Insert into MyTable (Fields) '+ Char(13) + Char(10) 
'Values ('+ Char(13) + Char(10) 
      +' '+ '@ID'+ Char(13) + Char(10) 
      +','+ Cast(Isnull(''''+A.Nvarchar(50)+'''' ,'New') As NVarChar(100)) + Char(13) + Char(10)--EXP With Nvarchar 
      +','+   IsNull(Cast(A.INT || Decimal .ETC As NVarChar(10))   ,'0')  + Char(13) + Char(10)--EXP With INT 
        +') ; '+ Char(13) + Char(10) 

'End' + Char(13) + Char(10) 
'Else '   + Char(13) + Char(10) 
'Update MyTable Set '  + Char(13) + Char(10) 
+' '+'ID = @ID'    + Char(13) + Char(10) 
+','+ 'Nvarchar = '++','+ Cast(Isnull(''''+A.Nvarchar(50)+'''' ,'New') As NVarChar(100)) + Char(13) + Char(10)--EXP With Nvarchar 
+','+ 'INT  = ' +','+   IsNull(Cast(A.INT || Decimal .ETC As NVarChar(10))   ,'0')+ Char(13) + Char(10)--EXP With INT 

+ ' Where ID ='+''''+A.ID+'''; ' + Char(13) + Char(10) -- Dont Forget This : that make the Select Genertate ROw By Row 
+ 'GO ' + Char(13) + Char(10) 

+' End ; ' + Char(13) + Char(10) 
FROM MyTable As A 

注:U运行此脚本从旧的数据库并运行它在新的DB

我希望这帮助ü因为你不给我一个EXP

+0

是的,我有一些或多或少simulate,但你呢可能知道是否存在一个表,该表包含每个表的聚集列的所有约束? – user2157063

+0

好吧,我得到了来自 INFORMATION_SCHEMA.TABLE_CONSTRAINTS选项卡, INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE上校吧'选择tab.TABLE_SCHEMA,tab.TABLE_NAME,Col.Column_Name WHERE Col.Constraint_Name = Tab.Constraint_Name AND Col.Table_Name = Tab.Table_Name 和Constraint_Type =“PRIMARY KEY” ORDER BY TABLE_NAME' – user2157063

+0

为u像我这样类似 - 不要忘了FK可能是它有一个新的密钥也 ,这样你们可以做如下 或者如果u有在拖数据库同一台机器 我想你可以使用合并它更容易编码 – kareem

我的解决我的问题使用动态SQL + XML路径。

我刚从Information Schema获得了所需的所有密钥。然后我把它放在2列TableNameFilter中,用subselect + XML路径,我设法让TableName带有用逗号分隔的连接列表。

这个我把它放到一个临时表中,并将它与动态SQL结合起来,它可以工作。

感谢您的帮助:)