2010-12-07 11 views
5

¿Cómo se puede agregar un parámetro sql_variant a un procedimiento almacenado SQL CLR? Usar System.Object no funciona, y no veo ningún atributo que pueda usar.¿Cómo tener un parámetro sql_variant para un procedimiento almacenado SQL CLR?

[Microsoft.SqlServer.Server.SqlProcedure] 
public static void ClearOnePartition(
    SqlString aString 
    , /* I want this to be a sql_variant */ object aVariant 
) 
{ 
    //do stuff here 
} 
+1

No estoy seguro de que poder. Todo lo que puedo encontrar son muchas referencias sobre cómo las diferentes API de clientes las traducen en, por ejemplo, nvarchar o columnas binarias. ¿Tiene que ser un sql_variant? –

+1

@Damied_The_Unbeliever: sí, debe ser una sql_variant. Estoy tratando de pasar el valor de un límite para cualquier partición dada, que existe en SQL como un tipo sql_variant. – Burg

+0

Los valores de límite para las particiones no son estrictamente sql_variants (no pueden, por ejemplo, aceptar un valor de tipo texto). No creo que realmente tengan un tipo bien definido en SQL. Buscando en las funciones de SMO para trabajar con funciones de partición, se tratan como Objeto, por lo que no creo que haya un mejor tipo .NET para ellas. –

Respuesta

3

En Mapping CLR Parameter Data desde SQL Books Online, Object aparece como el tipo correcto que debe utilizarse para mapear sql_variant.

he creado un proyecto simple de SQL Server y añade la siguiente clase a la misma:

public partial class StoredProcedures 
{ 
    [Microsoft.SqlServer.Server.SqlProcedure] 
    public static void StoredProcedure1(object param1) 
    { 
     // Put your code here 
     //Trace.Write(param1); 
     SqlContext.Pipe.Send(param1.ToString()); 

    } 
}; 

entonces modificó el test.sql ejercer este procedimiento almacenado:

DECLARE @thing sql_variant = 'hahahahaha'; 

EXEC dbo.StoredProcedure1 @thing 

Se ejecuta mediante esperado y produce el siguiente resultado:

hahahahaha

Sin filas afectadas.

(0 fila (s) devuelto)

terminado de ejecutarse sp_executesql.

1

partición de los valores límite, como se muestra en la documentación CREATE PARTITION FUNCTION, puede ser uno de los muchos tipos diferentes:

Todos los tipos de datos son válidos para su uso como columnas de partición, excepto text, ntext, imagen, xml , timestamp, varchar (max), nvarchar (max), varbinary (max), tipos de datos alias o CLR tipos de datos definidos por el usuario.

Y su tipo de datos real se almacena en sys.partition_parameters.

Pero si uno los está seleccionando de sys.partition_range_values, entonces el campo value es del tipo SQL_VARIANT (y por una buena razón, obviamente).

Sí, SQL_VARIANT (como ya se indicó) mapas a object en .NET.

Si necesita comprobar si hay NULL, compare el objeto con DBNull.Value.

Si desea conocer el tipo subyacente del valor en el objeto (lo más probable es que no va a ser SQL_VARIANT/object), utilice el método GetType():

if (aVariant.GetType() == typeof(SqlInt16)) 
Cuestiones relacionadas