Quantcast
Channel: SQL.ru: Microsoft SQL Server
Viewing all 7251 articles
Browse latest View live

Выборка из XML (парсинг) , join

$
0
0
Здравствуйте, уважаемые форумчане!
Хотел бы попросить вашего мудрого совета АКА помощи в решении задачи. Собственно сама задача:
Дана таблица([LEADER].[dbo].[OVERTIMES] ) с двумя столбцами ID (uniqueidentifier) и OvertimeXML(XML). Мне нужно пробежать по таблице, вытащить из OvertimeXML(XML) нужные мне значения по заданным мною условиям и записать это все во временную таблицу.
Из XML вытаскиваю значения следующим образом:
DECLARE name_cursor CURSOR
FOR
   Select OverTimeXml From [LEADER].[dbo].[OVERTIMES]  --исходная таблица
OPEN name_cursor
DECLARE @xmlVal XML
declare @MyTempTable1 table(AActDuration nvarchar(200)
, Namee nvarchar(400),OOperation nvarchar(200))
DECLARE @idoc int
FETCH NEXT FROM name_cursor INTO @xmlVal
WHILE (@@FETCH_STATUS = 0)
BEGIN
   EXEC sp_xml_preparedocument @idoc OUTPUT, @xmlVal
   Insert into @MyTempTable1 (AActDuration,Namee,OOperation ) 
   ( SELECT ActDuration,Name,Operation  
   FROM   OPENXML (@idoc, '/Tasks/Task',1)
    WITH (ActDuration  varchar(100) ,Name  varchar(100),Operation varchar (400)) where 
    Name like '%523%' or Operation like '%523%')  --условия
   EXEC sp_xml_removedocument @idoc
   FETCH NEXT FROM name_cursor INTO @xmlVal
END
CLOSE name_cursor
DEALLOCATE name_cursor 
select * from @MyTempTable1

Но как мне привинтить к результату значение ячейки ID (uniqueidentifier) ума не приложу.
Дорогие специалисты, будьте так любезны подскажите как быть.

Операция Sequence занимает 70% времени выполнения запроса

$
0
0
День добрый! Есть довольно сложный запрос, предназначенный для построения OLAP куба. В процессе переноса OLAP с одного сервера на другой столкнулся с тем, что запрос вместо 15 минут начал отрабатывать за 1,5 часа. Большую часть времени, если верить плану выполнения, занимает инструкция Sequence. На старом железе такой проблемы не было.
Подскажите пожалуйста по какой причине может так измениться поведение SQL сервера?
Планы запросов во вложении.

SQL Запрос

$
0
0
Имеется запрос, который выводит все позиции. Необходимо вывести только те, которые имею Да

SELECT RESOURCES.RESOURCENAME,
CASE
WHEN SUM(CASE
WHEN SoftwareInstallation.ATTRIBUTE_5701='Нет' or SoftwareInstallation.ATTRIBUTE_5701 IS NULL THEN 1
ELSE 0
END
)>0 THEN 'Нет'
ELSE 'Да'
END
FROM RESOURCES
LEFT JOIN CIRelationships ON RESOURCES.CIID = CIRelationships.CIID
LEFT JOIN SoftwareInstallation ON CIRelationships.CIID2 = SoftwareInstallation.CIID
where CIRelationships.RELATIONSHIPTYPEID='7'
GROUP BY RESOURCES.RESOURCENAME

T-SQL Определить номер недели

$
0
0
Добрый вечер!
Помогите, пожалуйста, подготовить скрипт. Есть дата в текущем году. Нужно вывести номер недели текущего года, в которую попадает эта дата, и первое и последнее числа недели. Неделя начинается с понедельника.

Помогите начать работать с SSIS.

$
0
0
Как сделать SSIS пакет загрузки из EXCEL при таких условиях:
1) Имя файла это LADA_И дальше какие то цифры_.разный эксель (xls,xlsx,xlsm,xlsb) файл лежит всегда в одном месте)
2) Имя листа Запчасти_и дальше дата сегодняшняя
3)Загрузка с отбором: перевая колонка not null и 4 колонка больше 0.

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

Задача

