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

Как избавиться от deadlock

$
0
0
Подскажите, что сделать, чтобы устранить deadlock, опыта в этом деле нет.
Есть xml данные с описанием двух процессов, полученные из событий Extended Events. Один процесс пишет данные, другой пытается их читать.

Настройка базы
SET READ_COMMITTED_SNAPSHOT OFF 


+
<deadlock>
 <victim-list>
  <victimProcess id="processfb3f6dc28" />
 </victim-list>
 <process-list>
  <process id="processfb3f6dc28" taskpriority="0" logused="0" waitresource="PAGE: 14:1:912927 " waittime="70181" ownerId="29311074214" transactionname="SELECT" lasttranstarted="2016-08-11T17:00:48.550" XDES="0x673083a20" lockMode="IS" schedulerid="8" kpid="17276" status="suspended" spid="90" sbid="1" ecid="0" priority="0" trancount="0" lastbatchstarted="2016-08-11T17:00:41.720" lastbatchcompleted="2016-08-11T17:00:41.720" lastattention="1900-01-01T00:00:00.720" clientapp="PHP" hostname="WS-CC-02" hostpid="3524" loginname="WebServer" isolationlevel="read committed (2)" xactid="29311074214" currentdb="17" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
   <executionStack>
    <frame procname="CONTACT_CENTR.dbo.CRMCampaignTraficSelectALL" line="13" stmtstart="558" stmtend="5544" sqlhandle="0x030011005cf8440d6936ee005fa6000001000000000000000000000000000000000000000000000000000000">
select	a.campaign
			...
