В Visual Studio 2019 не обязательно авторизовываться microsoft аккаунтом

На днях на работе случилась печалька и моя Visual Studio 2015 стала плохо работать. Просто ни с того, ни с сего перестала сохранять сессию, открытые файлы. В момент закрытия студии видно, что она сама закрывает все вкладки. Просто нечего переоткрывать уже. То есть ты закрываешь студию для каких-то целей и при следующем открытии все твои 5-10 вкладок, ранее открытых, приходится открывать заново. Благо хоть раскрытые папочки в дереве файлов solution сохраняются и видно откуда что надо открыть, но всё равно очень утомляет. Помучилась я, работая с такой студией, часа 3 (было нужно всего пару файлов) и решила-таки установить новую версию, 2019-ю. Коллеги говорили, что обязательно надо авторизовываться или гуглопочтой, или скайп аккаунтом, но я как-то не стремлюсь вводить эти данные, чтобы пользоваться программой. Основательно почистила винты на работе и удалила около 30 гигов всякой фигни, потому что студия требовала около 10 гигов, а у меня было свободно только 2 🙂
Так вот я была приятно удивлена, что можно нажать кнопочку «Нет, спасибо, позже» и не вводить никакие логин и пароль и просто как обычно пользоваться неакторизованной студией. Потому что попросту мне все эти фичи онлайн кода и т д не нужны для работы. Посмотрим, что будет через 30 дней. Потребует ли авторизацию студия тогда.

Кстати, не люблю английский софт с русским переводом в меню . Он порой так переведён, что фиг поймёшь, что имели ввиду. А поскольку я не заметила при установке, что можно сразу поставить пакет с английским языком, то пришлось повторно запускать установщик, доустанавливать языковой пакет и переключаться на него в настройках.
Вот такая чёрная темка у меня сейчас. До этого была классическая сине-белая светлая.

pivot/unpivot: приведение типов полей к одному типу и одной длине

Продолжаю тренироваться в запросах на T-SQL в MS SQL 2008R2. Вспоминаю как работать с pivot/unpivot.
Полезная статья с примерами http://www.sql-tutorial.ru/ru/book_operator_unpivot.html
А вот описание проблемы с необходимостью приведения типов данных не только к одному типу, но и к одной длине. То есть не получится привести число 23 к строке ’23’, надо чтобы это было именно cast(’23’ as nvarchar(50)) или если в case стоит

case when m.Code = 'ABO' then
		case dtr.TestValue 
			when 'O' then '1'
			when 'A' then '2'
			when 'B' then '3'
			when 'AB' then '4'
		end
	else null end dtrABO,

где dtr.TestValue типа nvarchar(50). Надо сделать вот так:

case when m.Code = 'ABO' then
		case dtr.TestValue 
			when 'O' then cast('1' as nvarchar(50))
			when 'A' then cast('2' as nvarchar(50))
			when 'B' then cast('3' as nvarchar(50))
			when 'AB' then cast('4' as nvarchar(50))
		end
	else null end dtrABO,

иначе продолжает ругаться на несоответствие типов данных «Тип столбца «dtrRH» конфликтует с типами других столбцов, указанных в списке UNPIVOT.» Вместо CAST можно использовать CONVERT.

Пример полного запроса:

select * from (
select DonationId, DonorId, DonationDate, prop, val from (
SELECT don.DonationId DonationId, don.DonorId, cast(dons.DonationDate as date) DonationDate,
	case when m.Code = 'ABO' then
		case dtr.TestValue 
			when 'O' then cast('1' as nvarchar(50))
			when 'A' then cast('2' as nvarchar(50))
			when 'B' then cast('3' as nvarchar(50))
			when 'AB' then cast('4' as nvarchar(50))
		end
	else null end dtrABO,
	case when m.Code = 'RH' then 
		case when dtr.TestValue = 'POS' or dtr.TestValue = '+' then cast('1' as nvarchar(50)) else
		case when dtr.TestValue = 'NEG' or dtr.TestValue = '-' then cast('-1' as nvarchar(50)) else dtr.TestValue end end
	else null end dtrRH,
	case when m.Code = 'KELL' then 
		case when dtr.TestValue = 'POS' or dtr.TestValue = '+' then cast('1' as nvarchar(50)) else
		case when dtr.TestValue = 'NEG' or dtr.TestValue = '-' then cast('-1' as nvarchar(50)) else dtr.TestValue end end
	else null end dtrKELL,
	case when m.Code = 'ANT' then dtr.TestValue else null end dtrANT,
	case when m.Code = 'CELL' then 
		case when dtr.TestValue = 'POS' or dtr.TestValue = '+' then cast('1' as nvarchar(50)) else
		case when dtr.TestValue = 'NEG' or dtr.TestValue = '-' then cast('-1' as nvarchar(50)) else dtr.TestValue end end
	else null end dtrCELL,
	case when m.Code = 'GrA' then dtr.TestValue	else null end dtrGrA,
	case when m.Code = 'GrB' then dtr.TestValue	else null end dtrGrB
 from 
(select MAX(d.UniqueId) DonationId, d.DonorId DonorId
  FROM dbo.Donations d
  join dbo.DonationTestResults dtr on dtr.DonationId  = d.UniqueId
  where d.IsDeleted = 0 and d.OrgId = @currentOrgId
	and d.DonationDate >= CAST(CAST(@fromDonationDateYear AS varchar) + '-' + CAST(1 AS varchar) + '-' + CAST(1 AS varchar) AS DATETIME)
  group by d.DonorId ) don
  join dbo.Donations dons on dons.UniqueId=don.DonationId
  join DonationTestResults dtr on dtr.DonationId = don.DonationId
  join ref.MedicalTestTypes m on m.Id = dtr.TestTypeId
  where m.BloodTestCategory = 7
  ) x
  unpivot (
    val for prop in (dtrABO,dtrRH, dtrKELL, dtrANT, dtrCELL, dtrGrA, dtrGrB)
) unpvt
) xx
pivot (
    max(val) for prop in (dtrABO, dtrRH, dtrKELL, dtrANT, dtrCELL, dtrGrA, dtrGrB)
) pvt;

