Динамическое соединение SQL в сервере SQL - PullRequest
0 голосов
/ 07 апреля 2009

У меня есть отношения между двумя таблицами. Две таблицы PK являются типами int.

В одной таблице (UserS) мне нужно указать имя пользователя и получить соответствующий идентификатор (это PK). Это стандартная таблица пользователей ASP.NET при использовании проверки подлинности с помощью форм.

Однако в связанной таблице я хочу указать идентификатор, найденный в таблице «Пользователи», чтобы получить значение.

Что-то вроде:

Запустить запрос, чтобы получить идентификатор для имени пользователя (простой выбор / где запрос) Вернуть результат Запустите подзапрос, где я могу передать приведенный выше результат - Получить значение, где ID = результат

Это очень похоже на динамический sql. Однако может быть более подходящий и подходящий способ написания этого запроса (на Sql Server 2k5).

Как я могу сделать это и что скрывается?

РЕДАКТИРОВАТЬ: я попробую что-то вроде http://www.sqlteam.com/article/introduction-to-dynamic-sql-part-1

РЕДАКТИРОВАТЬ: Спасибо за советы всем, я написал это:

ВЫБРАТЬ Discount.DiscountAmount ОТ СКИДКИ ВНУТРЕННЕЕ ПРИСОЕДИНЕНИЕ aspnet_Users ON Discount.DiscountCode = aspnet_Users.UserId и aspnet_Users.Username = 's'

Где 's' должен быть заменен параметром.

Спасибо

Ответы [ 6 ]

2 голосов
/ 07 апреля 2009

Для этого не нужно использовать динамический SQL.

Вместо этого вы можете использовать поиск:

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

SELECT
  *
FROM
  TableB
WHERE
  ID = @ID

Затем вы можете добавить PARAMETER @Username к вашему объекту SqlCommand, предотвращая риски внедрения SQL.

Кроме того, поиск предпочтительнее, чем объединение, так как индекс сканируется один раз, для таблицы B.

1 голос
/ 07 апреля 2009

Относительно поиска против объединений - хотя новичку может показаться более интуитивно понятным использование поиска, вы должны пойти с объединением. Поиск должен оцениваться для каждой строки в вашем основном наборе результатов, в то время как объединение оценивается один раз. Объединения намного эффективнее, а это значит, что они быстрее.

1 голос
/ 07 апреля 2009

Правильно, я бы просто сделал это:

SELECT *
FROM TableB
JOIN Users ON Users.Id = TableB.ID 
WHERE Users.Username = @Username
0 голосов
/ 07 апреля 2009
SELECT
   *
FROM
   table2 t2
   JOIN
   UserS t1 ON t2.IDKey = t1.IDKey
WHERE
   UserS.Username = @Input
0 голосов
/ 07 апреля 2009
SELECT  values.value
FROM    form_users, values
WHERE   form_users.username = 'John Doe'
        AND values.user = form_users.userid
0 голосов
/ 07 апреля 2009

Это просто простое объединение, не так ли?

SELECT  x.*
FROM    user_table u
        INNER JOIN
                other_table x
                ON u.id = x.user_id
WHERE   u.name = @user_name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...