Скрытые функции SQL Server

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

215
задан 31 revs, 8 users 65% 6 May 2012 в 05:53
поделиться

73 ответа

установка DEFAULT_SCHEMA в sys.database_principles

  • SQL Server предоставляет большой гибкости определение имен. Однако определение имен происходит в стоимость и может стать заметно дорогим в специальных рабочих нагрузках, которые не полностью определяют ссылки на объект. 2005 SQL Server позволяет новую установку DEFEAULT_SCHEMA для каждого принципа базы данных (также известный как “user”), который может устранить эти издержки, не изменяя Ваш код TSQL.

Ссылка

1
ответ дан Sklivvz 23 November 2019 в 04:19
поделиться

Если Вы хотите отбросить все процедуры в DB -

SELECT  IDENTITY ( int, 1, 1 ) id, 
        [name] 
INTO    #tmp 
FROM    sys.procedures 
WHERE   [type]        = 'P' 
    AND is_ms_shipped = 0 

DECLARE @i INT 

SELECT   @i = COUNT( id ) FROM #tmp 
WHILE    @i > 0 
BEGIN 
   DECLARE @name VARCHAR( 100 ) 
   SELECT @name = name FROM #tmp WHERE id = @i 
   EXEC ( 'DROP PROCEDURE ' + @name ) 
   SET @i = @i-1 
END

DROP TABLE #tmp
1
ответ дан cheeves 23 November 2019 в 04:19
поделиться

Полускрытая функция, функция Table/Stored Procedure Filter может быть действительно полезной...

В обозреватель объектов Studio управления SQL Server , щелкните правой кнопкой эти папка Stored Procedures Таблиц или , выберите меню Filter , тогда Настройки Фильтра , и введите частичное имя в эти , Имя содержит строка.

Аналогично, используйте , Удаляют Фильтр для наблюдения всех Таблиц/Хранимых процедур снова.

1
ответ дан Gordon Bell 23 November 2019 в 04:19
поделиться

На основе какого, кажется, неистовая реакция на него укрепленными разработчиками базы данных, интеграция CLR оценила бы право там. =)

2
ответ дан casperOne 23 November 2019 в 04:19
поделиться

Так как я - программист, не DBA, мой фаворит, скрытая функция библиотека SMO . Можно автоматизировать в значительной степени что-либо в SQL Server от создания базы данных/таблицы/столбца и удаления к сценариям, чтобы скопировать и восстановить. Если можно сделать это в Studio управления SQL Server, можно автоматизировать его в SMO.

2
ответ дан Ryan Lundy 23 November 2019 в 04:19
поделиться

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

:: fn_dblog
Это позволяет Вам запрашивать журнал транзакций для базы данных.

USE mydatabase;
SELECT *
FROM ::fn_dblog(NULL, NULL)

http://killspid.blogspot.com/2006/07/using-fndblog.html

2
ответ дан Chris Roland 23 November 2019 в 04:19
поделиться

Триггеры для Событий Входа в систему

  • триггеры Входа в систему могут помочь дополнительному аудиту и соответствию. Например, события входа в систему могут использоваться для осуществления правил о соединениях (например, ограничивающий соединение через определенное имя пользователя или ограничивающий соединения через имя пользователя к определенные периоды времени) или просто для отслеживания и записи общего действия соединения. Точно так же, как в любом триггере, ОТКАТ отменяет операцию, которая находится в выполнении. В случае события входа в систему, которое означает отменять установление соединения. События входа в систему не стреляют, когда сервер запущен в минимальном режиме конфигурации или когда соединение устанавливается посредством специализированного администраторского соединения (DAC).

Ссылка

2
ответ дан Sklivvz 23 November 2019 в 04:19
поделиться

Моим фаворитом является ведущее устройство.. xp_cmdshell. Это позволяет Вам командам выполнения от командной строки на сервере, и посмотрите вывод. Чрезвычайно полезно, если Вы не можете войти в систему к серверу, но необходимо получить информацию или управлять ею так или иначе.

