В 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 освободит память, используемую этим объектом, и выделит другую.
установка DEFAULT_SCHEMA в sys.database_principles
Если Вы хотите отбросить все процедуры в 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
Полускрытая функция, функция Table/Stored Procedure Filter может быть действительно полезной...
В обозреватель объектов Studio управления SQL Server , щелкните правой кнопкой эти папка Stored Procedures Таблиц или , выберите меню Filter , тогда Настройки Фильтра , и введите частичное имя в эти , Имя содержит строка.
Аналогично, используйте , Удаляют Фильтр для наблюдения всех Таблиц/Хранимых процедур снова.
На основе какого, кажется, неистовая реакция на него укрепленными разработчиками базы данных, интеграция CLR оценила бы право там. =)
Так как я - программист, не DBA, мой фаворит, скрытая функция библиотека SMO . Можно автоматизировать в значительной степени что-либо в SQL Server от создания базы данных/таблицы/столбца и удаления к сценариям, чтобы скопировать и восстановить. Если можно сделать это в Studio управления SQL Server, можно автоматизировать его в SMO.
Вот тот, который я изучил сегодня, потому что я должен был искать транзакцию.
:: fn_dblog
Это позволяет Вам запрашивать журнал транзакций для базы данных.
USE mydatabase;
SELECT *
FROM ::fn_dblog(NULL, NULL)
Триггеры для Событий Входа в систему
Моим фаворитом является ведущее устройство.. xp_cmdshell. Это позволяет Вам командам выполнения от командной строки на сервере, и посмотрите вывод. Чрезвычайно полезно, если Вы не можете войти в систему к серверу, но необходимо получить информацию или управлять ею так или иначе.
, Например, для списка папок на C: диск сервера, куда SQL Server работает.
можно запустить и остановить сервисы, также.
ведущее устройство.. xp_cmdshell 'запрос кв/см "Мой Сервис"'
ведущее устройство.. xp_cmdshell 'остановка кв/см "Мой Сервис"'
ведущее устройство.. xp_cmdshell 'кв/см запускают "Мой Сервис"',
Это очень мощно, но угроза безопасности, также. Многие люди отключают его, потому что это могло легко использоваться, делают плохие вещи на сервере. Но, если у Вас есть доступ к нему, это может быть чрезвычайно полезно.
Я нахожу этот маленький сценарий очень удобным для наблюдения текста процедуры, которая была развернута на сервере:
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
sp_executesql
Для выполнения оператора в строке. Столь же хороший как Выполняются , но могут возвращаемые параметры
Находят Процедуры Ключевым словом
, Какие процедуры содержат определенную часть текста (Имя таблицы, имя столбца, имя переменной, TODO, и т.д.)?
SELECT OBJECT_NAME(ID) FROM SysComments
WHERE Text LIKE '%SearchString%'
AND OBJECTPROPERTY(id, 'IsProcedure') = 1
Флаги Трассировки ! "1204" было неоценимо в отладке мертвой блокировки на SQL Server 2000 (2005 имеет лучшие инструменты для этого).
sp_who2, точно так же, как sp_who, но с намного большим количеством информации для поиска и устранения неисправностей блоков
Вот запрос, который я записал для списка Всех Пользовательских объектов 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
Самая удивительная вещь я изучил на этой неделе включенное использование Оператора выбора в ПОРЯДКЕ Пунктом. Например:
declare @orderby varchar(10)
set @orderby = 'NAME'
select *
from Users
ORDER BY
CASE @orderby
WHEN 'NAME' THEN LastName
WHEN 'EMAIL' THEN EmailAddress
END
/* Находят фиксированный диск с самым большим свободным пространством, можно также скопировать файлы для оценки, какой диск самым быстрым * /
EXEC master..xp_fixeddrives
предположения Проверки/* о файле перед использованием или ссылкой * /
EXEC master..xp_fileexist 'C:\file_you_want_to_check'
Получите список заголовков столбцов в вертикальном формате:
Скопируйте имена столбцов в результатах сетки
Инструменты - Опции - Результаты запроса - SQL Server - Результаты к галочке Сетки "Включают заголовки столбцов при копировании или сохранении результатов"
необходимо будет установить новую связь в этой точке, затем выполнить запрос
Теперь при копировании результатов сетки Вы получаете заголовки столбцов
Также, Если Вы затем копируете результаты для выделений
Заголовки седла копии только
Вставьте Особенный (не должен перекрывать область копии),
галочка "Транспонирует"
Хорошо
[можно хотеть добавить"" и автозаполниться вниз в этой точке]
У Вас есть мгновенный список столбцов в вертикальном формате
Выполнить сохраненную процедуру и записать результаты в (временную) таблицу для дальнейшей обработки, например:
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
Если у вас есть сценарии, которые вы запускаете снова и снова, но вам нужно изменить небольшие детали, запуск ssms в режиме sqlcmd - это замечательно. Командная строка sqlcmd тоже довольно нарядная.
Мои любимые функции:
Вместо того, чтобы больше выдавать, Simpletalk by Red Gate сделал отличную завершающую работу над sqlcmd - SQLCMD Workbench . У Донабеля Сантоса есть несколько отличных примеров SQLCMD .
Хорошо, вот те немногие, которые у меня остались, жаль, что я пропустил начало, но так держать, здесь есть кое-что интересное!
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 и выводят объединил результаты - прошу прощения за надуманный пример
Используя утилиту osql для выполнения запросов / сценариев / пакетов командной строки
Вот простой, но полезный вариант:
Когда вы редактируете содержимое таблицы вручную, вы можете вставить NULL в столбец , набрав Control-0 .
Пакетный разделитель
Большинство людей этого не знают, но «GO» не является командой SQL. Это разделитель пакетов по умолчанию, используемый клиентскими инструментами. Дополнительную информацию об этом можно найти в электронной документации .
Вы можете изменить разделитель пакетов, выбрав Инструменты -> Параметры в Management Studio и изменив параметр разделителя пакетов в разделе «Выполнение запроса».
Я не уверен, почему вы хотели бы сделать это иначе, чем в качестве розыгрыша, но это несколько интересная мелочь.
В SQL Server Management Studio (SSMS) вы можете выделить имя объекта в обозревателе объектов и нажать Ctrl-C, чтобы скопировать имя в буфер обмена.
Нет необходимости нажимать F2 или щелкните правой кнопкой мыши, переименуйте объект, чтобы скопировать имя.
Вы также можете перетащить объект из проводника объектов в окно запроса.
Sql 2000+
DBCC DROPCLEANBUFFERS
: очищает буферы. Полезно для проверки скорости запросов при чистом буфере.
Это некоторые скрытые функции 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, то вы увидите структуру таблицы.
Хранимая процедура 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 для своих целей. Процедура использует битовые маски для расшифровки того, что вы хотите вернуть.
@Gatekiller - более легкий способ получить просто Дату, конечно
CAST(CONVERT(varchar,getdate(),103) as datetime)
, Если бы Вы не используете DD/MM/YYYY в своей локали, необходимо было бы использовать различное значение от 103. Поиск ПРЕОБРАЗОВЫВАЕТ функцию в Книгах SQL Онлайн для кодов локали.
Принудительная Параметризация
Несколько моих любимых вещей:
Добавленный в sp2 - Сценариях опций под инструментами/опциями/сценариями
Новая безопасность с помощью схем - создают две схемы: user_access, admin_access. Поместите своего пользователя procs в одного и Вашего администратора procs в другом как это: user_access.showList, admin_access.deleteUser. Предоставление ВЫПОЛНЯЕТ на схеме к Вашему пользователю приложения / роль. Больше ПРЕДОСТАВЛЕНИЯ НЕ ВЫПОЛНЯЕТСЯ все время.
использование Шифрования, созданное в функциях шифрования, представления (для дешифрования для представления), и базовые таблицы с триггерами (для шифрования на вставляют/обновляют).