2009-04-07 11 views
0

Ich habe eine Beziehung zwischen zwei Tabellen. Die zwei Tabellen-PKs sind int-Typen.Dynamische SQL Join in SQL-Server

In einer Tabelle (Users) muss ich den Benutzernamen angeben und die entsprechende ID (die PK) erhalten. Dies ist die Standard-ASP.NET-Benutzertabelle, wenn die Formularauthentifizierung verwendet wird.

In einer verwandten Tabelle möchte ich jedoch die ID, die ich aus der Tabelle Benutzer finde, liefern, um einen Wert zu erhalten.

Etwas wie:

Run Query-ID für einen Benutzername (einfache select/wo Abfrage) zu erhalten das Ergebnis zurück eine Unterabfrage zu starten, wo ich in dem obigen Ergebnis passieren kann - Get Wert wo ID = Ergebnis

Das klingt viel wie dynamische sql. Es könnte jedoch eine geeignetere und geeignetere Methode zum Schreiben dieser Abfrage geben (auf Sql Server 2k5).

Wie kann ich das tun und was lauern?

EDIT: Ich werde versuchen, etwas entlang der Linien von http://www.sqlteam.com/article/introduction-to-dynamic-sql-part-1

EDIT: Danke für die Tipps, jeder, schrieb ich folgendes:

SELECT Discount.DiscountAmount VON Discount INNER JOIN aspnet_Users ON Discount. DiscountCode = aspnet_Users.UserId Und aspnet_Users.Username = 's'

Wo 's' durch einen Parameter ersetzt werden soll.

Danke

+0

Warum verbinden Sie nicht einfach die beiden Tabellen? sind sie verwandt? –

Antwort

1

Richtig, ich würde nur dies tun:

SELECT * 
FROM TableB 
JOIN Users ON Users.Id = TableB.ID 
WHERE Users.Username = @Username 
2

Sie müssen nicht dynamisches SQL dafür verwenden.

können Sie eine Lookup verwenden stattdessen:

DECLARE @ID bigint 
SELECT @ID = ID FROM Users WHERE Username = @Username 

SELECT 
    * 
FROM 
    TableB 
WHERE 
    ID = @ID 

Dann Sie den Parameter @UserName zu Ihrem SqlCommand-Objekt hinzufügen können, um die Risiken von SQL-Injection zu verhindern.

Auch die Suche ist zu einem Join vorzuziehen, da der Index für TableB ein einziges Mal gescannt wird.

+0

Das ist genau das, woran ich dachte, als ich Dynamic Sql erwähnte. Ich wusste, dass ich eine Unterabfrage verwenden könnte, aber das ist die Syntax/Implementierung. :) – dotnetdev

0

Dies ist nur eine einfache Verbindung, nicht wahr?

SELECT x.* 
FROM user_table u 
     INNER JOIN 
       other_table x 
       ON u.id = x.user_id 
WHERE u.name = @user_name 
0
SELECT values.value 
FROM form_users, values 
WHERE form_users.username = 'John Doe' 
     AND values.user = form_users.userid 
0
SELECT 
    * 
FROM 
    table2 t2 
    JOIN 
    UserS t1 ON t2.IDKey = t1.IDKey 
WHERE 
    UserS.Username = @Input 
1

In Bezug auf Lookup vs schließt sich - während sie intuitiver zu sein scheint für die Anfänger die Suche verwendet werden, sollten Sie gehen mit einem Beitritt. Eine Suche muss für jede Zeile in Ihrer primären Ergebnismenge ausgewertet werden, während eine Verknüpfung einmal ausgewertet wird. Joins sind viel effizienter, was bedeutet, dass sie schneller sind.