, Например, для списка папок на C: диск сервера, куда SQL Server работает.

  • ведущее устройство.. xp_cmdshell 'dir c:\'

можно запустить и остановить сервисы, также.

  • ведущее устройство.. xp_cmdshell 'запрос кв/см "Мой Сервис"'

  • ведущее устройство.. xp_cmdshell 'остановка кв/см "Мой Сервис"'

  • ведущее устройство.. xp_cmdshell 'кв/см запускают "Мой Сервис"',

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

2
ответ дан Jim 23 November 2019 в 04:19
поделиться

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

DECLARE @procedureName NVARCHAR( MAX ), @procedureText NVARCHAR( MAX )

SET @procedureName = 'myproc_Proc1'

SET @procedureText =    (
                            SELECT  OBJECT_DEFINITION( object_id )
                            FROM    sys.procedures 
                            WHERE   Name = @procedureName
                        )

PRINT @procedureText
4
ответ дан 3 revs, 3 users 89% 23 November 2019 в 04:19
поделиться
sp_executesql 

Для выполнения оператора в строке. Столь же хороший как Выполняются , но могут возвращаемые параметры

4
ответ дан Eduardo Molteni 23 November 2019 в 04:19
поделиться

Находят Процедуры Ключевым словом

, Какие процедуры содержат определенную часть текста (Имя таблицы, имя столбца, имя переменной, TODO, и т.д.)?

SELECT OBJECT_NAME(ID) FROM SysComments 
WHERE Text LIKE '%SearchString%' 
AND OBJECTPROPERTY(id, 'IsProcedure') = 1
4
ответ дан Meff 23 November 2019 в 04:19
поделиться

Флаги Трассировки ! "1204" было неоценимо в отладке мертвой блокировки на SQL Server 2000 (2005 имеет лучшие инструменты для этого).

4
ответ дан 2 revs 23 November 2019 в 04:19
поделиться

sp_who2, точно так же, как sp_who, но с намного большим количеством информации для поиска и устранения неисправностей блоков

4
ответ дан Booji Boy 23 November 2019 в 04:19
поделиться

Вот запрос, который я записал для списка Всех Пользовательских объектов DB Последней Измененной Датой:

select name, modify_date, 
case when type_desc = 'USER_TABLE' then 'Table'
when type_desc = 'SQL_STORED_PROCEDURE' then 'Stored Procedure'
when type_desc in ('SQL_INLINE_TABLE_VALUED_FUNCTION', 'SQL_SCALAR_FUNCTION', 'SQL_TABLE_VALUED_FUNCTION') then 'Function'
end as type_desc
from sys.objects
where type in ('U', 'P', 'FN', 'IF', 'TF')
and is_ms_shipped = 0
order by 2 desc
5
ответ дан 2 revs 23 November 2019 в 04:19
поделиться

Самая удивительная вещь я изучил на этой неделе включенное использование Оператора выбора в ПОРЯДКЕ Пунктом. Например:

declare @orderby varchar(10)

set @orderby = 'NAME'

select * 
    from Users
    ORDER BY 
        CASE @orderby
            WHEN 'NAME' THEN LastName
            WHEN 'EMAIL' THEN EmailAddress
        END
6
ответ дан 3 revs, 2 users 88% 23 November 2019 в 04:19
поделиться

