Member 13296978 Ответов: 1

Как вставить данные в таблицу без применения цикла?


Я хочу вставить данные в свою таблицу, но проблема заключается в идентификаторе пользователя coloumn, который возвращает несколько значений. так что же я могу сделать в таком случае?

Что я уже пробовал:

Insert into UserAccess(ClientId,UserId,ParentId,Name,ToolTip,NavigateUrl,UserRole,IsParent,Menu_Order,Status,MenuId) SELECT @ClientId ,(select USR_ID 
from UserDetail WHERE Client_Id=@ClientId AND (',' + USR_Role + ',') LIKE '%,2,%' AND Status=1 AND Emp_Id!=0), ParentId,Name,ToolTip,NavigateUrl,UserRole,IsParent,Menu_Order,Status,Id from UserMenu WHERE UserRole=2 AND Status=1


Проблема заключается в том, что usr_Id coloumn, потому что сначала мы выбираем только топ-1 пользователя, где userid =2, но теперь наши требования меняются, поэтому мы должны вставить данные для каждого пользователя с userid=2. Как я могу достичь этого?

Tomas Takac

Мне кажется, что вам нужно перекрестное соединение между UserDetail и UserMenu, но я не уверен. Возможно, обновите свой вопрос с помощью примера ввода и ожидаемого вывода, чтобы сделать его более ясным.

akshay_zz

Приятель, я думаю, тебе нужно обновить свой вопрос. Особенно последний абзац. Я могу помочь вам, если вы немного обновите вопрос. Нравится то, что вы хотите сказать, навсегда id_пользователя = 2 Нужно вставить ID пользователя. Это довольно запутанно.

1 Ответов

Рейтинг:
0

CHill60

Вы не предоставили дополнительную информацию, которая была запрошена 3 дня назад, но я попытаюсь продемонстрировать решение.

Я создал несколько демонстрационных таблиц с помощью этого скрипта

create table #user
(
	id int identity(1,1),
	dataitem varchar(10),
	[status] int
)
insert into #user (dataitem, [status]) values
('User1',1), ('User2',1), ('User3',1)

create table #usermenu
(
	id int,
	menudetail varchar(10),
	[user_id] int
)
insert into #usermenu (id, menudetail, [user_id]) values
(1, 'Menu 1', 1), (1, 'Menu 1', 2), (1, 'Menu 1', 3)
Итак, теперь у меня есть 3 пользователя, все в статусе 1 и все имеют доступ к меню 1. Если я попытаюсь ваш стиль запроса, как это
SELECT (select id from #user where status = 1), id, menudetail from #usermenu
Я получаю ошибку
Цитата:
Msg 512, Уровень 16, Состояние 1, Строка 25
Подзапрос вернул более 1 значения. Это недопустимо, когда подзапрос следует за=, !=, <, <= , >, >= или когда подзапрос используется в качестве выражения.

Вы должны быть в состоянии присоединиться к столам в некотором роде. В моем примере я бы использовал
select a.id, b.id, menudetail
from #usermenu B
INNER JOIN #user A on A.ID=B.[user_id]
Есть несколько аспектов вашего кода, которые меня беспокоят.
1. Фрагмент LIKE '%,2,%' подразумевает, что вы храните роли пользователей в строке, разделенной запятыми. Это очень плохой дизайн. Вместо этого вы должны хранить эти роли в другой таблице - таким образом, вам не придется возиться с разделением строки или искать ее, чтобы увидеть, какие роли доступны - это подробно обсуждается в другом месте.
create table #UserRoles
(
	[User_Id] int,
	roleNo int
)
Я, вероятно, не стал бы беспокоиться о том, чтобы иметь отдельную таблицу ролей, так как это было бы слишком далеко от нормализации.
2. у вас есть таблица под названием UserMenu, но она, похоже, содержит всю информацию меню. У меня был бы столик Menu он содержит все эти данные и отдельную таблицу, которая просто связывает User_Ids с меню, к которому у них есть доступ.