$
0
0
Есть таблицы
t1 (vcode int,numb int)
t2 (vcode int,pcode int,numb int)
t3 (vcode int,pcode int,numb int)
t4 (vcode int,pcode int,numb int)
t5 (vcode int,pcode int,numb int)
t6 (vcode int,pcode int,numb int)


Таблицы со 2-й по 6-ю связаны с 1-й по связке t1.vcode=tN.pcode

в разных случаях для t1 количество записей в t1-t6 разное, и когда начинаешь собирать их left join, то соответственно записи двоятся, троятся, что делать в этом случае?
Должна получаться запись вида

t1  t2     t3 ... t6
1   1      1       1
2   2      2       null
3   null   3       null


Мне в голову пришла мысль каждый раз для каждой записи t1 считать максимальное кол-во записей среди t2-t6, пронумеровывать их,
затем все остальные таблицы приджойнивать к той, в которой запись максимальная

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

Помогите оптимизировать запрос

$
0
0
Добрый день.
есть некий запрос созданный неким разработчиком:
set profiling=1;
SELECT 
	DISTINCT p.product_id,
	pd.name AS name, 
	p.image, 
	p.city as zone, 
	p.href as product_url, 
	p.product_id as product_id, 
	p.shipping_text as shipping_text, 
	p.payment_text as payment_text,
	p.sort_order, 
	p.shipping as shipping, 
	p.sort_order, 
	v.partner, 
	v.store_url as out_href, 
	co.name as country, 
	(SELECT price FROM product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '1' AND pd2.quantity = '1' 
		AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < '2016-08-24 11:45:00') 
		AND (pd2.date_end = '0000-00-00' OR pd2.date_end > '2016-08-24 11:45:00')) 
		ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, 
	(SELECT price FROM product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '1' 
		AND ((ps.date_start = '0000-00-00' OR ps.date_start < '2016-08-24 11:45:00') 
		AND (ps.date_end = '0000-00-00' OR ps.date_end > '2016-08-24 11:45:00')) 
		ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, 
	(SELECT points FROM product_reward pr WHERE pr.product_id = p.product_id AND pr.customer_group_id = '1') AS reward, 
	(SELECT ss.name FROM stock_status ss WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '8') AS stock_status, 
	(SELECT wcd.unit FROM weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '8') AS weight_class, 
	(SELECT lcd.unit FROM length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '8') AS length_class, 
	(SELECT AVG(rating) AS total FROM review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, 
	(SELECT COUNT(*) AS total FROM review r2 WHERE r2.product_id = p.product_id AND r2.status = '1' GROUP BY r2.product_id) AS reviews
FROM product p 
INNER JOIN product_description pd ON (p.product_id = pd.product_id) 
LEFT JOIN product_to_store p2s ON (p.product_id = p2s.product_id) 
INNER JOIN country co ON (p.country_id = co.country_id) 
INNER JOIN vendor vv ON (vv.vproduct_id = p.product_id) 
INNER JOIN vendors v ON (vv.vendor = v.vendor_id) 
WHERE p.product_id = '337388' 
	AND pd.language_id = '8' 
	AND p.status = '1' 
	AND p.date_available <= '2016-08-24 11:45:00';
    show profiles;

Имеет ли смысл существования базы с отключенной READ_COMMITTED_SNAPSHOT?

$
0
0
Привет.
Какая причина может заставить отказаться от включенного READ_COMMITTED_SNAPSHOT?

Погуглил, нашел вроде 2 причины:
1. Если данный режим включен, то растет размер и активность работы с TempDB.
2. Мол можно использовать отключенный режим, но "эмулировать" его повсеместным использованием WITH(NOLOCK).

По первой причине не вижу какой-то проблемы. Неужели это реально создает "бутылочное горлышко" тормозящее всю базу ?
Вторая причина вообще похоже не верна.

Подскажите пожалуйста, есть ли существенные/критичные проблемы-минусы с включенным READ_COMMITTED_SNAPSHOT ?

Вопрос по Count

$
0
0
MSSQL 2012 Enterprise

Одна таблица состоит из одного столбца, в столбце текстовые значения, число строк около 100млн.
Строки предварительно вычещены от мусора в виде пробелов:

update TABLE set [COLUMN] = ltrim(rtrim([COLUMN]))

И от мусора в виде пустых строк:

elete from TABLE where ltrim(rtrim([COLUMN]))='' or [COLUMN] is null

таблица получается 98 млн строк.

но при попытке подсчитать число повторов запросом

select COUNT(*), [COLUMN] from [TABLE] group by [COLUMN]

или таким

insert into [TABLE] select COUNT(*), [COLUMN] from [TABLE] group by [COLUMN]

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

запрос SELECT TOP 100 000 000 выдает все строки

Формат строк VARCHAR (750)

В чем может быть проблема?

Вообще - задача стоит в том что бы в таблице появился второй столбец в котором отражалось число повторов текста из столбца 1, а затем в столбце 1 удалить все дубликаты, но оставив число повторов (до удаления дубликатов) в столбце 2

Спасибо за помощь нубу.

Неверно выбирается Uset для доменного Login'а.

$
0
0
Добрый день

Есть логин/пользователь созданные как-то так:

use master
go
CREATE LOGIN [CompanyGROUP\S.Stallone] FROM WINDOWS WITH DEFAULT_DATABASE=[TheDatabase], DEFAULT_LANGUAGE=[us_english]
GO

use TheDatabase
GO

CREATE USER [CompanyGROUP\S.Stallone] FOR LOGIN [CompanyGROUP\S.Stallone] WITH DEFAULT_SCHEMA=[test]
GO


Итого:
Логин:CompanyGROUP\S.Stallone
База: TheDatabase
Юзер: CompanyGROUP\S.Stallone
Схема:test

При коннекте с локальной (серверной) машины (под логином CompanyGROUP\S.Stallone), запрос
use TheDatabase
go
select user, schema_name(), system_user, db_name()
go

возвращает "ожидаемые" значения.

Но при коннекте с любой другой (доменной) машины user и schema_name() возвращают dbo.

Ммм.. почему так? Как победить?

Спасибо.

EXEC и TIMEOUT

$
0
0
Господа, есть способ заставить запрос обернутый EXEC выполняться не более определенного TIMEOUT-а, но так чтобы не менять настройки таймаутов на сервере или желательно даже внутри сессии.

То есть запустился -- не смог выполниться за 10 секунд -- отвалился.

EXEC('
DROP TRIGGER [Stage].[Products_Collections_UpdColumnsLog]
');

Агриригируемая строка

$
0
0
Надо пройти по таблице и сделать строку из ID. Написал запрос. Если пытаюсь подставить ps.id говорит недопустимое имя. Без sp неоднозначность. Как быть?
		SELECT
		  STUFF(CAST((
			  SELECT [text()] = ';' + [ID]
			    FROM SPECIAL_PROCESSING sp
			      INNER JOIN CONTAINER_SPEC_PROC_LNK cspl ON cspl.container_id = 6978
			   WHERE sp.id = cspl.special_processing_id
			  ORDER BY sp.id
    FOR XML PATH(''), TYPE) AS VARCHAR(100)), 1, 1, '')

Функция работает во много раз медленнее, чем её тело

$
0
0
Написал функцию. Запускаю. Работает оооочень долго.
Выдрал из неё код. Запускаю его - работает быстро.

Почему так может быть и что делать?

MS SQL 2008 R2 Express

$
0
0
бесплатную версию сейчас реально где-то скачать?
Дома требуется порешать несколько задач.

Более поздние версии не ставил, пробовать пока не хочу, так как среда разработки нужна срочно

Помощь в функции

$
0
0
Добрый день, уважаемы форумчане.

Есть вот такой код:

USE [eneca_database15]
GO
/****** Object: UserDefinedFunction [dbo].[eConvertToBLR] Script Date: 08/26/2016 15:44:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[eConvertToBLR] (@Calculation bigint, @Currency nvarchar(3),@Amount real)
RETURNS bigint
AS
BEGIN
DECLARE @AmountBLR bigint;

SET @AmountBLR=CASE @Currency
WHEN 'RUR' THEN ROUND(@Amount*(SELECT RateRUR FROM tblMonthlyVariables WHERE ID=@Calculation),-2)
WHEN 'LTL' THEN ROUND(@Amount*(SELECT RateLTL FROM tblMonthlyVariables WHERE ID=@Calculation),-2)
WHEN 'USD' THEN ROUND(@Amount*(SELECT RateUSD FROM tblMonthlyVariables WHERE ID=@Calculation),-2)
WHEN 'EUR' THEN CONVERT(money,(ROUND(@Amount*(SELECT RateEUR FROM tblMonthlyVariables WHERE ID=@Calculation),-2)),1)
WHEN 'UAH' THEN ROUND(@Amount*(SELECT RateUAH FROM tblMonthlyVariables WHERE ID=@Calculation),-2)
ELSE
ROUND(@Amount,-2)
END
RETURN(@AmountBLR);
END;


На данный момент округление идет вот так: Задано число: 1345,87 на выходе: 1300,00

А мне нужно, чтобы: Задано число 1345,87 на выходе было 1345, 87


Заранее спасибо

Как снять restore state у Базы без привелегий на Create Base

$
0
0
Дело в том что пробовал восстановить бэкап из БД1 в новую БД2 средствами Restore SQL Management Studio.
Но матернулось на права, и не смогло создать Базу БД2. В итоге БД1 зависла в restore state.
RESTORE DATABASE БД1 WITH RECOVERY не помогает, так как нет прав на Restore.
Есть ли возможность вывести БД из restore state. И как так получилось, что не имея прав я смог ее туда вогнать?

Выбрать первые строки с признаком

$
0
0
Добрый день, уважаемые форумчане.
Да таблица со столбцами
[ID] int, Atrib bit, [Date] date

Возможно ли одним запросом выбрать из таблицы первые по датам строки, у которых Atrib = 1 ?
Простой select не помогает :)

case+update в чем ошибка?

$
0
0
select shop.zarabotok,

case
when shop.zarabotok<134000 then

UPDATE sotrudniki
set zarplata=zarplata-10000
where marketid in (select marketid
from shop where zarabotok<134000)

when shop.zarabotok>134000 then

UPDATE sotrudniki
set zarplata=zarplata+5000
where marketid in (select marketid
from shop where zarabotok>134000)

end as zpposle, sotrudniki.zarplata as zpdovicheta

from shop,sotrudniki

пишет Неправильный синтаксис около ключевого слова "UPDATE" но в чем ошибка не пойму.

text в триггере

$
0
0
При создании триггера выдает такую ошибку:
"Cannot use text, ntext, or image columns in the 'inserted' and 'deleted' tables."

Я так понял что нельзя работать с полями такого типа в триггерах,
как тогда сохранять информацию из этих полей?

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

Как это можно обойти?

Не могу придумать sql-запрос

$
0
0
казалось бы, простая задача:

нужно счесть суммы объектов в таблице @list
declare @list table (idOrder int, idObject int, cntObject int)

insert @list (idOrder, idObject, cntObject) values (1, 1, 1)
insert @list (idOrder, idObject, cntObject) values (2, 1, 1)
insert @list (idOrder, idObject, cntObject) values (3, 2, 1)
insert @list (idOrder, idObject, cntObject) values (4, 3, 2)
insert @list (idOrder, idObject, cntObject) values (5, 3, 1)
insert @list (idOrder, idObject, cntObject) values (6, 1, 1)

select * from @list


результат должен быть таким:
declare @listCompound table (idOrder int, idObject int, sumObject int)

insert @listCompound(idOrder, idObject, sumObject) values (1, 1, 2)
insert @listCompound(idOrder, idObject, sumObject) values (2, 2, 1)
insert @listCompound(idOrder, idObject, sumObject) values (3, 3, 3)
insert @listCompound(idOrder, idObject, sumObject) values (4, 1, 1)

select * from @listCompound

…………………
т.е. нужно суммировать @list.cntObject для записей, у которых в упорядоченном списке одно значение @list.idObject. При этом:
- значения @list.idOrder не совпадают со значениями нат. ряда. Т.е. значения @list.idOrder могут быть такими {2, 8, 23, 44, …}
- значения @listCompound.idOrder не связаны со значениями @list.idOrder. Важен только порядок.
Viewing all 7251 articles
Browse latest View live