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

时间:2017-04-20 10:53:10

标签: sql-server tsql merge primary-key

我遇到了一个问题,我需要弄清楚我的表中是否已存在主键值。

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

为了防止因锁定数据导致的数据损失,我构建了一种方法,可以将所有表格和数据从表格a复制到我的SQL Server中的表格b。

为了获得更好的性能,我只从ERP中传输x个月的数据而不是所有数据。此外,我需要跟踪的新数据可能会发生变化。

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

4 个答案:

答案 0 :(得分:0)

如果您有权访问SSIS,您可以快速创建一个ssis包来实现缓慢变化的维度。

答案 1 :(得分:0)

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

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

- 制作动态查询

主要思想是检查id是否已经不存在或存在它取决于脚本

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 =@ID  ) ' + 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从旧数据库运行此脚本并在新数据库中运行IT

我希望这能帮到你,因为你不给我一个EXP

答案 2 :(得分:0)

答案 3 :(得分:0)

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

我从Information Schema获得了所需的所有密钥。然后我将2 TableNameFilter放在一起,并使用子选择+ XML路径设置TableName,其中包含逗号分隔的过滤器列表。

我把它放在一个临时表中,将它与动态SQL结合起来就可以了。

感谢您的帮助:)