Pergunta

SQL Server 2005 tem excelentes vistas sys.XXX no catálogo do sistema que eu uso com freqüência.

O que me depara é esta: por que há uma "sys.procedures" vista para ver informações sobre seus procedimentos armazenados, mas não há "sys.functions" visão para ver o mesmo para as funções armazenadas

não usa qualquer funções armazenadas? Eu encontrá-los muito útil para, por exemplo, colunas computadas e tal!

Existe uma razão específica sys.functions está faltando, ou é apenas algo que não foi considerado suficientemente importante para colocar nas exibições do catálogo sys ?? É disponível em SQL Server 2008 ??

Cheers, Marc

Foi útil?

Solução

Eu acho UDFs são muito úteis e eu usá-los o tempo todo.

Eu não tenho certeza do que racional da Microsoft é para não incluir um sys.functions equivalentes em SQL Server 2005 (ou SQL Server 2008, tanto quanto eu posso dizer), mas é fácil o suficiente para rolar o seu próprio:

CREATE VIEW my_sys_functions_equivalent
AS
SELECT *
FROM sys.objects
WHERE type IN ('FN', 'IF', 'TF')  -- scalar, inline table-valued, table-valued

Outras dicas

Outra forma de funções de lista é fazer uso de pontos de vista INFORMATION_SCHEMA.

SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION'

De acordo com o site da Microsoft "visões do esquema de informações fornecem uma interna, sistema de visão independente de mesa dos metadados SQL Server. Vistas de esquema de informações permitem que aplicativos funcionem corretamente, embora mudanças significativas foram feitas para as tabelas subjacentes do sistema". Em outras palavras, as tabelas sistema subjacente pode mudar como SQL é atualizado, mas as vistas ainda deve permanecer o mesmo.

Isso é válido em 2008 R2 pelo SSMS gera quando você script de uma gota de uma função:

SELECT  *
FROM    sys.objects
WHERE   type IN (N'FN', N'IF', N'TF', N'FS', N'FT') ;

/*
From http://msdn.microsoft.com/en-us/library/ms177596.aspx:
 FN SQL_SCALAR_FUNCTION
 FS Assembly (CLR) scalar-function
 FT Assembly (CLR) table-valued function
 IF SQL_INLINE_TABLE_VALUED_FUNCTION
 TF SQL_TABLE_VALUED_FUNCTION
*/

É muito ligeiramente mais detalhado, mas isso deve fazer exatamente a mesma coisa:

select * from sys.objects where (type='TF' or type='FN')

Tanto quanto eu posso ver, não é no SQL Server 2008 também.

Esta não acrescenta nada de novo, mas eu achei o seguinte mais fácil de lembrar:

select * from sys.objects where type_desc like '%fun%'

tente o seguinte:

SELECT * FROM sys.objects
where type_desc = 'SQL_SCALAR_FUNCTION'

aliás, você não iria querer incluir type = 'FS'?

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

que é o que o item em sys.objects corresponde com o meu UDF que é derivado a partir de uma DLL externa

Para estender em cima @ resposta de LukeH, para retornar as definições de função, bem requer uma junção com a tabela de sys.sql_modules. Assim, a consulta para isto é:

SELECT O.name as 'Function name', M.definition as 'Definition', O.object_id
FROM sys.objects as O INNER JOIN sys.sql_modules as M
    ON O.object_id = M.object_id
WHERE type IN ('FN', 'IF', 'TF')  -- scalar, inline table-valued, table-valued

onde as telas acima do nome da função, sua definição e o identificador do objeto, respectivamente.

Para uma descrição completa de funções escalares, incluindo proprietário e tipo de retorno:

SELECT f.name, s.name AS owner, t.name as dataType, p.max_length, p.precision, p.scale, m.definition
FROM sys.objects f
JOIN sys.schemas s on s.schema_id = f.schema_id
JOIN sys.parameters p on p.object_id = f.object_id AND p.parameter_id = 0
JOIN sys.types t ON t.system_type_id = p.system_type_id 
JOIN sys.sql_modules as m ON m.object_id = f.object_id
WHERE type='FN';

específica SQL 2000, ligeiro ajuste para o nome do objeto:

SELECT *
FROM sysobjects
WHERE type IN ('FN', 'IF', 'TF')

ou

SELECT *
FROM dbo.sysobjects
WHERE type IN ('FN', 'IF', 'TF')
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top