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

SQL Server в Google Cloud Platform

$
0
0
Google Cloud Platform предоставляет SQL Server.

У него есть ограничения или это обычные версии?

Имеется в виду, что скажем Amazon RDS SQL Server версии - не нормальные,
они имеют ограничения по конфигурации и функционалу

Одновременная запись в 2 базы данных в рамках одной транзакции

$
0
0
Привет всем, есть такой вопрос. Я организовываю связь между двумя бд sql 2012 своими скриптами.

Представьте теперь некую Таблицу А в двух БД.

Табл1 А
ID Имя Уровень готовности
10000000 Имя1 0


И такую же по структуре таблицу А в БД 2, но пустую.

Теперь я думаю как реализовать такой алгоритм.

Пользователь БД1 ставит уровень готовности 1 в какой-то записи.
Раз в 5 минут БД-2 делает проверку если записи с уровнем готовности 1.
Если есть то начинается то, что вызывает у меня вопросы.

Транзакция {
Выбрать все записи с готовностью 1 в БД 1 (только при вставке изменить уровень готовности на 2)
Вставить их в БД2
Обновить эти записи в БД1 до уровня готовности 2

COMIT

если что-то не так пошло то ROLLBACK
}

Зачем нужна транзакция? Всё просто интернет не стабильный очень. Если он пропадёт во время транзакции то всё должно откатиться назад.

Что вы думаете, в нужную ли я сторону мыслю?

импорт данных из xml-файла в интернете в таблицу MS SQL SERVER

$
0
0
Добрый день.
Подскажите, пожалуйста, каким образом можно построить таблицу из xml файла, расположенного на web-странице?

Можно ли записать xml-код с веб-страницы в переменную типа xml с помощью OPENROWSET, а потом использовать OPENXML и т.д.
Если, да, то очень прошу пример.

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

Рекурсивно обойти таблицу

$
0
0
Всем привет.
Есть такая таблица: ID, OrgINN, OrgKPP, FounderID, GroupID.
В ней хранится список организаций и учредителей по ним, т.е. у одной организации может быть как много учредителей так и один.
Мне нужно все организации у которых учредители как косвенно так и прямо связаны распределить по группам.
Т.е. если у организации есть 2 учредителя и у них есть еще 5 организаций, а у этих пяти есть еще учредители и т.д. - так вот они должны относиться к одной группе.
Может кто подаст идею как это сделать можно?
Пробовал с помощью рекурсивного запроса - не смог победить. Т.к. в рек. запросах подразумевается поля подобные ParantID и ChildID.
А здесь сначала надо по ИНН и КПП связывать, потом по идентификатору учредителя и чередовать чтобы рекурсивно пройтись по дереву.
Хотя может быть я не верно таблицу спроектировал или не умею пользоваться рекурсивными запросами.
Буду очень благодарен за помощь.
Спасибо.

Обновление MSSQL 2008 R2 до SP3

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

Решил обновить MSSQL 2008 R2 до SP3 , скачал нужный SP3 и установил без сучка и задоринки, после ребутнул.
Теперь MSSQL 2008 не работает , пишет SQL Server находится в режиме обновления

Нашел вот статью ,сервер стартует и можно законектится только если в параметры загрузки добавить ;-T902.

Что ему не хватает ?

Лог ErrorLog в приложении

Лог с SQLAGENT
+
2016-08-21 09:24:18 - ! [150] SQL Server находится в режиме обновления и не принимает соединений. Ожидается разрешение Sql Server на установление соединений.


Заранее благодарен

Получить латиницу из строки

$
0
0
Ребята, каким образом средствами t-sql получить только латиницу из строки, ну например

'Телефон Brand sku'

Спасибо.

openrowset или sp_addlinkedserver

$
0
0
микрософт рекомендует вместо использования openrowset линковать сервер:
автор
Это альтернативный метод для доступа к таблицам на связанном сервере и является однократным нерегламентированным методом соединения и удаленного доступа к данным с помощью OLE DB. Вместо этого для более частых ссылок на источники данных OLE DB используйте связанные серверы.


