MS SQL Server

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

Поиск поиск текста в хранимой процедуре (хранимым процедурам), данный код работает под MS SQL 2000:

select t2.name, t1.text
  from syscomments as t1
  inner join sysobjects as t2 on t1.id = t2.id
  where t1.text like '%searchText%'
Добавлено: 13 января 2014 | Читать далее...
В SQL Server 2008 появилась новая плюшка позволяющая централизовано рулить удаленными серверами.
Добавлено: 01 марта 2013 | Читать далее...
Для того чтобы отправить почту с помощью компонента Database Mail в SQL Server. Нужно выполнить 3 основных шага.

  1. Создание профиля учетной записи
  2. Настройка SQL Server
  3. Отправка тестового сообщения по электронной почте
Шаг 1) Создание профиля учетной записи:

Что бы создать профиль нужно запустить мастер "Configure Database Mail", который доступен из контекстного меню на объекте "Database Mail" (Management - Database Mail).

Изменено: 31 августа 2011 | Добавлено: 15 июля 2011 | Читать далее...
Данный функционал доступен в версии SQL Server 2005 и выше, независимо от редакции (Express, Standard и т.д.), построенный на системном представлении sys.dm_exec_query_stats:

set transaction isolation level read uncommitted
select 
	top 100
	creation_time,
	last_execution_time,
	execution_count,
	total_worker_time/1000 as CPU,
	convert(money, (total_worker_time))/(execution_count*1000)as [AvgCPUTime],
	qs.total_elapsed_time/1000 as TotDuration,
	convert(money, (qs.total_elapsed_time))/(execution_count*1000)as [AvgDur],
	total_logical_reads as [Reads],
	total_logical_writes as [Writes],
	total_logical_reads+total_logical_writes as [AggIO],
	convert(money, (total_logical_reads+total_logical_writes)/(execution_count + 0.0))as [AvgIO],
	case 
		when sql_handle IS NULL then ' '
		else(substring(st.text,(qs.statement_start_offset+2)/2,(
			case
				when qs.statement_end_offset =-1 then len(convert(nvarchar(MAX),st.text))*2      
				else qs.statement_end_offset    
			end - qs.statement_start_offset)/2  ))
	end as query_text,
	db_name(st.dbid)as database_name,
	object_schema_name(st.objectid, st.dbid)+'.'+object_name(st.objectid, st.dbid) as object_name
from sys.dm_exec_query_stats  qs
cross apply sys.dm_exec_sql_text(sql_handle) st
where total_logical_reads > 0
order by AvgDur desc
Изменено: 09 сентября 2011 | Добавлено: 09 июня 2011 | Читать далее...
Однажды работая с SQL сервером наткнулся на проблемы работы пользовательской БД. Пытаясь выяснить проблему попробовал подключиться через SQL Server Management Studio, но место подключения получил ошибку: Невозможно открыть пользовательскую базу данных по умолчанию. Связано это с тем что в настройках профиля пользователя через которого пытался войти в SQL Server Management Studio по умолчанию стояла как раз эта пользовательская база. Для решения проблемы нужно сменить пользовательскую БД на системную БД master. Для это нужно запустить cmd.exe  и в ней выполнить:

c:\> sqlcmd -S SQLSERVER -d master

1> alter login SKYNET with default_database = master

2> go

3> exit
Соотвественно SQLSERVER имя SQL сервера, SKYNET логин входа в SQL Server Management Studio.
Добавлено: 29 апреля 2011 | Читать далее...
Когда запись удаляется, в файле БД высвобождается место. Когда вставляется новая запись, это может привести к расщеплению страниц, что приводит к появлению пустого пространства на страницах данных. Когда данный обновляются, это может привести к изменению размера записи и к возникновению двух ранее упоминавшихся случаев. Все это приводит к фрагментации. В SQL Server рассматриваются два типа фрагментации: внутренняя и внешняя.

  • Внутренняя подразумевает пустоты внутри страницы
  • Внешняя – непоследовательность связей страниц
