2 Stimmen

Dynamisches T-SQL erstellen

Ich habe eine Frage zu SQL mit MS SQL Server

Ich habe eine Tabelle wie folgt

customer
id  country_id post_code_id
1      AU          1
2      GB          1

Ich habe Postleitzahlentabellen, die wie folgt getrennt sind

post_codes_AU
post_codes_GB
etc..

Gibt es eine Möglichkeit, ich kann country_id in der Abfrage verwenden, um die richtige Tabelle zu verbinden. z.B.,

select * from customer c
inner join post_codes_ '+c.country_id+' as pc on pc.id=c.post_code_id

1voto

Filip De Vos Punkte 11218

Sie können die Abfrage nicht auf diese Weise verknüpfen.

Um eine richtige Abfrage zu machen, können Sie eine der folgenden Möglichkeiten nutzen:

  • Erstellen Sie eine partitionierte Ansicht über die Tabellen post_codes_... und verbinden Sie diese Ansicht
  • Generieren Sie die Abfragen für jede country_id in der Kundentabelle und fügen Sie sie mit UNION ALL Erklärungen.

0voto

Abe Miessler Punkte 78979

Sie müssen folgende Angaben machen [] um den Tabellennamen herum, wenn er wirklich ein Leerzeichen im Namen hat, wie Ihre Beispielabfrage nahelegt. Dies sieht wie ein Tippfehler aus, so dass Sie das vielleicht nicht tun müssen. Sobald Sie das getan haben, sollte es als dynamisches SQL funktionieren.

Bevor Sie diesen Weg einschlagen, sollten Sie sich jedoch über die möglichen Nachteile der Verwendung von dynamischem SQL informieren. Es lohnt sich, dies zu lesen:

http://www.sommarskog.se/dynamic_sql.html

0voto

JPF Punkte 431

Erstellen Sie eine Ansicht und verbinden Sie diese;

-- #1 create a view . . . .
create view MyPostCodes

as

select
    country_id='AU',
    post_code_id
from
    post_codes_AU
union
select
    country_id='GB',
    post_code_id
from
    post_codes_GB
go
-- #2 now join like this
select * from customer c
inner join MyPostCodes as pc on pc.id=c.post_code_id and pc.country_id=c.country_id

0voto

JayaPrakash Punkte 179

Scheint, dass Ihre Abfrage funktionieren wird, ein wenig geändert.

Select * from customer c 
Inner Join post_codes
On concat('post_codes_',c.country_id)=Post_codes.post_code_id

Oder versuchen Sie es mit dem folgenden Code,

 Select * from customer c
 Inner Join post_codes 
 On right(1-charindex('_',reverse(post_codes_id)),post_codes_id) =c.country_id

Entfernen Sie vor dem Vergleich den genauen Code, mit dem verglichen werden soll.

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