Переменная SQL содержит только последний возвращенный результат - PullRequest
0 голосов
/ 17 марта 2019

Оператор ниже сохраняет и печатает последний возвращенный результат.Как можно сохранить оба значения?

Имя таблицы: UserGroupBranchMapping

UserId      username           IsActive CountryName    AccessType
----------- ------------------ -------- -------------  ------------
140         demo1@demo1.com    1        SOUTH AFRICA   2
140         demo1@demo1.com    1        BOTSWANA       1 

Оператор SQL:

DECLARE @AccessType VARCHAR(100);
DECLARE @username NVARCHAR(MAX);
DECLARE @countryName NVARCHAR(MAX);
DECLARE @countryId VARCHAR(100);

SET @username = 'demo1@demo1.com,demo2@demo1.com';
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

1 Ответ

1 голос
/ 17 марта 2019

Как уже сказал Ларну, скалярная переменная содержит 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'demo1@demo1.com', 1, N'SOUTH AFRICA', 2), (140, N'demo1@demo1.com', 1, N'BOTSWANA', 1)

Следующий оператор SELECT даст следующий результат:

SELECT * 
FROM @UserGroupBranchMapping

UserId  username        isActive    CountryName   AccessType
------------------------------------------------------------
140     demo1@demo1.com    1        SOUTH AFRICA      2
140     demo1@demo1.com    1        BOTSWANA          1

Будьте осторожны, чтобы табличная переменная имела поведение, аналогичное скалярной переменной, а это означает, что при достижении пакетной команды она теряет все значения.

...