Ответы пользователя по тегу SQL Server
  • Создание удаленной базы данных?

    @d-stream
    Готовые решения - не подаю, но...
    Никаких отличий от локальной, разве что:
    1. разрешить sql серверу сетевые подключения (например tcp/ip)
    2. озаботится безопасностью подключений (ну как минимум чтобы извне вообще не было доступа для sa ролей)
    3. несколько позже - подумать о промежуточном звене....
    Ответ написан
    5 комментариев
  • Что лучше триггер или процедура? И почему не запихнуть бы всю логику в процедуры?

    @d-stream
    Готовые решения - не подаю, но...
    Это ровно как с отвертками, молотками, гвоздодерами, напильниками - все они предназначены для разных действий. Иногда конечно получается забивать напильником саморез по металлу в гипсокартон, но он фиговато держится. Что совершенно не значит что гипсокартон - плохой материал или саморезу по металлу - плохи... тем паче нельзя пенять на напильник...

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

    p/s/ и да, триггеры бывают не только DML, но и DDL разных уровней + всяких специфичных видов типа event_driven, logon и т.п.
    Ответ написан
    Комментировать
  • Как запихнуть этот код в хранимую процедуру?

    @d-stream
    Готовые решения - не подаю, но...
    Проверить наличие таблицы:

    select OBJECT_ID('tempdb..#t_nrv','U')

    есть таблица - будет значение ее id, иначе - null

    только если таблица нужна исключительно внутри процедуры - лучше использовать не #table а @table

    иначе будут танцы...

    declare @qqqq table (id primary key, value nvarchar(max))
    Ответ написан
    Комментировать
  • Как передать в хранимую процедуру передать несколько строк данных?

    @d-stream
    Готовые решения - не подаю, но...
    По-моему "штатно" это в виде xml или json (первый вроде с 2008, второй - позже)
    Ответ написан
    Комментировать
  • Распространие приложения ипользующего базу данных?

    @d-stream
    Готовые решения - не подаю, но...
    Распространять можно как угодно. Если хочется чтобы программа распространялась - видимо как минимум стоит описать порядок, условия установки и т.п. Ну или частично или полностью поместить эту логику в инсталлятор.

    Применительно к MS SQL - видимо одним из вариантов - предлагать ставить express
    Ответ написан
    Комментировать
  • Как правильно написать sql?

    @d-stream
    Готовые решения - не подаю, но...
    select top 1 keys from (
    SELECT RelPage_Y AS RP
    FROM Keys
    WHERE (((Keys.mp_group)=388))
    UNION ALL SELECT RelPage_G AS RP
    FROM Keys
    WHERE (((Keys.mp_group)=388))
    )
    group by RP
    order by count(RP) desc


    то бишь результаты первого запроса
    группируем по ключу
    сортируем по убыванию count()
    берем только первую строку
    дальше к этому можно уже прицепить развернутое (join по key )
    Ответ написан
    1 комментарий
  • Как сделать дополнительные поля в пользовательской таблице?

    @d-stream
    Готовые решения - не подаю, но...
    Ни пользователь, ни прикладной софт не должны "мочь" менять структуру таблиц. Нигде. Разве что в стрелковом клубе стрельбы себе в ноги и то по праздникам -)

    А вот некие таблицы допатрибутов - да, без проблем

    Как вариант:
    нечто типа таблицы значений "допов" в виде id_user, attr_type, row, value *
    ну и в довесок attr_type, descr,value_type - типа справочник названий атрибутов

    ---------
    * - value - это будет скорее несколько колонок разных типов
    Ответ написан
    Комментировать
  • Как можно посчитать сколько раз была считана каждая строка из таблицы?

    @d-stream
    Готовые решения - не подаю, но...
    Собственно простой вариант решения:

    create spReadAddress @addr 
    as 
    select * from adrTable where address = @addr  
    if @@rowcount>0 update adrTable set requestCount=requestCount+1 where address = @addr


    и соответственно по месту вместо селекта - дергать процедуру

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

    ну а для вариантов поиска например по like - "в лоб" вываливать результаты поиска во временную таблицу и потом из нее делать апдейт счетчиков (или инсерт в лог) и потом уже выводить

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

    @d-stream
    Готовые решения - не подаю, но...
    Латиница-кириллица не может пакостить?
    А то в приведенном примере как минимум 3 буквы имеют начертание 1:1 (К,В,С)
    Ответ написан
  • OpenRowSet BULK TSQL Как оформить загрузку файлов в базу?

    @d-stream
    Готовые решения - не подаю, но...
    Ну во-первых set поле = (select * ...) и не будет работать, ибо "select *" - это вернуть множество колонок...
    поэтому как минимум set поле = (select конкретное_поле from ...)

    во-вторых цикл в данной конструкции не нужен

    можно использовать

    update t2
    set t2.field=t1.field
    from t1 
    join t2 on t2.id=t1.id
    where ...


    https://msdn.microsoft.com/en-us/library/ms177523.aspx
    Ответ написан
    Комментировать
  • Как переписать на MSSql?

    @d-stream
    Готовые решения - не подаю, но...
    case when SUM(Plan) < SUM(Fact) then 0 else SUM(Fact)/SUM(Plan)*100 end


    только я бы наоборот писал

    case when SUM(Plan) >= SUM(Fact) then SUM(Fact)/SUM(Plan)*100 else 0 end
    Ответ написан
    Комментировать
  • SQL запрос на вывод диапазона возраста имея только дату рождения?

    @d-stream
    Готовые решения - не подаю, но...
    Ну можно "в лоб" - вычислять возраст как datediff(year, BirthDate, getdate())
    или даже case сразу кластеризовать это по возрастным группам.

    То есть нечто типа:
    SELECT 
    LoginID,
    age_group = datediff(year, BirthDate, getdate())  -- или же кэйсом разбивать на интервалы
    FROM HumanResources.Employee 
    where age_group between 25 and 30


    В зависимости от потребности в примерном возрасте или "полных лет" - чутка модифицировать datediff
    Ответ написан
    Комментировать
  • Как исправить кракозябры в сообщениях об ошибке в pyodbc/pymssql?

    @d-stream
    Готовые решения - не подаю, но...
    Стоит попробовать переключить кодировку (chcp unicode или chcp 65001)
    Ответ написан
  • Как крупные справочники хранят свои данные?

    @d-stream
    Готовые решения - не подаю, но...
    Дума первый камень преткновения, который подпортит жизнь - слова длиннее 30 символов... редкость, но бывают
    Второй однокоренные слова, склонения-спряжения и прочие моментики.

    Ну и на старте - "слова" из двух слов. Типа stand up, catch up, come across, sit down, be left
    Притом половина таких глаголов "по частям" - может иметь самостаятельный смысл типа stand, up - встать, вверх, а часть - увы. К примеру be left
    Ответ написан
    Комментировать
  • Как при помощи триггеров удалить записи в связанных таблицах в ms sql server?

    @d-stream
    Готовые решения - не подаю, но...
    Про то, как без триггеров - выше уже сказали, а если-таки что-то потребуется в триггере, то следует иметь в виду, что сущности inserted, deleted - это таблицы с возможно более чем одной записью.

    Соответственно по ним надо проходится либо курсором (классика со своими подводными камнями), циклом (тоже есть свои нюансы), либо join-ом (не всегда возможно).

    По сути канва:

    ALTER TRIGGER [dbo].[t_del_test]
    ON [dbo].[s_test] INSTEAD OF DELETE
    AS
    DECLARE @id int; -- сюда будем гадить для каждой строки
    
    declare cur_for_delete cursor for select id_test from deleted; -- объявляем курсор 
    open cur_for_delete; -- открываем
    fetch cur_for_delete into  @id;   -- получаем первую строку
    while @@fetch_status=0 begin -- пока есть что получать
                DELETE FROM test_task WHERE id_test = @id;
                DELETE FROM s_test WHERE id_test=@id;
                fetch cur_for_delete into  @id; -- тянем следующую строку из курсора
    end
    close cur_for_delete; -- не забываем закрыть
    deallocate cur_for_delete


    по второму триггеру - аналогично
    Ответ написан
    Комментировать
  • Какие характеристики по железу лучше выбрать для сервера ms sql 2014?

    @d-stream
    Готовые решения - не подаю, но...
    Сожалею, но озвученный бюджет совсем не тянет на сервер. Только на "типа сервер". Даже более-менее приличный ноутбук для разработки получается дороже...
    Руководству стоит задать вопрос о том какие интервалы простоя для него приемлемы. И сколько стоит час/день простоя. Потом объяснить разницу между "сервером" и сервером.
    Я бы акцентировал внимание во-первых на конструктивную возможность резервирования узлов. Два блока питания, RAID, иногда даже банки памяти + возможность "замены на лету". Во-вторых на брендовый сервис. Если исключить казусы, то минимальный уровень поддержки выглядит как сообщение о наступающей проблеме и подвоз в течение дня-двух замене. А вот в обобщенном самосборе - "сами привозите на экспертизу, через две недели или гарантийный ремонт до 45 дней или отказ в гарантии"

    Ну и в общем для SQL - побольше ядер/процессоров и побольше памяти + само собой быструю дисковую подсистему. Бэкапы - хранить как минимум не на сервере, а на отдельном устройстве (возможно территориально удаленном).
    Ответ написан
    3 комментария
  • Как изменить только надпись в MS SQL?

    @d-stream
    Готовые решения - не подаю, но...
    https://msdn.microsoft.com/ru-ru/library/ms187928.aspx
    конкретно convert

    Ну и кровавые слезы в случае когда вдруг в колонке встретятся разные варианты написания дат...

    p/s/ я бы максимально быстро постарался отрефакторить таблицу приведя дату к дате
    Ответ написан
    Комментировать
  • Как правильно создать триггер в MS SQL?

    @d-stream
    Готовые решения - не подаю, но...
    if updated(имя_поля)

    ну и стоит иметь в виду, что в общем случае в inserted может оказаться более одной записи, поэтому общая канва должна быть наподобии вот такой:
    declare cur_trigger cursor for select ... from inserted 
    open cur_trigger
    fetch cur_trigger into @переменные 
    while @@fetch_status=0 begin
                  ... тут сами действия для одной из вставленных строк, включая проверки "измененности" и т.п.
                   fetch cur_trigger into @переменные 
    end 
    close cur_trigger
    deallocate cur_trigger


    ну или по вкусу цикл по записям без курсора
    Ответ написан
    Комментировать
  • Как сделать выборку из ms sql server 16?

    @d-stream
    Готовые решения - не подаю, но...
    Если "в следующий раз" - это например завтра, то видимо где-то надо хранить последнюю считанную позицию и уже исходя из ее значения - запрашивать. Если же это "подряд" - то лучше считать все (если это конечно не миллионы строк) и уже потом крутится например в цикле.
    Ответ написан
  • Как показать число заказов каждого покупателя из определенной страны?

    @d-stream
    Готовые решения - не подаю, но...
    select
    customer, count(*)
    from orders
    inner join customers <...>
    where country = <>
    group by customers

    либо убрать where и группировать по стране и клиенту
    Ответ написан