В 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 освободит память, используемую этим объектом, и выделит другую.
Не недокументированный
любезность RowNumber Itzik Ben-Gan http://www.sqlmag.com/article/articleid/97675/sql_server_blog_97675.html
УСТАНАВЛИВАЕТ XACT_ABORT НА откате все на ошибке для транзакций
, весь _ SP полезен, просто просматривают книги онлайн
сочетания клавиш, которые я использую все время в студии управления, которую F6 - переключают между результатами и запрашивают Alt+X или F5-выполненный выделенный текст в запросе, если ничто не выбрано, работает, все окно Alt+T и Alt+D - приводит к тексту или сетке соответственно
use db
go
DECLARE @procName varchar(100)
DECLARE @cursorProcNames CURSOR
SET @cursorProcNames = CURSOR FOR
select name from sys.procedures where modify_date > '2009-02-05 13:12:15.273' order by modify_date desc
OPEN @cursorProcNames
FETCH NEXT
FROM @cursorProcNames INTO @procName
WHILE @@FETCH_STATUS = 0
BEGIN
-- see the text of the last stored procedures modified on
-- the db , hint Ctrl + T would give you the procedures test
set nocount off;
exec sp_HelpText @procName --- or print them
-- print @procName
FETCH NEXT
FROM @cursorProcNames INTO @procName
END
CLOSE @cursorProcNames
select @@error
Я нахожу sp_depends
полезный. Это отображает объекты, которые зависят от данного объекта, например,
exec sp_depends 'fn_myFunction'
объекты возвратов, которые зависят от этой функции (примечание, если объекты не были первоначально выполнены в базу данных в правильном порядке, это даст неправильные результаты.)
В SQL Server 2005 Вы больше не должны работать хранимая процедура sp-blocker-pss80 . Вместо этого можно сделать:
exec sp_configure 'show advanced options', 1;
reconfigure;
go
exec sp_configure 'blocked process threshold', 30;
reconfigure;
можно тогда запустить SQL Trace и выбрать Заблокированный процесс, сообщает класс событий в группе Ошибок и Предупреждений. Детали того события здесь .
use db
go
select o.name
, (SELECT [definition] AS [text()]
FROM sys.all_sql_modules
WHERE sys.all_sql_modules.object_id=a.object_id
FOR XML PATH(''), TYPE
) AS Statement_Text
, a.object_id
, o.modify_date
FROM sys.all_sql_modules a
LEFT JOIN sys.objects o ON a.object_id=o.object_id
ORDER BY 4 desc
--select * from sys.objects
Хорошо, вот мои 2 цента:
http://dbalink.wordpress.com/2008/10/24/querying-the-object-catalog-and-information-schema-views/
я слишком ленив для переписывания всего этого здесь, поэтому проверьте мое сообщение. Это может быть тривиально многим, но будут некоторые, кто найдет его "скрытым сокровищем".
РЕДАКТИРОВАНИЕ:
Через некоторое время, я решил добавить код здесь, таким образом, Вы не должны переходить к моему блогу для наблюдения кода.
SELECT T.NAME AS [TABLE NAME], C.NAME AS [COLUMN NAME], P.NAME AS [DATA TYPE], P.MAX_LENGTH AS[SIZE], CAST(P.PRECISION AS VARCHAR) +‘/’+ CAST(P.SCALE AS VARCHAR) AS [PRECISION/SCALE]
FROM ADVENTUREWORKS.SYS.OBJECTS AS T
JOIN ADVENTUREWORKS.SYS.COLUMNS AS C
ON T.OBJECT_ID=C.OBJECT_ID
JOIN ADVENTUREWORKS.SYS.TYPES AS P
ON C.SYSTEM_TYPE_ID=P.SYSTEM_TYPE_ID
WHERE T.TYPE_DESC=‘USER_TABLE’;
Или, если Вы хотите вытянуть все Пользовательские Таблицы в целом, КУРСОР использования как это:
DECLARE @tablename VARCHAR(60)
DECLARE cursor_tablenames CURSOR FOR
SELECT name FROM AdventureWorks.sys.tables
OPEN cursor_tablenames
FETCH NEXT FROM cursor_tablenames INTO @tablename
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT t.name AS [TABLE Name], c.name AS [COLUMN Name], p.name AS [DATA Type], p.max_length AS[SIZE], CAST(p.PRECISION AS VARCHAR) +‘/’+ CAST(p.scale AS VARCHAR) AS [PRECISION/Scale]
FROM AdventureWorks.sys.objects AS t
JOIN AdventureWorks.sys.columns AS c
ON t.OBJECT_ID=c.OBJECT_ID
JOIN AdventureWorks.sys.types AS p
ON c.system_type_id=p.system_type_id
WHERE t.name = @tablename
AND t.type_desc=‘USER_TABLE’
ORDER BY t.name ASC
FETCH NEXT FROM cursor_tablenames INTO @tablename
END
CLOSE cursor_tablenames
DEALLOCATE cursor_tablenames
ДОПОЛНИТЕЛЬНАЯ ССЫЛКА (мой блог): http://dbalink.wordpress.com/2009/01/21/how-to-create-cursor-in-tsql/
Некоторые недокументированные - здесь: Недокументированный но удобный SQL-сервер Procs и команды DBCC
Для SQL Server 2005:
select * from sys.dm_os_performance_counters
select * from sys.dm_exec_requests
Получение результатов на основе строки идентификаторов, разделенных вертикальной чертой, в одном элементе статистики (альтернатива передаче xml или первому преобразованию строки с разделителями в таблицу)
Пример:
DECLARE @nvcIDs nvarchar(max)
SET @nvcIDs = '|1|2|3|'
SELECT C.*
FROM tblCompany C
WHERE @nvcIDs LIKE '%|' + CAST(C.CompanyID as nvarchar) + '|%'
Я использую, чтобы добавить эту хранимую процедуру к главной базе данных,
Улучшения:
Использование:
Вот и все.
CREATE procedure sp_who3
@loginame sysname = NULL --or 'active' or 'lock'
as
declare @spidlow int,
@spidhigh int,
@spid int,
@sid varbinary(85)
select @spidlow = 0
,@spidhigh = 32767
if @loginame is not NULL begin
if upper(@loginame) = 'ACTIVE' begin
select spid, ecid, status
, loginame=rtrim(loginame)
, hostname=rtrim(hostname)
, blk=convert(char(5),blocked)
, dbname = case
when dbid = 0 then null
when dbid <> 0 then db_name(dbid)
end
,cmd
from master.dbo.sysprocesses
where spid >= @spidlow and spid <= @spidhigh AND
upper(cmd) <> 'AWAITING COMMAND'
return (0)
end
if upper(@loginame) = 'LOCK' begin
select spid , ecid, status
, loginame=rtrim(loginame)
, hostname=rtrim(hostname)
, blk=convert(char(5),blocked)
, dbname = case
when dbid = 0 then null
when dbid <> 0 then db_name(dbid)
end
,cmd
from master.dbo.sysprocesses
where spid >= 0 and spid <= 32767 AND
upper(cmd) <> 'AWAITING COMMAND'
AND convert(char(5),blocked) > 0
return (0)
end
end
if (@loginame is not NULL
AND upper(@loginame) <> 'ACTIVE'
)
begin
if (@loginame like '[0-9]%') -- is a spid.
begin
select @spid = convert(int, @loginame)
select spid, ecid, status
, loginame=rtrim(loginame)
, hostname=rtrim(hostname)
, blk=convert(char(5),blocked)
, dbname = case
when dbid = 0 then null
when dbid <> 0 then db_name(dbid)
end
,cmd
from master.dbo.sysprocesses
where spid = @spid
end
else
begin
select @sid = suser_sid(@loginame)
if (@sid is null)
begin
raiserror(15007,-1,-1,@loginame)
return (1)
end
select spid, ecid, status
, loginame=rtrim(loginame)
, hostname=rtrim(hostname)
, blk=convert(char(5),blocked)
, dbname = case
when dbid = 0 then null
when dbid <> 0 then db_name(dbid)
end
,cmd
from master.dbo.sysprocesses
where sid = @sid
end
return (0)
end
/* loginame arg is null */
select spid,
ecid,
status
, loginame=rtrim(loginame)
, hostname=rtrim(hostname)
, blk=convert(char(5),blocked)
, dbname = case
when dbid = 0 then null
when dbid <> 0 then db_name(dbid)
end
,cmd
from master.dbo.sysprocesses
where spid >= @spidlow and spid <= @spidhigh
return (0) -- sp_who
CTRL-E выполняет текущий выделенный текст в Query Analyzer.
Используйте
select * from information_schema
для получения списка всех баз данных, базовых таблиц, sps, views и т.д. в sql server.
Альтернатива sp_change_users_login Колтена:
ALTER USER wacom_app WITH LOGIN = wacom_app