2009-04-07 8 views
0

J'ai une relation entre deux tables. Les deux tables PK sont des types int.Connexion SQL dynamique au serveur SQL

Dans une table (UserS), je dois fournir le nom d'utilisateur et obtenir l'ID correspondant (qui est le PK). Ceci est la table utilisateur ASP.NET standard lors de l'utilisation de l'authentification par formulaire.

Toutefois, dans une table connexe, je souhaite fournir l'ID que je trouve dans la table Users pour obtenir une valeur.

Quelque chose comme:

Exécuter la requête pour obtenir ID pour un nom d'utilisateur (sélection simple/ou requête) Retour le résultat Exécuter un sous-requête où je peux passer le résultat ci-dessus - Get valeur où ID = résultat

Cela ressemble beaucoup à SQL dynamique. Cependant, il pourrait y avoir un moyen mieux adapté et plus approprié d'écrire cette requête (sur Sql Server 2k5).

Comment puis-je faire cela et qu'est-ce qui se cache?

EDIT: Je vais essayer quelque chose le long des lignes de http://www.sqlteam.com/article/introduction-to-dynamic-sql-part-1

EDIT: Merci pour les conseils tout le monde, je l'ai écrit ceci:

SELECT Discount.DiscountAmount DE Discount INNER JOIN aspnet_Users ON Discount. DiscountCode = aspnet_Users.UserId et aspnet_Users.Username = 's'

Où 's' doit être remplacé par un paramètre.

Merci

+0

pourquoi ne pas simplement joindre les deux tables? sont-ils liés? –

Répondre

1

droit, je viens de me faire:

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

Vous n'avez pas besoin d'utiliser SQL dynamique pour cela.

Vous pouvez utiliser une recherche à la place:

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

SELECT 
    * 
FROM 
    TableB 
WHERE 
    ID = @ID 

Ensuite, vous pouvez ajouter le paramètre @username à votre objet SqlCommand, ce qui empêche les risques d'injection SQL.

De même, effectuer la recherche est préférable à une jointure, car l'index est analysé une seule fois, pour la TableB.

+0

C'est exactement ce à quoi je pensais quand j'ai mentionné SQL dynamique. Je savais que je pouvais utiliser une sous-requête, mais c'est la syntaxe/implémentation. :) – dotnetdev

0

Ceci est juste une simple jointure n'est ce pas?

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

En ce qui concerne recherche vs joint - alors qu'il peut sembler plus intuitif pour les débutants d'utiliser la recherche, vous devriez aller avec une jointure. Une recherche doit être évaluée pour chaque ligne de votre ensemble de résultats principal, tandis qu'une jointure est évaluée une seule fois. Les jointures sont beaucoup plus efficaces, ce qui signifie qu'elles sont plus rapides.