Скрытые особенности SQL Server

Каковы некоторые скрытые функции SQL Server?

Например, недокументированные системные хранимые процедуры, трюки для выполнения действий, которые очень полезны, но недостаточно документированы?


Ответы

Спасибо всем за отличные ответы!

Сохраненные процедуры

  • sp_msforeachtable: Запускает команду с '?' заменяется на каждое имя таблицы (v6.5 и выше)
  • sp_msforeachdb: Запускает команду с '?' заменяется каждым именем базы данных (v7 и выше).
  • sp_who2:, как и sp_who, но с большим количеством информации для блоков устранения неполадок (v7 и выше).
  • sp_helptext: Если вам нужен код хранимой процедуры, просмотр и UDF
  • sp_tables: возвращает список всех таблиц и представлений базы данных в области видимости.
  • sp_stored_procedures: возвращает список всех хранимых процедур
  • xp_sscanf: Считывает данные из строки в области аргументов, заданные каждым аргументом формата.
  • xp_fixeddrives:. Найдите фиксированный накопитель с наибольшим свободным пространством.
  • sp_help: Если вы хотите знать структуру таблицы, индексы и ограничения таблицы. Также просмотры и UDF. Ярлык: Alt + F1

Отрывки

  • Возвращаемые строки в случайном порядке
  • Все объекты пользователя базы данных по дате последнего изменения
  • Только дата возврата
  • Найти записи, дата которых находится где-то внутри текущей недели.
  • Найти записи, которые произошли на прошлой неделе.
  • Возвращает дату начала текущей недели.
  • Возвращает дату начала прошлой недели.
  • См. текст процедуры, развернутой на сервере
  • Отключить все подключения к базе данных
  • Контрольная сумма таблицы
  • Контрольная сумма строки
  • Отбросить все процедуры в базе данных
  • После восстановления повторно перепишите идентификаторы входа в систему.
  • Вызов хранимых процедур из инструкции INSERT
  • Поиск процедур по ключевым словам
  • Отбросить все процедуры в базе данных
  • Запросить журнал транзакций для базы данных программно.

Функции

  • HashBytes()
  • EncryptByKey
  • Команда PIVOT

Разное

  • Дополнительные параметры подключения
  • TableDiff.exe
  • Триггеры для событий входа в систему (новые в пакете обновления 2)
  • Повышение производительности с помощью констант-вычисленных столбцов (pcc).
  • Настройка DEFAULT_SCHEMA в sys.database_principles
  • Принудительная параметризация
  • Формат хранения Vardecimal
  • Вычисление наиболее популярных запросов в секундах
  • Масштабируемые общие базы данных
  • Функция фильтра таблицы/хранимой процедуры в SQL Management Studio
  • Флаги трассировки
  • Число после GO повторяет пакет
  • Безопасность с использованием схем
  • Шифрование с использованием встроенных функций шифрования, представлений и базовых таблиц с триггерами

Ответ 1

В Management Studio вы можете поместить номер после маркера GO конца пакета, чтобы вызвать периодичность повторения этого количества:

PRINT 'X'
GO 10

Будет печатать 'X' 10 раз. Это может спасти вас от утомительной копии/вставки при повторном использовании.

Ответ 2

Многие разработчики SQL Server все еще не знают о разделе OUTPUT (SQL Server 2005 и новее) в инструкции DELETE, INSERT и UPDATE.

Очень полезно знать, какие строки были INSERTED, UPDATEd или DELETEd, а предложение OUTPUT позволяет сделать это очень легко - он позволяет получить доступ к "виртуальным" таблицам с именем inserted и deleted ( как в триггерах):

DELETE FROM (table)
OUTPUT deleted.ID, deleted.Description
WHERE (condition)

Если вы вставляете значения в таблицу с полем первичного ключа INT IDENTITY, с предложением OUTPUT вы можете сразу получить вставленный новый идентификатор:

INSERT INTO MyTable(Field1, Field2)
OUTPUT inserted.ID
VALUES (Value1, Value2)

И если вы обновляете, может быть чрезвычайно полезно узнать, что изменилось - в этом случае inserted представляет новые значения (после UPDATE), а deleted ссылается на старые значения перед UPDATE:

UPDATE (table)
SET field1 = value1, field2 = value2
OUTPUT inserted.ID, deleted.field1, inserted.field1
WHERE (condition)

Если много информации будет возвращено, вывод OUTPUT также может быть перенаправлен на временную таблицу или переменную таблицы (OUTPUT INTO @myInfoTable).

Очень полезно - и очень мало известно!

Марк

Ответ 3

sp_msforeachtable: запускает команду с '?' заменяется на каждое имя таблицы. например.

exec sp_msforeachtable "dbcc dbreindex('?')"

Вы можете выпустить до трех команд для каждой таблицы

exec sp_msforeachtable
    @Command1 = 'print ''reindexing table ?''',
    @Command2 = 'dbcc dbreindex(''?'')',
    @Command3 = 'select count (*) [?] from ?'