Если страницы не полностью заполнены данными, это приводит к дополнительным операциям I/O и переиспользованью оперативной памяти. Помните что страницы в оперативной памяти есть зеркальное отражение страниц на диске.

В идеале страницы должны быть подлинкованы слева направо в порядке хранения данных. Вследствие расщепления страниц этот порядок может быть нарушен. Это приводит как к неполному заполнению страниц, так и к увеличению операций I/O вследствие непоследовательного положения цепочек страниц на диске – это вызывает дополнительные перемещения головок с цилиндра на цилиндр диска. А это одна из наиболее медленных дисковых операций.

Команда DBCC SHOWCONTIG помогает определить как внутреннюю так и внешнюю фрагментацию.
Добавлено: 21 апреля 2011 | Читать далее...
Индексы не выбираются на основании анализа распределенной статистики. В SQL Server 2000 статистика хранится в поле данных для хранения имиджей. То есть – растет пропорционально размеру индекса, это позволяет не терять точность при увеличении размера индексов.

Что бы понять что из себя представляет статистика, рассмотрим следующий пример. Возьмем таблицу Orders из базы данных Northwind. Если мы выполним следующий запрос:

SELECT TOP 24 OrderID, convert(char(11), OrderDate)
FROM Orders
ORDER BY OrderDate
Изменено: 09 сентября 2011 | Добавлено: 21 апреля 2011 | Читать далее...
Настройка сервера:
  • Информация о сервере

    select @@version
  • Показывает расширенные настройки конфигурирования

    sp_configure 'show advanced options' 1
    reconfigure
    
  • Просмотр доступных настроек

    sp_configure
  • Применить изменения конфигурации если не требуется перезапуск сервера

    sp_configure <настройка> <допустимое значение настройки>
    reconfigure
Изменено: 04 февраля 2015 | Добавлено: 20 апреля 2011 | Читать далее...
При попытке отключения "publishing and distribution" выходит ошибка.

Error SQL Server писал(а):
Cannot execut as the database principal because the principal "dbo" does not exist, this type of pricipal cannot be impersonated, or you do not have permission.
Change database conext to 'mydb'(Sql sErver error: 15517)

Проблемой такой ошибки может быть потеря связки схемы dbo на логин sa. Для этого на всех не системных базах данных нужно выполнить:

exec sp_changedbowner 'sa'
Изменено: 30 июня 2011 | Добавлено: 20 апреля 2011 | Читать далее...
Для того, чтобы сделать выборку из таблицы, расположенной на другом сервере или получить результат выполнения расположенной там функции или хранимой процедуры, в Microsoft SQL Server предусмотрен механизм распределенных запросов. Для использования этого механизма целевые сервера должны быть предварительно связаны.Настраивают связанный сервер с помощью SQL Server Management Studio или системной хранимой процедуры sp_addlinkedserver.

Для связывания на сервере запустите SQL Server Management Studio, раскройте узел Server Objects. В контекстном меню узла Linked Servers выберите пункт New Linked Server. На вкладке General нужно ввести имя связываемого сервера и выбрать тип сервера SQL Server. На вкладке Security. Выберите переключатель "Be made using the security context" и введите логин и пароль для доступа к удаленному серверу.

После этого вы сможете выполнять запросы к таблицам удаленного сервера используя четырехкомпонентное имя:

имя_связанного_сервера.база_данных.схема.имя_объекта
Добавлено: 20 апреля 2011 | Читать далее...
Иногда возникает необходимость перенесения базы данных tempdb на другой жесткий диск для увеличения производительности SQL сервера. Для этого нужно выполнить SQL пакет:

use master
alter database tempdb
modify file(
name = tempdev,
filename = N'<путь к новому месту хранения>\tempdb.mdf')

go

alter database tempdb
modify file(
name = templog,
filename = N'<путь к новому месту хранения>\templog.ldf')
Затем нужно перезапустить MS SQL Server. При перезапуске сервер баз данных создаст базу tempdb в новом месте, а старые файлы можно удалить вручную.
Добавлено: 20 апреля 2011 | Читать далее...