5 Stimmen

SQL Server: Einfügen einer Liste von Ganzzahlen in eine temporäre Tabelle

Ich habe eine Liste von IDs in einer Textdatei wie folgt:

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

Es gibt Zehntausende von ihnen.

Jetzt muss ich wissen, welche IDs in dieser Liste stehen, die nicht mit einer ID in meiner Tabelle übereinstimmen.

Ich denke, ich sollte sie in eine temporäre Tabelle einfügen und dann so etwas sagen:

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

Das Problem ist, ich weiß nicht, wie ich sie in die temporäre Tabelle bekomme!

Kann mir jemand helfen? Dies muss nicht effizient sein. Ich muss es nur einmal ausführen. Alle Lösungsvorschläge sind willkommen!

Vielen Dank im Voraus!

-Ev

4voto

Kirk Broadhurst Punkte 26286

Ich würde eine Tabellenvariable verwenden. Sie wird genauso deklariert wie eine normale Variable.

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

3voto

Ken Downs Punkte 4609

Haben Sie eine "permanent temp" Tabelle, auch bekannt als "Inbox" Tabelle. Einfach eine einfache Tabelle mit dem Namen "temp_bunchOfKeys".

Ihre Grundsequenz lautet:

1) Temp_bunchOfKeys abschneiden

2) BCP die Textdatei in temp_bunchOfKeys

3) Ihr SQL lautet dann:

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

1voto

Snooookie Punkte 11

Ich hatte das gleiche Problem, aber mit Zeichenketten anstelle von ganzen Zahlen, und löste es, indem ich eine Split-Funktion verwendete (siehe unten stehender Code), die eine Tabellenvariable mit dem Listeninhalt zurückgibt. Passen Sie die Funktion an Ihre Zwecke an.

Beispiel, wie die Funktion aufgerufen wird

create table #t (Id int, Value varchar(64))
insert into #t (Id, Value)
select Id, Item
from dbo.fnSplit('24641978, 24641976, ... 24641972, 24641971', ',')
/*Machen Sie Ihre eigenen Sachen*/
drop table #t

Funktion

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
    -- Achtung! len() führt ein rtrim() durch (z.B. 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)

        -- Um Leerzeichen am Ende zu behandeln, verwenden Sie datalength()
        set @stringLength = datalength(@string)
        set @string = right( @string, (@stringLength - @idx) )
        set @idx = charindex( @delimiter, @string )
        set @counter = @counter + 1
    end

    -- Was nach dem letzten Trennzeichen übrig bleibt
    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

-1voto

Shaunak Punkte 17121

Sie können alle diese IDs aus der Textdatei in eine Excel-Datei kopieren und einfügen. Verwenden Sie dann die Importfunktion aus Excel im Sql-Server, um eine Tabelle aus dieser Excel-Datei zu erstellen. Ganz einfach eigentlich. Lassen Sie mich wissen, wenn Sie spezifischere Anweisungen benötigen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X