from (	
	select	campaign
			,count(distinct Operator) as CCOperators
			,count(*) as  AllCalls
			,sum(case when result_ccs = 'OK' then 1 else 0 end) as CallOper
			,sum(case when result_ccs  &lt;&gt;  'OK'  then 1 else 0 end) as CallNo
						
			,case when max(T.comment) = 1 then sum(case when result_c    </frame>
    <frame procname="adhoc" line="1" stmtstart="18" sqlhandle="0x010011004f8e3f2150e801930300000000000000000000000000000000000000000000000000000000000000">
EXEC [dbo].[CRMCampaignTraficSelectALL] @P1    </frame>
    <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown    </frame>
   </executionStack>
   <inputbuf>
(@P1 int)EXEC [dbo].[CRMCampaignTraficSelectALL] @P1   </inputbuf>
  </process>
  <process id="process11f931f468" taskpriority="0" logused="0" waitresource="PAGE: 14:1:912927 " waittime="3814" ownerId="29311068210" transactionname="user_transaction" lasttranstarted="2016-08-11T17:00:10.717" XDES="0x15015e58e0" lockMode="IS" schedulerid="2" kpid="9452" status="suspended" spid="240" sbid="1" ecid="0" priority="0" trancount="1" lastbatchstarted="2016-08-11T17:00:10.720" lastbatchcompleted="2016-08-11T17:00:10.717" lastattention="1900-01-01T00:00:00.717" clientapp="Microsoft SQL Server" hostname="AVSQL" hostpid="4936" loginname="sa" isolationlevel="read committed (2)" xactid="29311068210" currentdb="1" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
   <executionStack>
    <frame procname="adhoc" line="1" stmtstart="28" stmtend="400" sqlhandle="0x02000000d3aac8264f1b7e6e99aa9a6e3d3cf696343f643c0000000000000000000000000000000000000000">
unknown    </frame>
    <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown    </frame>
   </executionStack>
   <inputbuf>
(@P1 datetime)SELECT SUM(CONVERT(int,"Tbl1012"."Answer1",0)) "Expr1013",COUNT("Tbl1012"."Answer1") "Expr1014" FROM "AVAYA"."dbo"."LKK" "Tbl1012" WHERE "Tbl1012"."EVENT_TIME"&gt;=@P1   </inputbuf>
  </process>
  <process id="process13eeeb3468" taskpriority="0" logused="964200" waitresource="PAGE: 14:1:2784554 " waittime="102121" ownerId="29311064342" transactionname="INSERT" lasttranstarted="2016-08-11T17:00:06.023" XDES="0x109502540" lockMode="X" schedulerid="8" kpid="16044" status="suspended" spid="67" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2016-08-11T17:00:05.977" lastbatchcompleted="2016-08-11T17:00:05.973" lastattention="1900-01-01T00:00:00.973" clientapp="SQLAgent - TSQL JobStep (Job 0x78A5BA4C822129448957DE08E4E3A93E : Step 1)" hostname="SQLDATA-NODE-01" hostpid="3088" loginname="CCNTT\sqlservice" isolationlevel="read committed (2)" xactid="29311064342" currentdb="14" lockTimeout="4294967295" clientoption1="673185824" clientoption2="128056">
   <executionStack>
    <frame procname="CRM.dbo.sp_CRM_Import_from_100" line="29" stmtstart="1680" stmtend="6892" sqlhandle="0x03000e001466447d5244c90051a4000001000000000000000000000000000000000000000000000000000000">
INSERT INTO [CRM].[dbo].[CALL_HISTORY]
				   ([CAMPAIGN]
				   ,[CUSTOMER_ID]
				   ,[DATE_CALLSTART]
				   ...
				   ,[CLIEN    </frame>
    <frame procname="adhoc" line="3" stmtstart="116" stmtend="244" sqlhandle="0x0200000063998a0417f8fbd736ae3fbb80952e3076cc522c0000000000000000000000000000000000000000">
unknown    </frame>
   </executionStack>
   <inputbuf>
If sys.fn_hadr_is_primary_replica ( 'CRM' ) = 1 
begin
	EXECUTE [CRM].[dbo].[sp_CRM_Import_from_100] 

                EXECUTE [CRM].[dbo].[sp_CRM_CCS2_Import_from_100] 
end

else
	print 'Это Secondary реплика'   </inputbuf>
  </process>
 </process-list>
 <resource-list>
  <pagelock fileid="1" pageid="912927" dbid="14" subresource="FULL" objectname="CRM.dbo.CALL_HISTORY" id="lock418641d00" mode="X" associatedObjectId="72057594112704512">
   <owner-list>
    <owner id="process13eeeb3468" mode="X" />
   </owner-list>
   <waiter-list>
    <waiter id="processfb3f6dc28" mode="IS" requestType="wait" />
   </waiter-list>
  </pagelock>
  <pagelock fileid="1" pageid="912927" dbid="14" subresource="FULL" objectname="CRM.dbo.CALL_HISTORY" id="lock418641d00" mode="X" associatedObjectId="72057594112704512">
   <owner-list>
    <owner id="processfb3f6dc28" mode="IS" requestType="wait" />
   </owner-list>
   <waiter-list>
    <waiter id="process11f931f468" mode="IS" requestType="wait" />
   </waiter-list>
  </pagelock>
  <pagelock fileid="1" pageid="2784554" dbid="14" subresource="FULL" objectname="CRM.dbo.CALL_HISTORY" id="lock12bc5f1f00" mode="IS" associatedObjectId="72057594112835584">
   <owner-list>
    <owner id="process11f931f468" mode="IS" />
   </owner-list>
   <waiter-list>
    <waiter id="process13eeeb3468" mode="X" requestType="wait" />
   </waiter-list>
  </pagelock>
 </resource-list>
</deadlock>

Кто недавно сдавал 70-462, подскажите по настройке среды для лаб из Microsoft Training Kit

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

Готовлюсь к 70462 по Microsoft Training Kit.

Готовлю среду для лабораторных.
В VMWare создал контроллер Active Directory DC.
Создал пользователя домена Kim_Akers.
Добавил его в группы
Domain Admins
Enterprise Admins
Schema Admin
(как указано в Training Kit)

Создал члена Acitve Directory SQL-A

На втором уроке нужно сделать следующее.
зайти на SQL-A под аккаунтом consto\Kim_Akers и запустить оснастку Сервер Менеджер.
Однако я получаю сообщение
[Window Title]
C:\Windows\system32\ServerManager.msc

[Content]
Windows cannot access the specified device, path, or file. You may not have the appropriate permissions to access the item.

[OK]

Куда копать, почему аккаунту Kim_Akres не хватает прав, он же член группы Domain Admins? Да и в Training Kit предполагается что прав должно хватать.

Если захожу под акаунтом contso\administrator все ок, прав хватает.
Причем еще забавно, что сразу после логона kim_akers автоматически запускается оснастка Сервер Менеджер. Но если закрыть то больше не запускается.

Также не запускается, например, command prompt если запускать run as administrator.

Удачи
Дмитрий

Как красиво открыть текст на клиенте?

$
0
0
День добрый!
Есть приложение, exe-файлик. Исходников нет, т.е. там программировать нет возможности. База MS SQL, в ней есть возможность что-то дописать.
Надо: когда пользователь сохраняет данные в программе, проверить эти данные на ошибки.
Вопрос: Как красиво реализовать?

Есть мысли следующие:
Проверка данных - в триггере Insert и Update. Считать данные о машине и пользователе из sys.dm_exec_connections.
Дальше поток мыслей иссяк =D
Т.е. хотелось бы услышать идеи от гуру, как красиво открыть на клиенте текст - файл или сообщение, не важно. Чтобы все было безопасно, многопользовательски и с наименьшими телодвижениями в виде открытия портов или еще чего.
В идеале хочется в триггере все проверить, сформировать текст, считать IP и логин и пульнуть на рабочую машину получившийся протокол ошибок.
Есть ли возможность, например, в коде создавать пакеты DTS и вообще нужны ли они или сие будет извращением? Может, проще запускать открытие файла с помощью xp_cmdshell и возможно ли это для определенного пользователя?
Посоветуйте, пожалуйста, нужное направление для поисков и расскажите о плюсах/минусах из своего опыта.

Жду умных мыслей :)

Как вызвать процедуру в SELECT, или в функции реализовать INSERT в таблицу?

$
0
0
Задача:

  • Программа посылает запрос в БД через SELECT (получается вызвать функцию, а процедуру не получается)
  • БД собирает данные (реализованно)
  • БД записывает данные в статическую таблицу, хотя она используется как временная (получается в процедуре, а в функции не получается)
  • Передать данные в программу для дальнейшей обработки (получается, если данные записаны в статической таблице, со временными таблицами не получается)

    Т.е. основные загвоздки,
  • или как дернуть процедуру на исполнение посредством SELECT ? Процедура без параметров
  • или как в функции добавлять записи в статическую таблицу ?

    exec sp_executesql пробовала, но пишет "Only functions and some extended stored procedures can be executed from within a function." И вообще пишут. что по каким-то политикам безопасности в функции ничего такого делать нельзя.
    Общение программы с БД закрыто и надо пользовать то что есть:((

    Может что посоветуете?
    Очень надо.
    Заранее спасибо
  • ошибка 7311 при создание linked server с Excel

    $
    0
    0
    Создаю сервер:
    exec sp_addlinkedserver @server = 'ServerXLS', @srvproduct = 'ACE 12.0', @provider = 'Microsoft.ACE.OLEDB.12.0', @datasrc = 'C:\_VenodorsDownLoad\done\price1.xlsx', @provstr = 'Excel 12.0; HDR=No'
    

    Пытаюсь получить структуру файла
    exec sp_columns_ex @table_server = 'ServerXLS' 
    

    А он мне:
    сообщение: 7399, уровень: 16, состояние: 1, процедура: sp_columns_ex, строка: 177 [строка начала пакета: 0]
    Поставщик OLE DB "Microsoft.ACE.OLEDB.12.0" для связанного сервера "ServerXLS" сообщил об ошибке. Поставщик не предоставил данных об ошибке.
    сообщение: 7311, уровень: 16, состояние: 2, процедура: sp_columns_ex, строка: 177 [строка начала пакета: 0]
    Не удалось получить набор строк схемы "DBSCHEMA_PROVIDER_TYPES" поставщика OLE DB "Microsoft.ACE.OLEDB.12.0" для связанного сервера "ServerXLS". Поставщик поддерживает интерфейс, но возвращает код ошибки при его использовании.
    


    Полазил в инете, пишут что это тогда когда SQL сервер не может получить доступ к папке TEMP. И надо запустить его под пользователем с более высокими правами, а он у меня запущен под "Локальная служба" по идеи то у нее все права есть к папке temp..

    Подскажите где не прав.

    Sql Сортировка по дате

    $
    0
    0
    помогите прописать код пожалуйста:

    Например у клиента было 5 кредитов

    ID   Credit Code  Date Disburse      Customer
    1 credit-1 2016.01.15 cusnomer_code
    2 credit-2 2016.02.17 cusnomer_code
    3 credit-3 2016.04.30 cusnomer_code
    4 credit-4 2016.04.30 cusnomer_code
    5 credit-5 2016.08.11 cusnomer_code

    нужно прописать код вычислив количество кредитов на момент выдачи. В общем например select cusnomer_code, count(credit code) from table group by cusnomer_code , код выдаст 5 но нужно , в таком порядке сколько было у предыдущего , и у предыдущего и так далее например на дату выдачи каждого кредита , внизу описал как должно показывать count_credits , заранее спасибо

    ID   Credit Code  Date Disburse      Customer         count_credits
    1 credit-1 2016.01.15 cusnomer_code 1
    2 credit-2 2016.02.17 cusnomer_code 2
    3 credit-3 2016.03.25 cusnomer_code 2
    4 credit-4 2016.04.30 cusnomer_code 4
    5 credit-5 2016.08.11 cusnomer_code 5

    Порядок полей в составном ключе

    $
    0
    0
    Легенда гласит, что поля в составной ключ нужно добавлять в порядке убывания уникальности, т.е. первым должен быть столбец с содержанием наименьшего числа повторяющихся значений, а последним, соответственно, тот, в котором значения повторяются чаще всего.
    Однако не раз замечал, что оптимизатор отказывается использовать такой индекс, предпочитая ему скан. (Чуть ранее, я задавал вопрос о несрабатывающем индексе и проблема оказалась как раз в этой плоскости). Да, все зависит от запроса - скажете вы, ибо если оптимизатор поймет, что результатом выборки будет почти вся таблица, то дешевле использовать скан. Но речь сейчас не о таком случае. Стоит создать еще один индекс, состоящий из тех же полей, но в другом порядке, как оптимизатор с радостью начинает его использовать, а если сделать третий, то оптимизатор отказывается от второго и начинает использовать третий, утверждая, что он еще дешевле. Однако порядок полей в этом индексе полностью противоречит легенде и в нем все с точностью до наоборот. Не могу сказать что так всегда, но я сталкивался не раз. В результате я стал создавать несколько индексов с разным порядком полей, смотреть, какой из них предпочитает оптимизатор и удалять остальные. Почему так происходит, в чем фишка? Зависит ли это от типов полей или их размера, скажем, char нужно ставить после int, например?

    У меня сейчас нет под рукой доказательств, но я постараюсь их предоставить, если не верите на слово.

    Восстановление баз данных "msdb" SQL Server

    $
    0
    0
    После старта агента в журнале ошибок агента появляется запись
    "Ожидается восстановление баз данных "msdb" SQL Server"
    Используется :
    Microsoft SQL Server Management Studio 12.0.5000.0
    Клиентские средства служб Microsoft Analysis Services 12.0.5000.0
    Компоненты доступа к данным (MDAC) 6.2.9200.16384
    Microsoft MSXML 3.0 4.0 6.0
    Microsoft Internet Explorer 9.10.9200.17413
    Microsoft .NET Framework 4.0.30319.34209
    Операционная система 6.2.9200
    Версия SQL 2012R2 12.0.5000.0;SP2;Standard Edition (64-bit)
    Восстановление из архива -при остановленном агенте проходит, но при его (агенте) запуске ошибка проявляется снова.
    В журнале SQL Есть строка
    Server-level event notifications can not be delivered. Either Service Broker is disabled in msdb<c/> or msdb failed to start. Event notifications in other databases could be affected as well. Bring msdb online<c/> or enable Service Broker.
    плохой перевод Уведомления о событиях уровня сервера не может быть доставлено. Либо Service Broker отключен в MSDB <с /> или MSDB не удалось запустить. Уведомления о событиях в других базах данных могут быть затронуты также. Доведите MSDB онлайн <с /> или включить Service Broker.

    Помогите MSDB привести в режим
    может я неправильно делаю RECONFIGURE этой базы?
    Подскажите скрипт.

    Помогите, разобраться в ошибке..

    $
    0
    0
    Устроился сисадмином на одну фирму 2 недели назад, ранее опыта сисадмина не имел, предыдущего сисадмина не видел, с it оброзованием на фИРМЕ НИКОГО НЕТ, кто бы мог сказать мне,что от меня нужно, скачали с интернета должностные инструкции, в которых наверное можно было обойтись одной фразой "тыжпрограммист" , и сказали , что все должно работать. Почитав на хабре обязанности, понял, первое что нужно-это делать бэкапы. Спросив у директора, он сказал, что бэкапы делались, а куда и что понятия не имеет, поискав в разделах нашел на физическом диске, куда каждый день в 7 утра они сохраняются, эта резервная база весит 1гб , а рабочая база весит 4гб , это меня насторожило (возможно, конечно она сжимается), далее решил понять откуда растут ноги, снова прошуршав интернет я нашел кто и что делает бэкапы, зайдя в msqlserver managment studio создан план обслуживания , который их и делает, но зайдя в журнал этого плана я увидел, что у него постоянно на одном и том же этапе резервирования, возникает ошибка каждый день, может ли из за этой ошибки кривая база резервироваться и что это за ошибка?



    Очистка после обслуживания на Соединение с локальным сервером
    Удалить Резервное копирование базы данных файлов
    Возраст: старше, чем 1 Недель
    код ошибки -1073548784
    Сбой выполнения запроса "EXECUTE master.dbo.xp_delete_file 0,N'',N'',N'2016..." со следующей ошибкой: "Ошибка при выполнении расширенной хранимой процедуры: недопустимый параметр". Возможные причины сбоя: проблемы с этим запросом, свойство "ResultSet" установлено неправильно, параметры установлены неправильно или соединение было установлено неправильно.

    Не освобождаются страницы при переключении секции.

    $
    0
    0
    Доброго дня.
    Ситуация следующая. Есть 3 таблицы. SrcTable - основная OLTP таблица. tmpSrcTable временная таблица для подготовки данных для архивной таблицы. ArchTable архивная таблица с кластерным колоночным индексом. Действия следующие:
    1. перекидываем порцию данных из SrcTable в tmpSrcTable.
    2. создаем секционный кластерный колоночный индекс на tmpSrcTable.
    3. переключаем секции в ArchTable.
    4. удаляем кластерный колоночный индекс на tmpSrcTable.
    В итоге наблюдаем следующую картину (sp_spaceused и ssms свойство таблицы) кол-во строк 0, data и index_size больше 0, т.е. такое поведение как при удалении из кучи, данных фактически нет (они в архиве), но страницы не помечены как освобожденные (в PFS). освобождение страниц происходит только при truncate. Вот думаю это бага или фитча?

    + скрипт распределения страниц

    SELECT au.allocation_unit_id
    ,au.type_desc
    ,au.total_pages
    ,au.used_pages
    ,au.data_pages
    ,p.index_id
    ,i.name AS [indexname]
    ,i.type_desc AS [index_type]
    ,fg.name AS [filegroup]
    ,s.name AS [schema]
    ,o.name AS [Object]
    ,o.type_desc 
    ,p.data_compression_desc
    FROM sys.system_internals_allocation_units au
    JOIN sys.partitions [p] ON [p].[partition_id] = au.[container_id]
    JOIN sys.filegroups fg ON au.filegroup_id = fg.data_space_id
    JOIN sys.objects o ON o.object_id = p.object_id
    JOIN sys.schemas s ON s.schema_id = o.schema_id
    JOIN sys.indexes i ON i.object_id = o.object_id AND i.index_id = p.index_id
    WHERE o.name = 'tmpSrcTable'
    ORDER BY total_pages DESC;
    
    EXEC sp_spaceused 'dbo.tmpSrcTable';
    



    Подготовка данных.
    CREATE PARTITION FUNCTION fn_Dt2 (DATETIME2) AS RANGE RIGHT FOR VALUES('20160811','20160812','20160813')
    GO
    CREATE PARTITION SCHEME sch_Dt2 AS PARTITION fn_Dt2 ALL TO ([PRIMARY]);
    GO
    CREATE PARTITION FUNCTION fn_tiny (TINYINT) AS RANGE RIGHT FOR VALUES(0,1,2,3,4,5,6,7,8,9)
    GO
    CREATE PARTITION SCHEME sch_tiny AS PARTITION fn_tiny ALL TO ([PRIMARY]);
    GO
    
    CREATE TABLE dbo.SrcTable (Id INT NOT NULL,FName VARCHAR(20) NOT NULL,InsDate DATETIME2,PartNo TINYINT NOT NULL) ON sch_tiny(PartNo)
    GO
    CREATE CLUSTERED INDEX ixSrcTable ON dbo.SrcTable(InsDate,PartNo) ON sch_tiny(PartNo)
    GO
    
    CREATE TABLE dbo.tmpSrcTable (Id INT NOT NULL,FName VARCHAR(20) NOT NULL,InsDate DATETIME2,PartNo TINYINT NOT null) ON sch_Dt2(InsDate) 
    GO
    
    CREATE TABLE dbo.ArchTable (Id INT NOT NULL,FName VARCHAR(20) NOT NULL,InsDate DATETIME2,PartNo TINYINT NOT NULL) ON sch_Dt2(InsDate)
    GO
    
    CREATE CLUSTERED COLUMNSTORE INDEX ixArchTable ON dbo.ArchTable
    GO
    
    INSERT INTO dbo.SrcTable ( Id, FName, InsDate, PartNo ) VALUES 
    (1,'AAAAAA','20160811 13:10',1%10),
    (2,'AAAAAA','20160811 15:15',2%10),
    (3,'AAAAAA','20160812 09:17',3%10),
    (4,'AAAAAA','20160812 13:10',4%10),
    (5,'AAAAAA','20160813 13:20',5%10),
    (6,'AAAAAA','20160813 15:10',6%10)
    GO
    


    Проверяем tmpSrcTable, сейчас все по 0-м.
    allocation_unit_id	type_desc	total_pages	used_pages	data_pages	index_id	indexname	index_type	filegroup	schema	Object	type_desc	data_compression_desc
    72057594047234048 IN_ROW_DATA 0 0 0 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE
    72057594047299584 IN_ROW_DATA 0 0 0 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE
    72057594047365120 IN_ROW_DATA 0 0 0 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE
    72057594047430656 IN_ROW_DATA 0 0 0 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE

    name rows reserved data index_size unused
    tmpSrcTable 0 0 KB 0 KB 0 KB 0 KB

    далее переносим данные из таблицы.
    DELETE d
    OUTPUT Deleted.* INTO dbo.tmpSrcTable
    FROM dbo.SrcTable d
    WHERE d.InsDate < '20160812'
    


    при этом в логе видно, что в PFS страницах объекта SrcTable идет обновление, что логично, т.к. есть кластерный индекс.

    Operation Context AllocUnitName
    LOP_INSERT_ROWS LCX_HEAP dbo.tmpSrcTable
    LOP_SET_FREE_SPACE LCX_PFS Unknown Alloc Unit
    LOP_DELETE_ROWS LCX_MARK_AS_GHOST dbo.SrcTable.ixSrcTable
    LOP_SET_BITS LCX_PFS dbo.SrcTable.ixSrcTable
    LOP_INSERT_ROWS LCX_HEAP dbo.tmpSrcTable
    LOP_DELETE_ROWS LCX_MARK_AS_GHOST dbo.SrcTable.ixSrcTable
    LOP_SET_BITS LCX_PFS dbo.SrcTable.ixSrcTable

    проверяем распределение страниц tmpSrcTable данные есть.
    allocation_unit_id	type_desc	total_pages	used_pages	data_pages	index_id	indexname	index_type	filegroup	schema	Object	type_desc	data_compression_desc
    72057594047299584 IN_ROW_DATA 2 2 1 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE
    72057594047365120 IN_ROW_DATA 0 0 0 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE
    72057594047430656 IN_ROW_DATA 0 0 0 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE
    72057594047234048 IN_ROW_DATA 0 0 0 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE

    name rows reserved data index_size unused
    tmpSrcTable 2 16 KB 8 KB 8 KB 0 KB

    Строим кластерный колоночный индекс
    CREATE CLUSTERED COLUMNSTORE INDEX ixtmpSrcTable ON dbo.tmpSrcTable ON sch_Dt2(InsDate)
    GO
    


    проверяем распределение страниц, добавились LOB_DATA в них же данные.
    allocation_unit_id	type_desc	total_pages	used_pages	data_pages	index_id	indexname	index_type	filegroup	schema	Object	type_desc	data_compression_desc
    72057594048806912 LOB_DATA 10 3 0 1 ixtmpSrcTable CLUSTERED COLUMNSTORE PRIMARY dbo tmpSrcTable USER_TABLE COLUMNSTORE
    72057594048610304 LOB_DATA 2 2 0 1 ixtmpSrcTable CLUSTERED COLUMNSTORE PRIMARY dbo tmpSrcTable USER_TABLE COLUMNSTORE
    72057594049003520 LOB_DATA 2 2 0 1 ixtmpSrcTable CLUSTERED COLUMNSTORE PRIMARY dbo tmpSrcTable USER_TABLE COLUMNSTORE
    72057594049200128 LOB_DATA 2 2 0 1 ixtmpSrcTable CLUSTERED COLUMNSTORE PRIMARY dbo tmpSrcTable USER_TABLE COLUMNSTORE
    72057594048544768 IN_ROW_DATA 0 0 0 1 ixtmpSrcTable CLUSTERED COLUMNSTORE PRIMARY dbo tmpSrcTable USER_TABLE COLUMNSTORE
    72057594049134592 IN_ROW_DATA 0 0 0 1 ixtmpSrcTable CLUSTERED COLUMNSTORE PRIMARY dbo tmpSrcTable USER_TABLE COLUMNSTORE
    72057594048741376 IN_ROW_DATA 0 0 0 1 ixtmpSrcTable CLUSTERED COLUMNSTORE PRIMARY dbo tmpSrcTable USER_TABLE COLUMNSTORE
    72057594048937984 IN_ROW_DATA 0 0 0 1 ixtmpSrcTable CLUSTERED COLUMNSTORE PRIMARY dbo tmpSrcTable USER_TABLE COLUMNSTORE

    name rows reserved data index_size unused
    tmpSrcTable 2 128 KB 72 KB 0 KB 56 KB

    переключаем партицию и удаляем индекс
    ALTER TABLE dbo.tmpSrcTable SWITCH PARTITION 2 TO dbo.ArchTable PARTITION 2
    GO
    drop INDEX ixtmpSrcTable ON dbo.tmpSrcTable 
    GO
    

    Проверяем tmpSrcTable, остались только IN_ROW_DATA, и страниц стало больше (16 против 36). С чего бы?
    allocation_unit_id	type_desc	total_pages	used_pages	data_pages	index_id	indexname	index_type	filegroup	schema	Object	type_desc	data_compression_desc
    72057594049331200 IN_ROW_DATA 9 2 1 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE
    72057594049396736 IN_ROW_DATA 9 2 1 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE
    72057594049462272 IN_ROW_DATA 9 2 1 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE
    72057594049527808 IN_ROW_DATA 9 2 1 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE
    name rows reserved data index_size unused
    tmpSrcTable 0 288 KB 32 KB 32 KB 224 KB

    при удалении кластерного колоночного индекса в логе только такие записи.
    Operation	Context	AllocUnitName
    LOP_EXPUNGE_ROWS LCX_CLUSTERED sys.sysrscols.clst
    LOP_SET_BITS LCX_PFS sys.sysrscols.clst

    далее, что бы освободить страницы от tmpSrcTable можно только через truncate.

    Востановить удаленные функции с CDC

    $
    0
    0
    Активизировал слежение за таблицой HoursTracked дал ей caption 'cdc_HoursTracked'.
    После удалил несколько функций 'cdc.fn_cdc_get_all_changes_ ... ' перестала работать cdc.fn_cdc_get_all_changes_cdc_HoursTracked Снял слежение и добавил по новой, функции не создались. Как надо правильно активизировать слежение для пресоздания функций?

    Update cte какая блокировка наложится на базовую таблицу?

    $
    0
    0
    Какая блокировка будет наложена на таблицу T при таком update:
    UPDATE  V 
    SET a =5
    	 FROM   (
    		               SELECT  TOP 10 * FROM T
    ORDER BY 2,1) V
    


    из вариантов:
    1. UPDATE
    2. SELECT а ЗАТЕМ UPDATE

    Соответственно если сначала SELECT то два параллельных запроса могут получить одни данные, а запдейтить сможет только один. Либо к таблице будет только одно обращение на updfate?

    alter table не видит солонку

    $
    0
    0
    есть процедура, в которой есть строка

    exec(@str)


    на момент выполнения строка равна
    @str='ALTER TABLE [Business].[EcoClassifier_h] ALTER COLUMN [WHost] [nvarchar] (256) COLLATE SQL_Latin1_General_CP1251_CI_AS NOT NULL'

    получаем ошибку
    16:04:34: Ошибка ALTER TABLE ALTER COLUMN failed because column 'WHost' does not exist in table 'EcoClassifier_h'.

    однако колонка в таблице есть, имеет тип sysname и
    ALTER TABLE [Business].[EcoClassifier_h] ALTER COLUMN [WHost] [nvarchar] (256) COLLATE SQL_Latin1_General_CP1251_CI_AS NOT NULL
    в командном окне выполняется без каких либо ошибок

    вопрос простой - что это за хрень

    Помогите с SQL-запросом

    $
    0
    0
    Доброго времени суток!

    Есть три таблицы CLIENTS, DEALS, PAYMENTS. В CLIENTS хранятся данные о клиентах, в DEALS хранятся данные о сделках, а в PAYMENTS хранятся оплаты по сделкам. Оплаты проходят ни полными суммами, а частями в течение некоторого времени. Мне требуется узнать, по каким сделкам прошли оплаты после даты сделки, и вывести или полную сумму сделки, если сумма оплат превышает сумму сделок либо равна ей, или же частично, если сумма оплат меньше суммы сделки.

    Я сделал вот такой запрос, вроде бы всё правильно.

    SELECT CLIENTS.NAME, DEALS.DATA, DEALS.SUMMA,
    SUMPLAT =
    CASE
    WHEN SUM(ISNULL(PAYMENTS.SUMMA,0)) >= DEALS.SUMMA
    THEN DEALS.SUMMA
    ELSE PAYMENTS.SUMMA
    END
    FROM CLIENTS
    JOIN DEALS ON DEALS.ROW_ID = CLIENTS.ROW_ID
    LEFT JOIN PAYMENTS ON PAYMENTS.ROW_ID = CLIENTS.ROW_ID AND PAYMENTS.DATA >= DEALS.DATA
    GROUP BY CLIENTS.NAME, DEALS.DATA, DEALS.SUMMA
    ORDER BY CLIENTS.NAME
    

    Но есть один нюанс, есть клиенты, с которыми провели несколько сделок и нужно узнать, какие сделки уже закрыты, а какие ещё нет.
    Пример:
    Клиент=Иванов И.И. / Сумма сделки=10000 / Дата сделки = 01.05.2014 / Сумма оплат с 01.05.2014 по текущий момент = 5000
    Клиент=Иванов И.И. / Сумма сделки= 7000 / Дата сделки = 01.02.2015 / Сумма оплат с 01.02.2015 по текущий момент = 3500

    Вот здесь-то и кроется ошибка. В 5000 сидят и 3000. Получается, что на самом деле первая сделка закрыта на 5000, а вторая вообще на 0! Но из выборки следует, что первая на 5000 и вторая на 3000.

    Подскажите, как нужно изменить запрос, чтобы избежать этой ошибки?!

    Выборка из XML поля

    $
    0
    0
    Здравствуйте, уважаемые. Не могу доделать запрос. Беда в том, что он включает работу с XML, которые я не очень хорошо понимаю.
    Имеется таблица сотрудников, в которой в XML поле хранятся руководители сотрудника. Руководтели могут быть нескольких типов: непосредственный, функциональный, по обучению и т.д. Типы хранятся в отдельной таблице. Связка таблиц происходит по XML полю.
    Необходимо отобрать тех сотрудников, у которых указан руководитель. Если руководителей несколько, предпочтительно отобрать функционального. Будь это обычная таблица -- проблем бы не было, а так -- голову свернул.
    Прилагаю пример:

    DECLARE @users TABLE (
    	[id] bigint, 
    	[name] varchar(100), 
    	[data] xml
    )
    
    DECLARE @types TABLE (
    	[id] bigint, 
    	[code] varchar(100), 
    	[name] varchar(100)
    )
    
    INSERT INTO @users VALUES
    (1, 'Иванов Иван', 
    '<func_managers>
      <func_manager>
        <person_id>4</person_id>
        <boss_type_id>2</boss_type_id>
      </func_manager>
      <func_manager>
        <person_id>5</person_id>
        <boss_type_id>1</boss_type_id>
      </func_manager>
    </func_managers>'), 
    (2, 'Петров Петр', 
    '<func_managers>
      <func_manager>
        <person_id>5</person_id>
        <boss_type_id>1</boss_type_id>
      </func_manager>
    </func_managers>'),
    (3, 'Сидоров Сидор', ''),
    (4, 'Сергеев Сергей', ''),
    (5, 'Дмитриев Дмитрий', '')
    
    INSERT INTO @types VALUES 
    (1, 'main', 'Непосредственный'),
    (2, 'func', 'Функциональный')
    
    SELECT 
    	u.name AS user_name
    	,b.name AS boss_name
    	,t.name AS boss_type
    FROM @users AS u
    CROSS APPLY u.data.nodes('func_managers/func_manager') bs(l)
    JOIN @users AS b ON b.id = bs.l.query('data(person_id)').value('.', 'bigint')
    JOIN @types AS t ON t.id = bs.l.query('data(boss_type_id)').value('.', 'bigint')
    

    Как получить блокирующие процессы и количество блокируемых ими процессов?

    $
    0
    0
    Как получить блокирующие процессы и количество блокируемых ими процессов?

    Миграция из MySQL в MSSQL

    $
    0
    0
    Всем привет!

    Пытаюсь осуществить миграцию данных из MySQL в MS SQL. Инструмент использую самый распространенный SQL Server Migration Assistant for MySQL v 5.3.0.

    Во время переноса формата таблиц, возникает ошибка "The following SQL clause was ignored during conversion: COLLATE = utf8_unicode_ci", таблицы, разумеется, создаются, но данные мигрируют не в том формате. В итоге вместо кирилицы в полях только вопросительные знаки.

    Кодировку MySQL поменять нельзя т.к. к этой СУБД тянется CRM и администрируем его не мы (что-то пойдет не так - неделю будут править). MS SQL мой, поэтому можно менять все, что заблагорассудится.

    Это первый опыт миграции т.к. я не программист, а финансовый аналитик и работал всегда с уже собранными БД (с MySQL вообще впервые столкнулся), поэтому прошу - не кидайте тапками и не ругайте сильно, посоветуйте что делать.

    Спасибо.

    почему не возникает блокировка?

    $
    0
    0
    Делаю в одном соединении запрос:
    CREATE TABLE table1 (ID INT PRIMARY KEY CLUSTERED)
    INSERT INTO table1 VALUES (1),(5),(7),(900)
    
    SET TRAN ISOLATION LEVEL READ COMMITTED 
    BEGIN TRAN
    SELECT * FROM  table1 WITH(XLOCK,HOLDLOCK) WHERE ID between 3 and 90  
    
    exec sp_lock 
    

    и получаю следующие блокировки:

    в другом соединении делаю:
    SET TRAN ISOLATION LEVEL READ COMMITTED
    SELECT * FROM table1 
    

    и получаю содержимой всей таблицы с полным игнорированием висящих блокировок(

    С чем может быть это связано?

    Помогите с case в колонках запроса основанного на подзапросе

    $
    0
    0
    select  case us_price when 1 then (select source_price  where us_price = 1 and source_price is not NULL) end
    
    	
    from (
    select TOP 2 MIN(source_price) as source_price , us_price, target_price   from (
    select  15 as source_price,
    		0 as us_price ,	
    		NULL as target_price,	
    		100 as source_quantity,		
    		40 as targer_quantity				
    UNION 
    select  25 ,		0,	NULL,	10,	40	
    UNION  
    select  35 ,		0,	NULL,	1,		40	
    UNION
    select  0.15 ,		1,	NULL,	100,	40	
    UNION 
    select  0.28 ,	1,	NULL,	10,	40	
    UNION  
    select  0.45 ,	1,	NULL,	1,		40	
    ) a
    group by us_price, target_price
    ) b
    

    Есть сложный запрос который будет использоваться для UPDATE
    Проблема вот в чём. Если убрать верхний подзапрос то есть сделать так
    select TOP 2 MIN(source_price) as source_price , us_price, target_price   from (
    select  15 as source_price,
    		0 as us_price ,	
    		NULL as target_price,	
    		100 as source_quantity,		
    		40 as targer_quantity				
    UNION 
    select  25 ,		0,	NULL,	10,	40	
    UNION  
    select  35 ,		0,	NULL,	1,		40	
    UNION
    select  0.15 ,		1,	NULL,	100,	40	
    UNION 
    select  0.28 ,	1,	NULL,	10,	40	
    UNION  
    select  0.45 ,	1,	NULL,	1,		40	
    ) a
    group by us_price, target_price
    

    то вывод будет такой
    source_price us_price target_price
    15.00 0 NULL
    0.15 1 NULL

    И теперь я хочу из этого вывода select where в case
    То есть я думал если я напишу SELECT b.source_price where us_price = 0
    то вывод будет
    source_price
    15.00


    Но вместо этого я получаю
    NULL
    0.15

    Я просидел всю ночь из-за этой маленькой проблемы и не смог понять почему так происходит.

    В конце концов я бы хотел бы видеть что-то вроде этого
    UPDATE tblSalesProducts 
    	SET Amount = case us_price  when 1 then (select source_price where us_price = 1 and source_price is not NULL) end,
    		SalePrice = case us_price  when 0 then  (select source_price where us_price = 0 and b.target_price IS NULL) end
    from (
    select TOP 2 MIN(source_price) as source_price , us_price, target_price   from (
    select  15 as source_price,
    		0 as us_price ,	
    		NULL as target_price,	
    		100 as source_quantity,		
    		40 as targer_quantity				
    UNION 
    select  25 ,		0,	NULL,	10,	40	
    UNION  
    select  35 ,		0,	NULL,	1,		40	
    UNION
    select  0.15 ,		1,	NULL,	100,	40	
    UNION 
    select  0.28 ,	1,	NULL,	10,	40	
    UNION  
    select  0.45 ,	1,	NULL,	1,		40	
    ) a
    group by us_price, target_price
    ) b
    

    но из-за этой проблемы я получаю на выход две строки вместо одной и в SET идёт не то значение

    Сетевой протокол при регистрации сервера и уже зарегистрированного сервера

    $
    0
    0
    Не изменяется сетевой протокол сервера с по умолчанию на TCP/IP, сначала ставлю TCP/IP потом жму сохранить и это окошко подвисает и вот такая ошибка.
    Viewing all 7251 articles
    Browse latest View live