Ниже оператор сохраняет и печатает последний возвращенный результат. Как я могу сохранить оба значения?
Название стола: UserGroupBranchMapping
UserId username IsActive CountryName AccessType
----------- ------------------ -------- ------------- ------------
140 [email protected] 1 SOUTH AFRICA 2
140 [email protected] 1 BOTSWANA 1
Оператор SQL:
DECLARE @AccessType VARCHAR(100);
DECLARE @username NVARCHAR(MAX);
DECLARE @countryName NVARCHAR(MAX);
DECLARE @countryId VARCHAR(100);
SET @username = '[email protected],[email protected]';
SET @countryName = 'SOUTH AFRICA,BOTSWANA';
SELECT @AccessType = ugbm.AccessType, @countryId = ugbm.Countryid
FROM UserGroupBranchMapping ugbm
INNER JOIN Users usr ON usr.id = ugbm.UserId
INNER JOIN Country con ON con.id = ugbm.countryid
WHERE usr.UserName IN (SELECT item
FROM dbo.SplitString(@username, ','))
AND con.countryName IN (SELECT item
FROM dbo.SplitString(@countryName, ','))
AND ugbm.IsActive = 1;
PRINT @AccessType, @countryId
Есть ли причина, по которой вы хотите НАПЕЧАТАТЬ значения, а не просто SELECT их без использования каких-либо переменных?
@ДжорджМеноутис; да, причина делать IF AccessType = 1, тогда я выполняю оператор select для сведений о филиале группы, и если AccessType равен 2, то я выполняю другой оператор select, чтобы получить данные о компании.





Как уже сказал Ларну, скалярная переменная может содержать 1 (одно) значение за раз. Когда выполнение запроса достигает конца пакетной команды (скорее всего, вы используете команду по умолчанию, которая равна GO), переменная автоматически уничтожается, что означает, что она теряет значение, хранившееся до этого момента.
Если вы хотите одновременно хранить больше значений в нескольких столбцах, вам следует использовать табличную переменную.
Вы можете использовать что-то вроде этого:
DECLARE @UserGroupBranchMapping TABLE(
UserId int,
username nvarchar(200),
isActive bit,
CountryName nvarchar(200),
AccessType int
)
INSERT INTO @UserGroupBranchMapping (UserId, username, isActive, CountryName, AccessType)
VALUES(140, N'[email protected]', 1, N'SOUTH AFRICA', 2), (140, N'[email protected]', 1, N'BOTSWANA', 1)
Следующий оператор SELECT даст следующий результат:
SELECT *
FROM @UserGroupBranchMapping
UserId username isActive CountryName AccessType
------------------------------------------------------------
140 [email protected] 1 SOUTH AFRICA 2
140 [email protected] 1 BOTSWANA 1
Будьте осторожны, чтобы табличная переменная имела такое же поведение, как и скалярная переменная, а это означает, что когда она достигает пакетной команды, она теряет все значения.
Спасибо за ваше предложение. Но как я могу выполнить сценарий. Если тип доступа равен 1, выполните оператор выбора, чтобы получить сведения о филиале группы, в противном случае выполните оператор выбора сведений о компании.
@Dipak - это другая тема. Пожалуйста, задайте новый вопрос для этого. Если мое предложение помогло, пожалуйста, примите его. Спасибо!
Используйте временную таблицу или табличную переменную. переменная скаляр может содержать только значение скаляр (1).