【问题标题】:T-SQL check if primary key exists in duplicated tableT-SQL 检查重复表中是否存在主键
【发布时间】:2017-04-20 10:53:10
【问题描述】:

我遇到了一个问题,我需要确定表中是否已经存在主键值。

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

为了防止由锁定数据引起的数据丢失,我构建了一种方法,在我的 SQL Server 中复制所有表并将数据从表 a 复制到表 b。

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

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

【问题讨论】:

  • 您的意思是重复(p 不是 b)。此外,“如果主键存在”只是使用WHERE NOT EXISTS (...) 的问题,您可以考虑许多现有问题。 但是:您继续说您想要更新更改的数据。这是一个完全独立的问题。请edit澄清您的问题。

标签: sql-server tsql merge primary-key


【解决方案1】:

如果您可以访问 SSIS,您可以快速创建一个 ssis 包来实现渐变维度..

【讨论】:

【解决方案2】:

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

是的

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

- 进行动态查询

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

真:存在(插入)

假:不存在(更新)

现在:像这样的动态查询

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 从旧数据库运行此脚本并在新数据库中运行它

我希望这对你有帮助,因为你不给我经验

【讨论】:

  • 是的,我有一些或多或少类似的东西,但你可能知道是否有一个表,它包含每个表的聚集列的所有约束?
  • 好的,我知道了SELECT tab.TABLE_SCHEMA, tab.TABLE_NAME, Col.Column_Name from INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab, INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col WHERE Col.Constraint_Name = Tab.Constraint_Name AND Col.Table_Name = Tab.Table_Name AND Constraint_Type = 'PRIMARY KEY' ORDER BY TABLE_NAME
  • 和我一样 - 不要忘记 FK 可能它也有一个新的密钥所以你可以按照下面的方式进行操作,或者如果你在同一台机器上有拖曳数据库,我认为你可以使用合并它编码更容易
【解决方案3】:
【解决方案4】:

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

我刚刚从 Information Schema 中获得了我需要的所有密钥。然后我将TableNameFilter 放在2 列中,使用子选择+ XML 路径,我设法让TableName 带有一个逗号分隔的过滤器列表供我加入。

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

感谢您的帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    相关资源
    最近更新 更多