Кроме того, sp_MSforeachdb

Ответ 4

Дополнительные параметры подключения:

MultipleActiveResultSets = истина;

Это приводит к тому, что ADO.Net 2.0 и выше считывают несколько наборов результатов только для чтения, только для чтения в одном соединении с базой данных, что может повысить производительность, если вы много читаете. Вы можете включить его, даже если вы выполняете смешанные типы запросов.

Имя приложения = MyProgramName

Теперь, когда вы хотите увидеть список активных соединений, запросив таблицу sysprocesses, ваше имя программы появится в столбце имени_программы вместо ".Net SqlClient Data Provider"

Ответ 5

TableDiff.exe

  • Инструмент "Разница таблиц" позволяет обнаруживать и согласовывать различия между исходной и целевой таблицей или представлением. Утилита Tablediff может сообщать о различиях в схеме и данных. Наиболее популярной особенностью tablediff является то, что он может генерировать script, который вы можете запустить в месте назначения, которое будет согласовывать различия между таблицами.

Ссылка

Ответ 6

Менее известный метод TSQL для возврата строк в случайном порядке:

-- Return rows in a random order
SELECT 
    SomeColumn 
FROM 
    SomeTable
ORDER BY 
    CHECKSUM(NEWID())

Ответ 7

В Management Studio вы можете быстро получить список столбцов таблицы с разделителями-запятыми для таблицы:

  • В Обозревателе объектов разверните узлы под данной таблицей (так что вы увидите папки для столбцов, ключей, ограничений, триггеров и т.д.).
  • Укажите папку "Столбцы" и перетащите ее в запрос.

Это удобно, если вы не хотите использовать отвратительный формат, возвращенный щелчком правой кнопкой мыши по таблице и выбрав Script Table As..., а затем Insert To... Этот трюк работает с другими папками в что он предоставит вам список имен с запятой, содержащийся в папке.

Ответ 8

Конструкторы строк

Вы можете вставить несколько строк данных с помощью одного оператора insert.

INSERT INTO Colors (id, Color)
VALUES (1, 'Red'),
       (2, 'Blue'),
       (3, 'Green'),
       (4, 'Yellow')

Ответ 9

HashBytes(), чтобы вернуть хеш MD2, MD4, MD5, SHA или SHA1.

Ответ 10

Если вы хотите знать структуру таблицы, индексы и ограничения:

sp_help 'TableName'

Ответ 11

Вычисление наиболее популярных запросов

  • С помощью sys.dm_exec_query_stats вы можете найти множество комбинаций анализов запросов по одному запросу.

Ссылка с commnad

select * from sys.dm_exec_query_stats 
order by execution_count desc

Ответ 13

полезно при восстановлении базы данных для целей тестирования или что-то еще. Правильно отображает идентификатор входа:

EXEC sp_change_users_login 'Auto_Fix', 'Mary', NULL, 'B3r12-36'

Ответ 14

Я знаю, что он не совсем скрыт, но не так много людей знают о команде PIVOT. Мне удалось изменить хранимую процедуру, в которой использовались курсоры, и потребовалось 2 минуты, чтобы выполнить быстрый 6-секундный фрагмент кода, который был на одну десятую числа строк!

Ответ 15

EXCEPT и INTERSECT

Вместо того, чтобы писать сложные соединения и подзапросы, эти два ключевых слова являются гораздо более элегантным сокращенным и читаемым способом выражения вашего намерения запроса при сравнении двух результатов запроса. Новые версии SQL Server 2005 сильно дополняют UNION, который уже существует на языке TSQL в течение многих лет.

Понятия EXCEPT, INTERSECT и UNION являются фундаментальными в теории множеств, которые служат основой и основой реляционного моделирования, используемого всеми современными СУБД. Теперь результаты типа диаграммы Венна могут быть более интуитивно и довольно легко сгенерированы с использованием TSQL.

Ответ 16

Отключите все подключения к базе данных:

Use Master
Go

Declare @dbname sysname

Set @dbname = 'name of database you want to drop connections from'

Declare @spid int
Select @spid = min(spid) from master.dbo.sysprocesses
where dbid = db_id(@dbname)
While @spid Is Not Null
Begin
        Execute ('Kill ' + @spid)
        Select @spid = min(spid) from master.dbo.sysprocesses
        where dbid = db_id(@dbname) and spid > @spid
End

Ответ 17

Контрольная сумма таблицы

Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK)

Контрольная сумма строки

Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK) Where Column = Value

Ответ 18

Я не уверен, что это скрытая функция или нет, но я наткнулся на это и нашел, что это полезно при многих случаях. Вы можете контактировать набор полей в одном выражении select, вместо того, чтобы использовать курсор и циклически выполнять инструкцию select.

Пример:

DECLARE @nvcConcatonated nvarchar(max)
SET @nvcConcatonated = ''

