2009-06-26 18 views
19

Entiendo que T-SQL no está orientado a objetos. Necesito escribir un conjunto de funciones que imiten la sobrecarga de métodos en C#.T-SQL ¿Sobrecarga de función definida por el usuario?

¿Se soporta la sobrecarga de funciones en T-SQL de alguna manera? Si hay un truco para hacer esto, ¿se recomienda?

+1

sólo para mantener esta cuestión como un objetivo válido duplicado, este problema no se ha solucionado en SQL Server 2008, 2008 R2 o 2012. De hecho, la única cosa que siempre estuvo cerca - procedimientos numerados - está desfasada. –

Respuesta

10

No, no hay forma de hacerlo.

Te recomiendo volver a visitar el requisito, ya que "hacer que las manzanas se vean como naranjas" es a menudo difícil de hacer, y de valor cuestionable.

+23

esto no es "hacer que las manzanas se vean como naranjas", la sobrecarga de funciones es una solución común y elegante para el problema de hacer una operación similar a diferentes tipos de datos. Tal vergüenza T-SQL no lo admite :( – matao

+1

Estoy de acuerdo con matao. Es una de las características más esenciales de los sistemas de administración de bases de datos relacionales de objetos. –

+0

Entonces debería esperar este resultado, ya que SQL Server no proporciona Object características relacionales. –

4

Puedes pasar un sql_variant, pero viene con todo tipo de riesgos a su alrededor; realmente no se puede usar una escritura fuerte como se puede con lenguajes OO y sobrecarga.

Si necesita encontrar el tipo de base dentro de su función, puede usar la función SQL_VARIANT_PROPERTY.

1

Puede pasar una matriz de valores dentro de una única cadena y analizarlos using this techique by Erland Sommarskog.

Crear una función con un parámetro varchar(max) o varios, si es necesario, a continuación, tener sus valores de parámetros en esa cadena como:

param1;param2;parma3;param4 

o

param1:type;param2:type;param3:type 

o

calltype|param1;param2;param3 

etc. , usted solo está limitado por su imaginación ...

Utilice la técnica del enlace para dividir esta matriz y usar la lógica del programa para usar esos valores como lo desee.

-4

I overload Funciona todo el tiempo, pero sé que este tipo de problemas a menudo dependen en gran medida de la plataforma.

En nuestro sistema DB2, que rutinariamente sobrecargue como la siguiente:

función Crear Schema1.F1 (fecha Parm) devuelve fecha fecha de regreso + 1 mes;

CREAR Función Schema1.F1 (parm timestamp) devuelve la fecha fecha de retorno (marca de tiempo) + 1 mes;

Esto es realmente bastante útil cuando tiene múltiples consultas que tienen requisitos de formato similares.

El único problema que he encontrado sobre esto hasta ahora es que es mejor asegurarse de que desea la función porque el "nombre" de la función de soltar estándar "nombre" falla porque no puede determinar qué función soltar. Si alguien sabe cómo eliminar funciones sql sobrecargadas, ¡házmelo saber!

+1

Esto no es realmente útil ya que la pregunta establece específicamente MSSQL 2005 – cjk

+1

Acaba de probarse contra nuestro MSSQL2005 y parece que no es posible sobrecargar en MSSQL. Create function count() devuelve int begin return (0) end; Crear recuento de funciones (@parm int) devuelve int begin return (@parm) end; [Código de error: 2714, estado de SQL: 42S01] Ya hay un objeto llamado 'recuento' en la base de datos. He descubierto cómo eliminar funciones sobrecargadas en DB2: drop function Schema1.F1 (date); drop function Schema1.F1 (timestamp); La mayoría de nuestras funciones se parecen más a esto sin embargo: drop function Schema1.F1 (varchar (256)); –

5

Una cosa que he hecho con éxito es escribir la función de tal manera que le permita manejar valores nulos, y luego llamarla con valores nulos en lugar de los parámetros que desea omitir.

Ejemplo:

create function ActiveUsers 
(
    @departmentId int, 
    @programId int 
) 
returns int 
as 
begin 
    declare @count int 

    select @count = count(*) 
    from users 
    where 
     departmentId = isnull(@departmentId, departmentId) 
     and programId = isnull(@programId, programId) 

    return @count 
end 
go 

Usos:

select ActiveUsers(1,3) -- users in department 1 and program 3 
select ActiveUsers(null,3) -- all users in program 3, regardless of department 
select ActiveUsers(null,null) -- all users 
0

Una solución sería utilizar el tipo de datos sql_variant. Este ejemplo funciona siempre que use el mismo tipo de datos para ambos valores. Devuelve cualquier tipo de datos que lo envíe.

create function dbo.Greater(
@val1 sql_variant 
,@val2 sql_variant 
) returns sql_variant 
as 
begin 
declare @rV sql_variant 

set @rV = case when @val1 >= @val2 then @val1 
       else @val2 end 

return @rV 
end 
go 
Cuestiones relacionadas