У меня есть куча процедур, написанных еще в СКЛ2000, с динамическими запросами. И там очень активно используются openrowset'ы, подключаясь к различным серверам и базам.
Если все переделывать на современный лад, получается в начале процедуры нужно прилинковывать нужный сервер, а в конце отлинковывать.
При этом, если одновременно работает несколько таких процедур, то будет трындец: одна процедура уже прилинковала сервер, тут вдруг вторая пытается прилинковать его же. Потом первая процедура сделала свои дела и отлинковывает сервер. А вторая еще не закончила получать данные от него.

А чтобы нормально пользоваться openrowset'ом, микрософт советует лезть в реестр:
автор
Использовать функцию OPENROWSET для доступа к удаленным данным из источников данных OLE DB можно только в случае, если параметр реестра DisallowAdhocAccess явно установлен в значение 0 для указанного поставщика и включен дополнительный параметр конфигурации Ad Hoc Distributed Queries. Если эти параметры не установлены, поведение по умолчанию запрещает нерегламентированный доступ.


Каким образом правильней забирать данные с разных серверов, используя динамические запросы (обращение к разным базам и таблицам в зависимости от входных параметров и прочих условий)?

MS SQL Compact Edition отсутствует в списке выбора в обозревателе объектов

$
0
0
Здравствуйте!
ssms от ms sql 2012, установлен сабж версии 4.0 SP1,
а в обозревателе объектов его не видно

Знатоки MS-SQL и WinServer помогите разобраться.

$
0
0
Есть Failover Cluster, Windows 2012R2 Server x64 Standard. Кластер из 2х нод, кворум - файловая шара.
На ней SQL 2014, print @@version
Microsoft SQL Server 2014 - 12.0.4100.1 (X64) 
Apr 20 2015 17:29:27
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: )
AlwaysOn настроен, без listener.

Появилась задача сделать listener. Скрипт:
USE [master]
GO
ALTER AVAILABILITY GROUP AsyncAvailabilityGroup ADD LISTENER N'SQLList'
(WITH IP ((N'172.22.0.110', N'255.255.255.0')), PORT=1433);
GO

Вываливает ошибку:
Msg 19471, Level 16, State 0, Line 3
The WSFC cluster could not bring the Network Name resource with DNS name 'SQLList' online.
The DNS name may have been taken or have a conflict with existing name services,
or the WSFC cluster service may not be running or may be inaccessible.
Use a different DNS name to resolve name conflicts, or check the WSFC cluster log for more information.

Msg 19476, Level 16, State 4, Line 3
The attempt to create the network name and IP address for the listener failed.
The WSFC service may not be running or may be inaccessible in its current state,
or the values provided for the network name and IP address may be incorrect.
Check the state of the WSFC cluster and validate
the network name and IP address with the network administrator.

На тесте локально на виртуалках поднял кластер, олвизон. Добавляю листнер - все ОК. Вопрос в настройках винды, насколько я понимаю. Или в политиках, или в правах. SQL служба работают из под доменной учетки. Права дал, пока, для отладки: кластерному имени, нодам обеим и учетке из под которой работает служба SQL - Domain Admins - т.е. максимальные.


В чем причина может быть? Куда копать млин?

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

