Вот хороший ресурс по алгоритмам выпуклой оболочки: Выпуклая оболочка двумерного набора точек или многоугольника (автор Dan Sunday)
Один человек на моем рабочем месте обнаружил, что следующее работает:
public class Foo {
private final static Logger logger = Logger.getLogger(Foo.class.getName());
public static final void main(String[] args) {
ConsoleHandler ch = new ConsoleHandler();
ch.setLevel(Level.FINEST);
Foo.logger.addHandler(ch);
Foo.logger.setLevel(Level.FINEST);
Foo.logger.finest("test");
}
}
Если вы просто установите root или обработчик на лучший (эксклюзивный), то это не сработает. Когда я устанавливаю оба параметра на FINEST
, он работает. Его объяснение было следующим:
И регистратор, и его обработчики имеют уровни регистрации… Порядок фильтрации - регистратор, затем обработчики. Это означает, что он проверяет, проходит ли сообщение журнала сначала фильтр журналов, а затем отправляет сообщение отдельным обработчикам для фильтрации.
Далее он объяснил это, используя следующие примеры:
Logger myLogger
имеет уровень FINEST
и одно сообщение ConsoleHandler myHandler
с уровнем INFO
myLogger.fine ("foo")
à сообщение проходит мимо регистратора фильтр,
CREATE PROC dbo.ToCSV (
@MyQuery varchar(2000),
@CSVOut varchar(max)
)
AS
SET NOCOUNT ON
CREATE TABLE #foo (bar varchar(max))
INSERT #foo
EXEC (@MyQuery)
SELECT
@CSVOut = SUBSTRING(buzz, 2, 2000000000)
FROM
(
SELECT
bar -- maybe CAST(bar AS varchar(max))??
FROM
#foo
FOR XML PATH (',')
) fizz(buzz)
GO
Вы можете, но никакой таблицы. Из документации:
Для функций Transact-SQL все данные типы, включая определяемые пользователем CLR типы и пользовательские типы таблиц, разрешены, кроме данных с отметкой времени type.
Вы можете использовать определяемые пользователем типы таблиц .
Пример определяемого пользователем типа таблицы:
CREATE TYPE TableType
AS TABLE (LocationName VARCHAR(50))
GO
DECLARE @myTable TableType
INSERT INTO @myTable(LocationName) VALUES('aaa')
SELECT * FROM @myTable
Итак, что вы можете сделать, так это определить свой тип таблицы, например TableType
и определите функцию, которая принимает параметр этого типа. Пример функции:
CREATE FUNCTION Example( @TableName TableType READONLY)
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @name VARCHAR(50)
SELECT TOP 1 @name = LocationName FROM @TableName
RETURN @name
END
Параметр должен быть ТОЛЬКО ДЛЯ ЧТЕНИЯ. И пример использования:
DECLARE @myTable TableType
INSERT INTO @myTable(LocationName) VALUES('aaa')
SELECT * FROM @myTable
SELECT dbo.Example(@myTable)
В зависимости от того, чего вы хотите достичь, вы можете изменить этот код.
РЕДАКТИРОВАТЬ: Если у вас есть данные в таблице, вы можете создать переменную:
DECLARE @myTable TableType
И перенести данные из вашей таблицы в переменную
INSERT INTO @myTable(field_name)
SELECT field_name_2 FROm my_other_table
To obtain the column count on a table, use this:
select count(id) from syscolumns where id = object_id('tablename')
and to pass a table to a function, try XML as show here:
create function dbo.ReadXml (@xmlMatrix xml)
returns table
as
return
( select
t.value('./@Salary', 'integer') as Salary,
t.value('./@Age', 'integer') as Age
from @xmlMatrix.nodes('//row') x(t)
)
go
declare @source table
( Salary integer,
age tinyint
)
insert into @source
select 10000, 25 union all
select 15000, 27 union all
select 12000, 18 union all
select 15000, 36 union all
select 16000, 57 union all
select 17000, 44 union all
select 18000, 32 union all
select 19000, 56 union all
select 25000, 34 union all
select 7500, 29
--select * from @source
declare @functionArgument xml
select @functionArgument =
( select
Salary as [row/@Salary],
Age as [row/@Age]
from @source
for xml path('')
)
--select @functionArgument as [@functionArgument]
select * from readXml(@functionArgument)
/* -------- Sample Output: --------
Salary Age
----------- -----------
10000 25
15000 27
12000 18
15000 36
16000 57
17000 44
18000 32
19000 56
25000 34
7500 29
*/