2011-05-06 85 views
2

我有這樣一個文本文件ID列表:SQL服務器:插入INTS的列表到一個臨時表

24641985 , 
24641980 , 
24641979 , 
24641978 , 
24641976 , 
24641974 , 
... 
... 
24641972 , 
24641971 , 
24641970 , 
24641968 , 
24641965) 

有幾萬人。

現在我需要知道哪個id在這個列表中,不對應於我的表中的ID。

我想我應該把它們放入一個臨時表,然後說是這樣的:

select theId 
    from #tempIdCollection 
where theId not in (select customerId from customers) 

問題是我不知道如何讓他們到臨時表!

任何人都可以幫忙嗎?這不一定要高效。我只需要運行一次。歡迎任何解決方案建議

在此先感謝!

-Ev

回答

3

我會使用表變量。你聲明它就像一個常規變量。

declare @tempThings table (items int) 
insert @tempThings values (1) 
+0

感謝這個實例。這是我一起去的,因爲我很匆忙。 – 2011-05-06 00:29:04

3

有一個「永久臨時」表,也被稱爲「收件箱」表。只是一個簡單的表格,名爲「temp_bunchOfKeys」。

你的基本順序是:

1)截斷temp_bunchOfKeys

2)BCP文本文件導入temp_bunchOfKeys

3)您的SQL則是:

select theId 
    from Temp_BunchOfKeys 
where theId not in (select customerId from customers) 
+1

BCP是這裏的關鍵。 – 2011-05-06 00:11:56

+0

謝謝你。我將不得不更多地關注我從未聽說過的BCP。是否有可能將BCP轉換爲#tempTable? – 2011-05-06 00:30:53

+1

老實說,我不知道你是否可以將BCP轉換爲臨時表,但我強烈懷疑不是,因爲BCP命令是從命令行運行並建立連接,並且無法建立臨時表。關於BCP文件的說明,它們看起來很可怕,但你忽略了所有這些。只需制定一個提供登錄ID,數據庫名稱,表名稱和文件的BCP命令就可以了。通過語法進行的一些嘗試通常會讓你繼續。 – 2011-05-06 01:24:53

-1

您可以複製將所有這些id從文本文件粘貼到excel文件中。然後使用Sql server中的excel功能導入,從該excel文件中創建一個表。真的很簡單。讓我知道你是否需要更具體的指示。

1

我有同樣的問題,但與字符串,而不是整數,並通過使用返回一個表變量與列表內容的拆分函數(見下面的代碼)解決它。修改功能以適合您的目的。

如何調用該函數

create table #t (Id int, Value varchar(64)) 
insert into #t (Id, Value) 
select Id, Item 
from dbo.fnSplit('24641978, 24641976, ... 24641972, 24641971', ',') 
/*Do your own stuff*/ 
drop table #t 

功能

if object_id(N'dbo.fnSplit', N'TF') is not null 
    drop function dbo.fnSplit 
GO 

create function dbo.fnSplit(@string varchar(max), @delimiter char(1)) 
returns @temptable table (Id int, Item varchar(8000)) 
as 
begin 
    -- NB! len() does a rtrim() (ex. len('2 ') = 1) 
    if (len(@string) < 1 or @string is null) return 

    declare @idx int 
    declare @slice varchar(8000) 
    declare @stringLength int 
    declare @counter int ; set @counter = 1 

    set @idx = charindex(@delimiter, @string) 

    while @idx!= 0 
    begin 
     set @slice = ltrim(rtrim(left(@string, @idx - 1))) 
     set @slice = replace(replace(@slice, char(10), ''), char(13), '') 
     insert into @temptable(Id, Item) values(@counter, @slice) 

     -- To handle trailing blanks use datalength() 
     set @stringLength = datalength(@string) 
     set @string = right(@string, (@stringLength - @idx)) 
     set @idx = charindex(@delimiter, @string) 
     set @counter = @counter + 1 
    end 

    -- What's left after the last delimiter 
    set @slice = ltrim(rtrim(@string)) 
    set @slice = replace(replace(@slice, char(10), ''), char(13), '') 
    insert into @temptable(Id, Item) values(@counter, @slice) 

return 
end 
GO 
相關問題