$
0
0
CREATE TABLE [dbo].[SAPProxyLog](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[username] [varchar](50) NULL,
	[host] [varchar](50) NULL,
	[datetimestamp] [datetime] NULL,
	[proxyname] [varchar](50) NULL,
 CONSTRAINT [PK_SAPProxyLog_id] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE NONCLUSTERED INDEX [IDX_SAPProxyLog] ON [dbo].[SAPProxyLog] 
(
	[host] ASC,
	[proxyname] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW

SELECT TOP(1) username 
  FROM sapproxylog
WHERE host='192.168.25.195' AND proxyname='master01'
  ORDER BY datetimestamp desc

Выборка по результатам группировки

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

Пример:
Товар А со стоимостью 10 продан трижды одним продавцом с одного склада, и один раз был возвращён через другого продавца, сумма продаж до возврата удовлетворяла требования выборки, но после возврата перестала удовлетворять и в результатах ни одного из товаров, проданных этим продавцом в складе не должно быть видно, как и возвращённого другому продавцу товара.

declare @Sales table (SalePerson varchar(100), WarehouseCode varchar(3), Amount float, Item varchar(50), Qty int);
declare @Refunds table (RefundPerson varchar(100), WarehouseCode varchar(3), Amount float, Item varchar(50), Qty int);
insert into @Sales (SalePerson, WarehouseCode, Amount, Item, Qty) values ('Foo', '001', 10, 'item A', 1);
insert into @Sales (SalePerson, WarehouseCode, Amount, Item, Qty) values ('Foo', '002', 10, 'item A', 1);
insert into @Sales (SalePerson, WarehouseCode, Amount, Item, Qty) values ('Foo', '003', 10, 'item A', 1);
insert into @Sales (SalePerson, WarehouseCode, Amount, Item, Qty) values ('bar', '001', 10, 'item A', 1);
insert into @Sales (SalePerson, WarehouseCode, Amount, Item, Qty) values ('bar', '001', 10, 'item A', 1);
insert into @Sales (SalePerson, WarehouseCode, Amount, Item, Qty) values ('bar', '002', 10, 'item A', 1);
insert into @Sales (SalePerson, WarehouseCode, Amount, Item, Qty) values ('bar', '001', 10, 'item A', 1);
insert into @Sales (SalePerson, WarehouseCode, Amount, Item, Qty) values ('bar', '003', 10, 'item A', 1);
insert into @Sales (SalePerson, WarehouseCode, Amount, Item, Qty) values ('bar', '001', 20, 'item B', 1);
insert into @Sales (SalePerson, WarehouseCode, Amount, Item, Qty) values ('bar', '002', 20, 'item B', 1);
insert into @Refunds (RefundPerson, WarehouseCode, Amount, Item, Qty) values ('abc', '003', -10, 'item A', 1);
insert into @Refunds (RefundPerson, WarehouseCode, Amount, Item, Qty) values ('Foo', '001', -10, 'item A', 1);

-- даже эта выборка не верна, потому что SalePerson меня реально интересует только для Sales, в Refunds может быть другой. А ещё в ней отсутствуют реальные количества товаров и цены:

select Person, WarehouseCode, Item from 
(
select SalePerson as Person, WarehouseCode, Amount, Item, Qty from @Sales
union all
select RefundPerson as Person, WarehouseCode, Amount, Item, Qty from @Refunds
) as X
group by Person, Item, WarehouseCode
having sum(Qty*Amount) >= 20


И не хотелось бы переусложнять запрос, потому что то, что здесь выглядит как @Sales и @Refunds на самом деле тоже немаленькие селекты. Что-то мне подсказывает, что должно быть какое-то изящное решение, но я его, увы, не вижу :(

Подсчет итогов

$
0
0
Добрый день!
Нужна помощь. Запрос написали, а вот подсчитать последнее поле не получается.
Ниже код и скрин с полем:
SELECT tblClients.ID, tblClients.Client, IIF(ISNULL(Продажи_до), 0, Продажи_до) AS Продажи_до, IIF(ISNULL(Продажи_период), 0, Продажи_период) AS Продажи_период, IIF(ISNULL(Продажи_после), 0, Продажи_после) AS Продажи_после, IIF(ISNULL(Оплачено_до), 0, Оплачено_до) AS Оплачено_до, IIF(ISNULL(Оплачено_период), 0, Оплачено_период) AS Оплачено_период, IIF(ISNULL(Оплачено_после), 0, Оплачено_после) AS Оплачено_после, IIF(ISNULL(Долг_до), 0, Долг_до) AS Долг_до, IIF(ISNULL(Долг_период), 0, Долг_период) AS Долг_период, IIF(ISNULL(Долг_после), 0, Долг_после) AS Долг_после, IIF(ISNULL(Итог), 0, Итог) AS Итог FROM (select tblClients.ID, tblClients.Client, (select sum(IIF(ISNULL(SaleAmount), 0, SaleAmount)) from tblSales where tblSales.ClientID = tblClients.ID and DocumentDate < <FILTER1>) as Продажи_до, (select sum(IIF(ISNULL(SaleAmount), 0, SaleAmount)) from tblSales where tblSales.ClientID = tblClients.ID and DocumentDate >= <FILTER1> and DocumentDate <= <FILTER2>) as Продажи_период, (select sum(IIF(ISNULL(SaleAmount), 0, SaleAmount)) from tblSales where tblSales.ClientID = tblClients.ID and DocumentDate > <FILTER2>) as Продажи_после, (select sum(IIF(ISNULL(PaymentAmount), 0, PaymentAmount)) from tblPayments where tblPayments.ClientID = tblClients.ID and PaymentDate < <FILTER1>) as Оплачено_до, (select sum(IIF(ISNULL(PaymentAmount), 0, PaymentAmount)) from tblPayments where tblPayments.ClientID = tblClients.ID and PaymentDate >= <FILTER1> and PaymentDate < <FILTER2>) as Оплачено_период, (select sum(IIF(ISNULL(PaymentAmount), 0, PaymentAmount)) from tblPayments where tblPayments.ClientID = tblClients.ID and PaymentDate > <FILTER2>) as Оплачено_после, (Продажи_до - IIf(ISNULL(Оплачено_до), 0, Оплачено_до)) as Долг_до, (Продажи_период - IIf(ISNULL(Оплачено_период), 0, Оплачено_период)) as Долг_период, (Продажи_после - IIf(ISNULL(Оплачено_после), 0, Оплачено_после)) as Долг_после, Долг_до + Долг_период + Долг_после as Итог from tblClients)

Как найти количество(сравнить данные)

$
0
0
Добрый день!
подскажите как сравнить данные?
ниже приведена таблица в которой 3 ключевых поля и 2 поля с данными

Надо найти количество уникальных наборов(поля data_1 и data_2),
ключевые поля k0,k1,k2

table T
(k0 int,k1 int,k2 int, data_1 int, data_2 float)
1, 1, 3, 4, 1.0
2, 1, 3, 5, 2.0

3, 2, 3, 4, 1.0
4, 2, 3, 5, 2.0

5, 9, 3, 8, 1.0

Побывал CHECKSUM_AGG(BINARY_CHECKSUM(*)), но данная функция может выдавать одинаковую контрольную сумму для разных данных, а HASHBYTES() работает только со строкой, не понял как ее применить к выборке.

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

Подскажите по запросу

$
0
0
declare @z table(k1 int,k2 int,k3 int)

insert into @z(k1,k2,k3) values
(1,1,1),(2,1,2),(3,1,3),(4,2,2),(5,2,3)

--это отрабатывает, получаем суммы по группе 
select distinct SUM(k3) from @z group by k2

--а здесь ругается
select count(*) from (select distinct SUM(k3) from @z group by k2)
--что я пропустил ?


--ошибка
Сообщение 102, уровень 15, состояние 1, строка 6
Неправильный синтаксис около конструкции ")".
ЗЫ пробовал и as zzz бесполезно :(

Помогите разобраться с низкой производительностью парсинга xml

$
0
0
Коллеги, приветствую!

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

<snils_zl_list>
  <zglv filename="051161PS01001" nfile="001" version="1.0" cod_pfr="051" nrec="100000" />
  <snils>001-012-075 46</snils>
  <snils>001-443-200 35</snils>
  <snils>001-370-159 64</snils>
  <snils>001-560-922 75</snils>
  <snils>001-127-481 84</snils>
  <snils>001-161-713 86</snils>
  <snils>001-218-036 57</snils>
</snils_zl_list>


Пытаюсь распарсить его таким запросом:
;with fxml as 
	(
    SELECT x = CAST(BulkColumn AS XML).query('.')
    FROM OPENROWSET(BULK '\\ssq001\C$\files\051161PS01001.XML', SINGLE_BLOB) xl
	Union all
    SELECT CAST(BulkColumn AS XML).query('.')
    FROM OPENROWSET(BULK '\\ssq001\C$\files\051161PS01002.XML', SINGLE_BLOB) xl
	Union all
    SELECT CAST(BulkColumn AS XML).query('.')
    FROM OPENROWSET(BULK '\\ssq001\C$\files\051161PS01003.XML', SINGLE_BLOB) xl
	)
Select
	x.value('(/snils_zl_list/zglv[1]/@filename)[1]', 'nvarchar(255)') [filename]
	,t.n.value('text()[1]', 'nvarchar(14)') [sn] 
	from fxml
	Cross apply x.nodes('/snils_zl_list/snils') t(n)

И получаю на выходе жутчайщие тормоза. Запрос выполняется порядка 10 часов.
В xml файле - 100000 записей.

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

+

Я думаю, что ситуация аналогична кейсу Сергея Сыроватченко ( )
Но по аналогии переписать запрос у меня не получилось.
/*
    24 HOP Russian 2016
    Session: XML, XQuery и трюки с производительностью
    Speaker: Sergey Syrovatchenko, Devart
    E-Mail:  sergeys@devart.com
*/

USE tempdb
GO

SET STATISTICS PROFILE ON
SET STATISTICS TIME ON

SELECT
      t.c.value('../@obj_name', 'SYSNAME')
    , t.c.value('@name', 'SYSNAME')
FROM dbo.data
CROSS APPLY x.nodes('objects/obj/*') t(c)

SELECT
      t.c.value('@obj_name', 'SYSNAME')
    , t2.c2.value('@name', 'SYSNAME')
FROM dbo.data
CROSS APPLY x.nodes('objects/obj') t(c)
CROSS APPLY t.c.nodes('*') t2(c2)

------------------------------------------------------

USE AdventureWorks2012
GO

DECLARE @xml XML = (
    SELECT
          [@obj_name] = o.name
        , [columns] = (
            SELECT i.name
            FROM sys.all_columns i
            WHERE i.[object_id] = o.[object_id]
            FOR XML AUTO, TYPE
        )
    FROM sys.all_objects o
    WHERE o.[type] IN ('U', 'V')
    FOR XML PATH('obj')
)

SELECT
      t.c.value('../../@obj_name', 'SYSNAME')
    , t.c.value('@name', 'SYSNAME')
FROM @xml.nodes('obj/columns/*') t(c)
GO

------------------------------------------------------

USE tempdb
GO

DECLARE @xml XML = (SELECT x FROM dbo.data),
        @idoc INT

EXEC sys.sp_xml_preparedocument @idoc OUTPUT, @xml 

SELECT *
FROM OPENXML(@idoc, '/objects/obj/*') 
WITH (
    name  SYSNAME '../@obj_name', 
    col   SYSNAME '@name'
)

EXEC sys.sp_xml_removedocument @idoc


Для чего нужно понимание "эскалации блокировок" ?

$
0
0
Привет.

Как я понимаю, суть эскалации блокировок это некое понимание того какие части БД блокируются при выполнении тех или иных операций/транзакций. Пока я с этим не разобрался.
Для чего вообще нужно знать теорию про эскалацию блокировок ? Как ее применить на практике ?! Приведите реальные пожалуйста примеры, когда знание этой вещи действительно может принести пользу.

Может быть знаете какой то обширный курс по этой теме который все досконально разбирает и показывает на примерах ?

Как понять откуда берутся reads?

$
0
0
был одни запрос, переделал его - смотрю в Profiler-е, количество reads увеличилось в несколько раз. Как понять откуда взялись эти reads?

Простой запрос и проблема с join

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

Есть простой запрос:
DECLARE @otID int = -4990;

        SELECT otAPB, otName, otAddress, otAddressR, otPhones, otName1, otSkid, otEmail, goID, otBAD, otSumOst, otBoss, otINN, otOKPO, otDesc As otDescPhone, Otdel.usiID, otKPP,
               otNew, otPassSer, otPassNom, otPassDate, otPassKem, otIDPlat, otBD, otDate,
               otCredit, otCreditDate, otPhoneCell, otClose,
               usKey,
               DCard.dcID, dcNomer, dcSkid
        FROM Otdel WITH (noLock)
            LEFT OUTER JOIN Users WITH(noLock) ON Users.otID = Otdel.ID
            LEFT OUTER JOIN DCard WITH(noLock) ON Otdel.ID = DCard.otID
        WHERE Otdel.ID = @otID;


При выполнении запроса, в плане, пишется предупреждение "No Join Predicate". С чем это связано и как с этим можно побороться?

Как понять по запросу, какой индекс нужно создать?

$
0
0
Как понять по запросу, какой индекс нужно создать?

Реплика с MySQL

$
0
0
Можно ли создать реплику с MySQL таким образом чтобы данные из MySQL передавались в MS SQL
Viewing all 7251 articles
Browse latest View live