Вложенные case when, ошибка на втором уровне вложенности

Случилось мне написать выборку со вложенными case when и наткнулась на ошибку.

SELECT don.DonationId,donorId,
case when m.Code = 'ABO' then
case dtr.TestValue
when 'O' then '1'
when 'A' then '2'
when 'B' then '3'
when 'AB' then '4'
end
else null end dtrABO,
case when m.Code = 'RH' then
case when dtr.TestValue = 'POS' or dtr.TestValue = '+' then 1 end
-- вот тут и ниже во второй строке для Kell, CEll когда пытаемся
-- обработать отрицательные значения возникает ошибка!
case when dtr.TestValue = 'NEG' or dtr.TestValue = '-' then -1 end 
else null end dtrRH,
case when m.Code = 'KELL' then
case when dtr.TestValue = 'POS' or dtr.TestValue = '+' then 1 end
case when dtr.TestValue = 'NEG' or dtr.TestValue = '-' then -1 end
else null end dtrKELL,
case when m.Code = 'ANT' then dtr.TestValue else null end dtrANT,
case when m.Code = 'CELL' then
case when dtr.TestValue = 'POS' or dtr.TestValue = '+' then 1 end
case when dtr.TestValue = 'NEG' or dtr.TestValue = '-' then -1 end
else null end dtrCELL,
case when m.Code = 'GrA' then dtr.TestValue else null end dtrGrA,
case when m.Code = 'GrB' then dtr.TestValue else null end dtrGrB
from ...

Текст ошибки:

Msg 156, Level 15, State 1, Line 27
Неправильный синтаксис около ключевого слова "case".
Msg 102, Level 15, State 1, Line 28
Неправильный синтаксис около конструкции "dtrRH".
Msg 102, Level 15, State 1, Line 32
Неправильный синтаксис около конструкции "dtrKELL".
Msg 102, Level 15, State 1, Line 33
Неправильный синтаксис около конструкции "dtrANT".
Msg 102, Level 15, State 1, Line 37
Неправильный синтаксис около конструкции "dtrCELL".
Msg 102, Level 15, State 1, Line 38
Неправильный синтаксис около конструкции "dtrGrA".
Msg 102, Level 15, State 1, Line 39
Неправильный синтаксис около конструкции "dtrGrB".

В поисках решения наткнулась на вот эту страницу и конкректно строки кода, натолкнувшие на правильное решение

case when first_condition
then first_condition_result_true
else
case when second_condition
then second_condition_result_true
else
second_condition_result_false
end
end
end as qty

Работающий код

SELECT don.DonationId,donorId,
case when m.Code = 'ABO' then
case dtr.TestValue
when 'O' then '1'
when 'A' then '2'
when 'B' then '3'
when 'AB' then '4'
end
else null end dtrABO,
case when m.Code = 'RH' then
case when dtr.TestValue = 'POS' or dtr.TestValue = '+' then 1 else
case when dtr.TestValue = 'NEG' or dtr.TestValue = '-' then -1 end end
else null end dtrRH,
case when m.Code = 'KELL' then
case when dtr.TestValue = 'POS' or dtr.TestValue = '+' then 1 else
case when dtr.TestValue = 'NEG' or dtr.TestValue = '-' then -1 end end
else null end dtrKELL,
case when m.Code = 'ANT' then dtr.TestValue else null end dtrANT,
case when m.Code = 'CELL' then
case when dtr.TestValue = 'POS' or dtr.TestValue = '+' then 1 else
case when dtr.TestValue = 'NEG' or dtr.TestValue = '-' then -1 end end
else null end dtrCELL,
case when m.Code = 'GrA' then dtr.TestValue else null end dtrGrA,
case when m.Code = 'GrB' then dtr.TestValue else null end dtrGrB
from ...

Unable to launch the IIS Express Web server vs Visual Studio 2015 (solved)

Перешли с Visual Studio 2010 на 2015 версию больше месяца назад. Спустя месяц у меня использования студия захотела получить серийный ключ и упорно закрывалась, отказываясь работать. Я и не заметила при установке, что триал версия установилась на месяц всего. Быстро в интернете нашла ключ, ввела и продолжила работать.

Еще спустя несколько недель вдруг утром вылезла такая ошибка при попытке запустить мой проект «Unable to launch the IIS Express Web server». Вторая же ссылка в гугле даёт хорошую инструкцию как решить проблему. До последнего думала, может хоть один пункт можно выкинуть 🙂 В принципе пункт 3 по-моему лишний. Я меняла цифорку порта для проекта из п 4 и без админских прав при запуске студии и проекта в нём и всё отработало нормально. Просто оказалось достаточно поменять одну последнюю цифорку порта с 8 на 9 у меня и всё сработало и проект снова работает как и прежде.

Решила приложить мои скриншоты для Windows 10, вдруг кто не найдет, куда тыкать для выполнения п 5.

Кстати, чтобы сделать последний скриншот программой Lightshot мне пришлось исхитриться и рядом запустить маленькое окошко накой-нибудь программы (у меня это был total commander) и фокус перенести на неё и только тогда корректно отрабатывал PrtSc и сделала скрин, выделив только нужный участок экрана. Вообще часто на работе использую эту программу Lightshot и мне она очень нравится, её возможность выбрать часть экрана.