2013-10-26 52 views
-2

我有2個表已經創建了相同的模式。我想插入table1 - > table2的行,Age(column)的約束不是重複的。查詢執行但沒有插入。SQL查詢 - INSERT INTO與SELECT WHERE什麼都不做

CREATE TABLE #Global (dbName varchar(100) NULL) 
INSERT INTO #Global VALUES ('db1') 

DECLARE @temp nvarchar(1000) 
SELECT @temp = dbName from #Global 

DECLARE @sql nvarchar(max) 
SELECT @sql = 'INSERT INTO [dbo].[Person] ([age], [name]) 
       SELECT [age], [name] 
       FROM [' + @temp + ']..[Person] 
       WHERE [Person].[age] <> [' + @temp + ']..[Person].[age]' 
exec sp_executesql @sql 

任何幫助將不勝感激!

+0

您是否測試了'SELECT'語句以查看數據是否被返回? –

+0

拉杜 - 是的選擇聲明作品 – nubme

+0

我不明白'SELECT'聲明可能如何工作 - 你比較Person.age與其他表達式,作爲一個人,我可以看到是試圖挑選的東西來自另一個數據庫的表,但SQL Server無法解釋這一點。此外,一些答案給了你你可能想要的東西(每個年齡段有一行用任意選擇的名字和ID),但這不是你真正要求的(你的意思是你想排除任何人與任何人同齡否則?) –

回答

1

寫爲:

CREATE TABLE #Global (dbName varchar(100) NULL) 
INSERT INTO #Global VALUES ('db1') 

DECLARE @temp nvarchar(1000) 
SELECT @temp = dbName from #Global 

DECLARE @sql nvarchar(max) 
SELECT @sql = 'INSERT INTO [dbo].[Person] ([age], [name]) 
       SELECT [age], [name] 
       FROM [' + @temp + '].[Person] 
       WHERE [' + @temp + '].[Person].[age] NOT IN (SELECT [age] from [dbo].[Person])' 

exec sp_executesql @sql 

爲什麼你的where子句不工作? 架構作用域解析始終始於用戶的默認架構,並且如果引用的對象不具有作用域限定,則還原爲dbo架構 。

在where子句中,您沒有爲第一個表指定模式名稱。所以它被認爲是DB1的源表本身。試試用[dbo] schema替換它,整個語句會給你語法錯誤。希望這可以幫助!!!

+0

Deepshikha - 感謝您的正確解決方案和解釋。 – nubme

2

您的where子句將排除所有行。

你應該嘗試這樣的事:

DECLARE @sql nvarchar(max) 
SELECT @sql = 'INSERT INTO [dbo].[Person] ([id], [age], [name]) 
       SELECT min([id]) as id, [age], min([name]) as name 
       FROM [' + @temp + ']..[Person] 
       group by age' 
exec sp_executesql @sql 
+0

muhmud - 我似乎無法讓你的代碼工作。它將整個table1插入table2 – nubme

+0

確定嗎?如果你從Person選擇了一個'select count(distinct Age),它是否返回與Person中的select count(*)相同的數字? – muhmud

+0

不同的數字 – nubme

0

嘗試以此爲select語句:

INSERT INTO [dbo].[Person] ([age], [name]) 
SELECT [age], [name] 
FROM [' + @temp + ']..[Person] 
WHERE [' + @temp + ']..[Person].[age] 
not in (select distinct age from [dbo].[Person]) 
+0

感謝您的幫助。訣竅 – nubme