SELECT @nvcConcatonated = @nvcConcatonated + C.CompanyName + ', '
FROM tblCompany C
WHERE C.CompanyID IN (1,2,3)

SELECT @nvcConcatonated

Результаты:

Acme, Microsoft, Apple,

Ответ 19

Если вам нужен код хранимой процедуры, вы можете:

sp_helptext 'ProcedureName'

(не уверен, что это скрытая функция, но я использую ее все время)

Ответ 20

Трюк с хранимой процедурой заключается в том, что вы можете вызывать их из инструкции INSERT. Я нашел это очень полезным, когда работал над базой данных SQL Server.

CREATE TABLE #toto (v1 int, v2 int, v3 char(4), status char(6))
INSERT #toto (v1, v2, v3, status) EXEC dbo.sp_fulubulu(sp_param1)
SELECT * FROM #toto
DROP TABLE #toto

Ответ 21

В SQL Server 2005/2008 для отображения номеров строк в результате запроса SELECT:

SELECT ( ROW_NUMBER() OVER (ORDER BY OrderId) ) AS RowNumber,
        GrandTotal, CustomerId, PurchaseDate
FROM Orders

ORDER BY является обязательным условием. Предложение OVER() сообщает SQL Engine сортировать данные по указанному столбцу (в данном случае OrderId) и присваивать номера в соответствии с результатами сортировки.

Ответ 22

Полезно для анализа аргументов хранимой процедуры: xp_sscanf

Считывает данные из строки в позиции аргументов, заданные каждым аргументом формата.

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

DECLARE @filename varchar (20), @message varchar (20)
EXEC xp_sscanf 'sync -b -fproducts10.tmp -rrandom', 'sync -b -f%s -r%s', 
  @filename OUTPUT, @message OUTPUT
SELECT @filename, @message

Вот результат.

-------------------- -------------------- 
products10.tmp        random

Ответ 23

Только дата возврата

Select Cast(Floor(Cast(Getdate() As Float))As Datetime)

или

Select DateAdd(Day, 0, DateDiff(Day, 0, Getdate()))

Ответ 24

dm_db_index_usage_stats

Это позволяет узнать, обновлены ли данные в таблице, даже если у вас нет столбца DateUpdated в таблице.

SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, last_user_update,*
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID( 'MyDatabase')
AND OBJECT_ID=OBJECT_ID('MyTable')

Код от: http://blog.sqlauthority.com/2009/05/09/sql-server-find-last-date-time-updated-for-any-table/

Информация, на которую ссылаются: SQL Server - какова дата/время последней вставленной строки таблицы?

Доступно в SQL 2005 и более поздних версиях

Ответ 25

Вот некоторые функции, которые я нахожу полезными, но многие люди, похоже, не знают о них:

sp_tables

Возвращает список объектов, которые могут быть запрашивается в текущей среде. Это означает любой объект, который может появиться в предложении FROM, кроме синонима объекты.

Ссылка

sp_stored_procedures

Возвращает список хранимых процедур в текущая среда.

Ссылка

Ответ 26

Найдите записи, дата которых находится где-то внутри текущей недели.

where dateadd( week, datediff( week, 0, TransDate ), 0 ) =
dateadd( week, datediff( week, 0, getdate() ), 0 )

Найдите записи, которые произошли на прошлой неделе.

where dateadd( week, datediff( week, 0, TransDate ), 0 ) =
dateadd( week, datediff( week, 0, getdate() ) - 1, 0 )

Возвращает дату начала текущей недели.

select dateadd( week, datediff( week, 0, getdate() ), 0 )

Возвращает дату начала прошлой недели.

select dateadd( week, datediff( week, 0, getdate() ) - 1, 0 )

Ответ 27

Не так много скрытой функции, но настройка сопоставлений клавиш в Studio Management в меню "Сервис\Параметры\Клавиатура": Alt + F1 по умолчанию используется sp_help "выделенный текст", но я не могу жить без добавления Ctrl + F1 для sp_helptext "выделенный текст"

Ответ 28

<сильные > сохранялись вычисленные-столбцы

  • Вычисляемые столбцы могут помочь вам перевести стоимость вычисления времени выполнения на фазу модификации данных. Вычисленный столбец сохраняется вместе с остальной частью строки и прозрачно используется, когда выражение в вычисленных столбцах и запросе совпадает. Вы также можете создавать индексы на PCC, чтобы ускорить фильтрацию и сканирование диапазонов в выражении.

Ссылка

Ответ 29

Бывают случаи, когда нет подходящего столбца для сортировки или просто требуется порядок сортировки по умолчанию в таблице, и вы хотите перечислить каждую строку. Для этого вы можете поместить "(выберите 1)" в разделе "order by", и вы получите то, что хотите. Аккуратно, а??

select row_number() over (order by (select 1)), * from dbo.Table as t

Ответ 30

Простое шифрование с EncryptByKey