/* Находят фиксированный диск с самым большим свободным пространством, можно также скопировать файлы для оценки, какой диск самым быстрым * /

EXEC master..xp_fixeddrives

предположения Проверки/* о файле перед использованием или ссылкой * /

EXEC master..xp_fileexist 'C:\file_you_want_to_check'

[еще 112] детали здесь

6
ответ дан ICW 23 November 2019 в 04:19
поделиться

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

Скопируйте имена столбцов в результатах сетки

Инструменты - Опции - Результаты запроса - SQL Server - Результаты к галочке Сетки "Включают заголовки столбцов при копировании или сохранении результатов"

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

Теперь при копировании результатов сетки Вы получаете заголовки столбцов

Также, Если Вы затем копируете результаты для выделений

Заголовки седла копии только

Вставьте Особенный (не должен перекрывать область копии),

галочка "Транспонирует"

Хорошо

[можно хотеть добавить"" и автозаполниться вниз в этой точке]

У Вас есть мгновенный список столбцов в вертикальном формате

1
ответ дан adolf garlic 23 November 2019 в 04:19
поделиться

Выполнить сохраненную процедуру и записать результаты в (временную) таблицу для дальнейшей обработки, например:

INSERT INTO someTable EXEC sp_someproc

Пример: показывает вывод sp_help , но упорядоченный по размеру базы данных :

CREATE TABLE #dbs
(
    name nvarchar(50),
    db_size nvarchar(50),
    owner nvarchar(50),
    dbid int,
    created datetime,
    status nvarchar(255),
    compatiblity_level int
)
INSERT INTO #dbs EXEC sp_helpdb

SELECT * FROM #dbs 
ORDER BY CONVERT(decimal, LTRIM(LEFT(db_size, LEN(db_size)-3))) DESC

DROP TABLE #dbs
1
ответ дан 23 November 2019 в 04:19
поделиться

SQLCMD

Если у вас есть сценарии, которые вы запускаете снова и снова, но вам нужно изменить небольшие детали, запуск ssms в режиме sqlcmd - это замечательно. Командная строка sqlcmd тоже довольно нарядная.

Мои любимые функции:

  • Вы можете устанавливать переменные. Правильные переменные, которые не требуют перехода через обручи sp_exec
  • Вы можете запускать несколько сценариев один за другим
  • Эти сценарии могут ссылаться на переменные во «внешнем» сценарии

Вместо того, чтобы больше выдавать, Simpletalk by Red Gate сделал отличную завершающую работу над sqlcmd - SQLCMD Workbench . У Донабеля Сантоса есть несколько отличных примеров SQLCMD .

6
ответ дан 23 November 2019 в 04:19
поделиться

Хорошо, вот те немногие, которые у меня остались, жаль, что я пропустил начало, но так держать, здесь есть кое-что интересное!

Query Analyzer

  • Alt + F1 выполняет sp_help для выделенного текста
  • Alt-D - фокус в раскрывающемся списке базы данных, чтобы вы могли использовать select db с помощью клавиш курсора с буквой.

T-Sql

  • if ( object_id ("nameofobject") НЕ ПУСТОЙ) begin end - простейшая проверка существования
  • sp_locks - более подробная информация о блокировке, чем sp_who2 (который является первым портом вызова)
  • dbcc inputbuffer (spid) - список верхней строки выполняемого процесса (вроде полезно, но v.кратко)
  • dbcc outputbuffer (spid) - список верхней строки вывода выполняемого процесса

Общий совет T-sql

  • При больших объемах свободно используйте подзапросы для обработки данных в наборах

, например получить список женатых люди старше пятидесяти, вы можете выбрать множество людей, состоящих в браке в подзапрос и присоединиться к набору те же люди старше 50 и выводят объединил результаты - прошу прощения за надуманный пример

4
ответ дан 23 November 2019 в 04:19
поделиться

Используя утилиту osql для выполнения запросов / сценариев / пакетов командной строки

1
ответ дан 23 November 2019 в 04:19
поделиться

Вот простой, но полезный вариант:

Когда вы редактируете содержимое таблицы вручную, вы можете вставить NULL в столбец , набрав Control-0 .

6
ответ дан 23 November 2019 в 04:19
поделиться

Пакетный разделитель

Большинство людей этого не знают, но «GO» не является командой SQL. Это разделитель пакетов по умолчанию, используемый клиентскими инструментами. Дополнительную информацию об этом можно найти в электронной документации .

Вы можете изменить разделитель пакетов, выбрав Инструменты -> Параметры в Management Studio и изменив параметр разделителя пакетов в разделе «Выполнение запроса».

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

4
ответ дан 23 November 2019 в 04:19
поделиться

В SQL Server Management Studio (SSMS) вы можете выделить имя объекта в обозревателе объектов и нажать Ctrl-C, чтобы скопировать имя в буфер обмена.

Нет необходимости нажимать F2 или щелкните правой кнопкой мыши, переименуйте объект, чтобы скопировать имя.

Вы также можете перетащить объект из проводника объектов в окно запроса.

3
ответ дан 23 November 2019 в 04:19
поделиться

Sql 2000+ DBCC DROPCLEANBUFFERS : очищает буферы. Полезно для проверки скорости запросов при чистом буфере.

2
ответ дан 23 November 2019 в 04:19
поделиться

Это некоторые скрытые функции SQL Management Studio, которые мне нравятся.

Мне нравится то, что если удерживать нажатой клавишу ALT при подсвечивании информации, то можно выбрать информацию о столбцах, а не только целые строки.

В SQL Management Studio есть предопределенные клавиатурные сокращения:

Ctrl+1 запускает sp_who. Ctrl+2 запускает sp_lock Alt+F1 запускает sp_help Ctrl+F1 запускает sp_helptext

Так что если вы выделите имя таблицы в редакторе и нажмете Alt+F1, то вы увидите структуру таблицы.

1
ответ дан 23 November 2019 в 04:19
поделиться

Хранимая процедура sp_MSdependencies рассказывает о зависимостях объектов более полезным способом, чем sp_depends. Для некоторых производственных релизов удобно временно отключить ограничения дочерних таблиц, применить изменения, а затем снова включить ограничения дочерних таблиц. Это отличный способ найти объекты, которые зависят от родительской таблицы.

Этот код отключает ограничения дочерних таблиц:

create table #deps
( oType int,
  oObjName sysname,
  oOwner nvarchar(200),
  oSequence int
)

insert into #deps  
exec sp_MSdependencies @tableName, null, 1315327

exec sp_MSforeachtable @command1 = 'ALTER TABLE ? NOCHECK CONSTRAINT ALL',
@whereand = ' and o.name in (select oObjName from #deps where oType = 8)'

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

exec sp_MSforeachtable @command1 = 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL',
@whereand = ' and o.name in (select oObjName from #deps where oType = 8)'

Третий параметр называется @flags и управляет тем, какие зависимости будут перечислены. Прочитайте содержимое proc, чтобы понять, как можно изменить @flags для своих целей. Процедура использует битовые маски для расшифровки того, что вы хотите вернуть.

2
ответ дан 23 November 2019 в 04:19
поделиться

@Gatekiller - более легкий способ получить просто Дату, конечно

CAST(CONVERT(varchar,getdate(),103) as datetime)

, Если бы Вы не используете DD/MM/YYYY в своей локали, необходимо было бы использовать различное значение от 103. Поиск ПРЕОБРАЗОВЫВАЕТ функцию в Книгах SQL Онлайн для кодов локали.

0
ответ дан Ollie 23 November 2019 в 04:19
поделиться

Принудительная Параметризация

  • Параметризация позволяет SQL Server использовать в своих интересах повторное использование плана запросов и избегать издержек компиляции и оптимизации на последующем выполнении подобных запросов. Однако существует много приложений там, которые, по той или иной причине, все еще страдают от компиляции специального запроса наверху. Для тех случаев с высоким количеством компиляции запроса и где понижение загрузки ЦП и время отклика очень важно для Вашей рабочей нагрузки, параметризация силы может помочь.

Ссылка

0
ответ дан Sklivvz 23 November 2019 в 04:19
поделиться

Несколько моих любимых вещей:

Добавленный в sp2 - Сценариях опций под инструментами/опциями/сценариями

Новая безопасность с помощью схем - создают две схемы: user_access, admin_access. Поместите своего пользователя procs в одного и Вашего администратора procs в другом как это: user_access.showList, admin_access.deleteUser. Предоставление ВЫПОЛНЯЕТ на схеме к Вашему пользователю приложения / роль. Больше ПРЕДОСТАВЛЕНИЯ НЕ ВЫПОЛНЯЕТСЯ все время.

использование Шифрования, созданное в функциях шифрования, представления (для дешифрования для представления), и базовые таблицы с триггерами (для шифрования на вставляют/обновляют).

0
ответ дан Sam 23 November 2019 в 04:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: