Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Microsoft SQL Server

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

Открыть новую тему     Написать ответ в эту тему

Megard

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MICROSOFT SQL SERVER
 
тема посвящена выяснению ответов на вопросы, касающихся установки, функционирования и использования Microsoft SQL Server; также обсуждаются вопросы, касающиеся использования T-SQL (диалект SQL-языка, используемого в этой версии сервера)
 
популярные ответы на популярные вопросы "где скачать?" и "чем сломать?" можно найти здесь

 
 
Официальная документация:
SQL Server 2005 Books Online (original/english, 135MB, september 2007);
SQL Server 2005 Books Online (перевод/русский, 148MB, январь 2009);
 
 
Официальные обновления:
[для версий, начиная с 9.0.3042] / [полный перечень обновлений / зеркало]
03/06/2007: KB933508 (9.0.3042 > 9.0.3050);
04/03/2007: KB934458 (9.0.3050 > 9.0.3054);
04/03/2007: KB934459 (9.0.3054 > 9.0.3159);
06/28/2007: KB936305 (9.0.3159 > 9.0.3175);
 
 
Альтернативные источники информации:
sql.ru - очень полезный ресурс с говорящим за себя названием; пожалуй, лучший (если не единственный) на просторах ru'нета; кроме форумов есть большая подборка статей, FAQ, и прочее.

Всего записей: 135 | Зарегистр. 13-09-2002 | Отправлено: 11:49 18-07-2003 | Исправлено: niichavo, 16:13 02-04-2010
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Тогда, кроме оператора SUBSTRING во внутреннем запросе, нужно использовать оператор CUBE в промежуточном запросе (и поместить его в конструкцию WITH: https://stackoverflow.com/questions/12552288/sql-with-clause-example)
 
и затем из этого промежуточного результата создать 16 таблиц, фильтруя по полю SUBSTRING и соединяя между собой по имени домена (FULL OUTER JOIN) и с таблицами, содержащими регион и управление.
Или использовать OLAP-функции (если такие есть в MSSQL)
Или пользоваться процедурными языками для перевода 1-мерной таблицы в 2-мерную.
 
Что-то типа:
WITH qry (mac_fin, domain, chk) AS (
SELECTmac_fin, domain, SUM(chk) as chk
  FROM(
SELECT substring(MAC.MAC_Addresses0, 12, 1) AS mac_fin, SYS.Resource_Domain_OR_Workgr0 AS domain, COUNT(DISTINCT SYS.ResourceID) AS chk  
  FROM v_R_System AS SYS LEFT OUTER JOIN  
                      v_RA_System_MACAddresses AS MAC ON SYS.ResourceID = MAC.ResourceID
  WHERE (SYS.Client0 = 1)
    AND (SYS.Resource_Domain_OR_Workgr0 IN ('GVC', 'MAIN', 'SVRW', 'ZRW', 'KBSH', 'ORW', 'KLGD', 'SKZD', 'GRW', 'KRW', 'WSR', 'SURW', 'NRR', 'ESRR', 'MSK', 'PVRR', 'SERWRZD', 'DVGD'))
  GROUP BY substring(MAC.MAC_Addresses0, 12, 1), SYS.Resource_Domain_OR_Workgr0)
GROUP BY mac_fin, domain WITH CUBE)
SELECT rzd.domain, q0.chk0, q1.chk1, ... и т.д. до qF.chkF
  FROM dbo.v_tmp_RZD_info rzd LEFT OUTER JOIN  
(SELECT domain, chk as chk0
  FROM qry
 WHERE mac_fin = '0') q0 ON rzd.domain=q0.domain LEFT OUTER JOIN
(SELECT domain, chk as chk1
  FROM qry
 WHERE mac_fin = '1') q1 ON rzd.domain = q1.domain  LEFT OUTER JOIN ... и т.д. до qF
 
PS. сам я к MSSQL никакого отношения не имею, и ни разу на нём не программировал. Так что, в коде могут быть опечатки и ошибки.

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 13:55 01-08-2017
kapiton1

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем доброго времени суток.
 
Вот есть такая функция, которая вырезает часть строки до первой точки:
CASE WHEN SUBSTRING(soft_f.FileVersion, 1, CHARINDEX('.', soft_f.FileVersion) - 1)  
                      = '12' THEN 'Mirosoft Office 2007' ELSE 'Версия не определена' END AS [Версия Microsoft Office]
 
Не подскажете, как вырезать часть строки между второй и третьей точкой?
Примеры:
12.0.4518.1014
9.0.1534.952

Всего записей: 138 | Зарегистр. 20-07-2005 | Отправлено: 10:59 07-08-2017
DenSyo

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kapiton1
SUBSTRING(soft_f.FileVersion, CHARINDEX('.', soft_f.FileVersion, CHARINDEX('.', soft_f.FileVersion)+1)+1, CHARINDEX('.', soft_f.FileVersion, CHARINDEX('.', soft_f.FileVersion, CHARINDEX('.', soft_f.FileVersion)+1)+1)-1)
 
функция возвращающая указанный элемент строки с разделителями:
@TxtStr - исходная строка
@SepStr - строка разделитель (любой длины)
@Idx - номер элемента который необходимо получить
 

Цитата:
 
USE [MyBase]
GO
/* get_substring(@TxtStr, @SepStr, @Idx) Returns an element of a delimited string at the specified number */
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[get_substring] (@TxtStr varchar(max), @SepStr varchar(max), @Idx int)
RETURNS Varchar(max)
AS
BEGIN
    DECLARE @ResultStr Varchar(max), @i int, @i1 int, @i2 int;
    SET @ResultStr=''
    IF @TxtStr>'' AND @TxtStr<>@SepStr AND @Idx>0 BEGIN
    IF @SepStr>'' BEGIN
    SET @i=0
    SET @i1=1
    SET @i2=1
    WHILE @i2>0 AND @i2<LEN(@TxtStr) AND @i<@Idx BEGIN
        SET @i+=1
        SET @i2=CHARINDEX(@SepStr, @TxtStr, @i1)
        IF @i2=0 SET @i2=LEN(@TxtStr)+1
        IF @i=@Idx SET @ResultStr=SUBSTRING(@TxtStr, @i1, @i2-@i1) ELSE SET @i1=@i2+LEN(@SepStr)
    END
    END ELSE SET @ResultStr=@TxtStr
    END
    RETURN (@ResultStr)
END
 

 
пример: get_substring(soft_f.FileVersion, '.', 3)

Всего записей: 218 | Зарегистр. 19-01-2008 | Отправлено: 11:44 07-08-2017 | Исправлено: DenSyo, 15:55 07-08-2017
kapiton1

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DenSyo
 
Спасибо большое, хоть что-то стало вырисовываться, но если использовать вот это:
 
SUBSTRING(soft_f.FileVersion, CHARINDEX('.', soft_f.FileVersion, CHARINDEX('.', soft_f.FileVersion)+1)+1, CHARINDEX('.', soft_f.FileVersion, CHARINDEX('.', soft_f.FileVersion, CHARINDEX('.', soft_f.FileVersion)+1)+1)-1)
 
то из этой строки "12.0.4518.1014" я получаю такую "4518.1014", а нужно вот такую "4518", что здесь надо поменять?
 
второй способ пока не пробовал
 

Всего записей: 138 | Зарегистр. 20-07-2005 | Отправлено: 15:14 07-08-2017
DenSyo

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kapiton1
SUBSTRING(soft_f.FileVersion, CHARINDEX('.', soft_f.FileVersion, CHARINDEX('.', soft_f.FileVersion)+1)+1, CHARINDEX('.', soft_f.FileVersion, CHARINDEX('.', soft_f.FileVersion, CHARINDEX('.', soft_f.FileVersion)+1)+1)-CHARINDEX('.', soft_f.FileVersion, CHARINDEX('.', soft_f.FileVersion)+1))
 
вот так пожалуй. но лучше функцию прописать, она и понятней выглядит и производительнее будет

Всего записей: 218 | Зарегистр. 19-01-2008 | Отправлено: 15:54 07-08-2017
kapiton1

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DenSyo
 
Еще раз спасибо. Но всё равно, в обновленном запросе остается последняя точка, типа так "4518.", как бы её победить? С функцией что-то пока не срастается, выходит много ошибок при добавлении в запрос.

Всего записей: 138 | Зарегистр. 20-07-2005 | Отправлено: 16:27 07-08-2017
DenSyo

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kapiton1
SUBSTRING(soft_f.FileVersion, CHARINDEX('.', soft_f.FileVersion, CHARINDEX('.', soft_f.FileVersion)+1)+1, CHARINDEX('.', soft_f.FileVersion, CHARINDEX('.', soft_f.FileVersion, CHARINDEX('.', soft_f.FileVersion)+1)+1)-CHARINDEX('.', soft_f.FileVersion, CHARINDEX('.', soft_f.FileVersion)+1)-1)  
еще единичку отнять надо из длины строки.  
 
с функцией проблем быть не должно, у меня она исправно работает.
в любой базе создаем скалярную функцию, вместо дефолтного текста вставляем текст функции, в верхней строке USE [MyBase] меняем MyBase на имя базы куда добавляется функция. жмем выполнить. после первого выполнения меняем CREATE FUNCTION на ALTER FUNCTION. когда используем функцию в других базах пишем полностью ее путь: MyBase.dbo.get_substring()

Всего записей: 218 | Зарегистр. 19-01-2008 | Отправлено: 02:31 08-08-2017
kapiton1

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DenSyo
 
Огромное спасибо! Всё заработало.

Всего записей: 138 | Зарегистр. 20-07-2005 | Отправлено: 13:12 08-08-2017
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
При вызове функции указание БД не обязательно если вызов из той же БД. Владелец обязателен. Т.е. dbo.get_substring(...) минимально достаточно.

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 21:20 08-08-2017
Futurism

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ребят помогите с запрос в sql сервере
 
select  
а1
а2
а3
а4
а5
а6
а7
 
from test where все эти поля не нулы

Всего записей: 1200 | Зарегистр. 04-02-2011 | Отправлено: 12:44 16-08-2017 | Исправлено: Futurism, 12:57 16-08-2017
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
where a1 is not null and a2 is not null...

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 13:20 16-08-2017
Futurism

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alexzzy
 
а если у меня 100500 полей, мне также делать
а1 is not null
...
a100500 is not null
есть ли возможность сразу это сделать?

Всего записей: 1200 | Зарегистр. 04-02-2011 | Отправлено: 14:48 16-08-2017
DenSyo

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Futurism
надо написать функцию извлекающую из таблицы имена полей и строящую строку запроса по вашему условию. можно непосредственно на скуле функцию писать, можно в любом другом средстве работающем с субд.

Всего записей: 218 | Зарегистр. 19-01-2008 | Отправлено: 02:58 17-08-2017
Fsp050

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
подскажите, я делаю конкатинацию
 
SELECT CONCAT ( 'категория#тс', 'тип#ТС ', '[марка(эталон)]', 'серия' ) ,
цена,
citymil
 
from [ExcelAnalysis].[dbo].cleardb
но на выходе вместо  значений категорий, выходят только названия категорий

как мне сделать, чтобы тут были конкретные значения этих переменных?

Всего записей: 361 | Зарегистр. 02-04-2011 | Отправлено: 17:28 17-08-2017
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Fsp050
переменные должны быть без кавычек

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 17:39 17-08-2017
Fsp050

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а если я хочу через черточки
SELECT CONCAT (категория#тс, '-', тип#ТС ,'-' ,[марка(эталон)],'-', серия ) ,
цена,
citymil
 
from [ExcelAnalysis].[dbo].cleardb
 
авто-легковое-жигули-калина
у меня ошибка
Сообщение 207, уровень 16, состояние 1, строка 1
Недопустимое имя столбца "категория#тс".
Сообщение 207, уровень 16, состояние 1, строка 1
Недопустимое имя столбца "тип#ТС".
Сообщение 207, уровень 16, состояние 1, строка 1
Недопустимое имя столбца "марка(эталон)".
Сообщение 207, уровень 16, состояние 1, строка 1
Недопустимое имя столбца "серия".
Сообщение 207, уровень 16, состояние 1, строка 2
Недопустимое имя столбца "цена".
Сообщение 207, уровень 16, состояние 1, строка 3
Недопустимое имя столбца "citymil".

Всего записей: 361 | Зарегистр. 02-04-2011 | Отправлено: 14:34 18-08-2017
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Fsp050
А хрен его знает. Тут телепатов нет. Какие поля в таблице никто не знает.

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 20:29 18-08-2017
SergioLeonov

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народ, помогите!
 
Я в sql не бум-бум, а одной базе срочно нужна помощь.
Итак, есть SQL-2005, есть база Base, в базе есть таблица Table, в таблице поле RegDate с типом данных datetime. В таблице сохраняется журнал приложения. И вот эта таблица с зарегистрированными событиями уже имеет миллионы строк и размер под сотню гигов. Как бы ее урезать?
Типа delete from table where Regate меньше такой-то даты ?
Удалять из приложения не получается - вываливается сообщение о нехватке памяти.
 
Буду признателен за любую помощь

Всего записей: 6 | Зарегистр. 01-11-2005 | Отправлено: 10:23 31-08-2017
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergioLeonov
Ну так удалить через SSMS
delete from table where Regate < '20170831'

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 10:41 31-08-2017
SergioLeonov

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alexzzy

Цитата:
SergioLeonov
Ну так удалить через SSMS
delete from table where Regate < '20170831'

 
А там в таблице в формате yyyy-mm-dd hh:mi:ss.mmm    то есть:
2017-06-20 07:25:19.960
Подозреваю, это надо сначала как-то преобразовывать

Всего записей: 6 | Зарегистр. 01-11-2005 | Отправлено: 10:51 31-08-2017
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Microsoft SQL Server


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru