2017-04-20 112 views
0

我遇到了一個問題,我需要弄清楚表中是否存在主鍵值。T-SQL檢查主鍵是否存在於重複表中

我將ERP系統中的數據傳輸到我的SQL Server數據庫中,這些數據在很多表中都被拆分,所有這些數據都有不同的集羣PK。

爲了防止通過鎖定數據導致的數據通過,我構建了一種方式,在我的SQL Server中公佈所有表並將數據從表a複製到表b。

爲了獲得更好的性能,我只將數據從ERP轉移回來,而不是全部數據。另外,我可能需要跟蹤新數據的變化。

我的問題是,有沒有辦法,我可以動態地複製數據,這是新的,並更新數據發生了變化?

+0

您的意思是重複(** **不是** **)。另外「如果主鍵存在」僅僅是使用'WHERE NOT EXISTS(...)'的問題,您可以考慮很多現有問題。 ***但是:***你繼續說你想更新更改的數據。這是一個完全獨立的問題。請[編輯]你的問題來澄清。 –

回答

0

如果您有機會獲得SSIS您可以快速創建一個SSIS包來實現漸變維度..

+0

我使用ssis獲取數據,但包已經構建得如此詳細,以至於如果我在查找表中創建內容,或者我必須改變比我更多的內容才能簡化預算。可悲的。 – user2157063

+0

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

0

我的問題是,有沒有辦法,我可以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

0

我的解決我的問題使用動態SQL + XML路徑。

我剛從Information Schema獲得了所需的所有密鑰。然後我把它放在2列TableNameFilter中,用subselect + XML路徑,我設法讓TableName帶有用逗號分隔的連接列表。

這個我把它放到一個臨時表中,並將它與動態SQL結合起來,它可以工作。

感謝您的幫助:)