Таблица передачи как параметр в SQL-сервер UDF

Вот хороший ресурс по алгоритмам выпуклой оболочки: Выпуклая оболочка двумерного набора точек или многоугольника (автор Dan Sunday)

42
задан Nathan Koop 22 October 2009 в 19:05
поделиться

3 ответа

Один человек на моем рабочем месте обнаружил, что следующее работает:

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
    
16
ответ дан 26 November 2019 в 23:33
поделиться

Вы можете, но никакой таблицы. Из документации:

Для функций 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
71
ответ дан 26 November 2019 в 23:33
поделиться

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
*/
0
ответ дан 26 November 2019 в 23:33
поделиться
Другие вопросы по тегам:

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