2010-12-07 25 views
5

Comment ajouter un paramètre sql_variant à une procédure stockée SQL CLR? L'utilisation de System.Object ne fonctionne pas et je ne vois aucun attribut que je puisse utiliser.Comment avoir un paramètre sql_variant pour une procédure stockée 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

Je ne suis pas sûr que vous pouvez. Tout ce que je peux trouver, c'est beaucoup de références à la façon dont différentes API client les traduisent en e.g. nvarchar ou colonnes binaires. Est-ce que ça doit être un sql_variant? –

+1

@Damied_The_Unbeliever: oui, ce doit être un sql_variant. J'essaie de transmettre la valeur d'une frontière pour une partition donnée, qui existe dans SQL en tant que type sql_variant. – Burg

+0

Les valeurs limites pour les partitions ne le sont pas, strictement sql_variants (elles ne peuvent pas, par exemple, accepter une valeur de type text). Je ne pense pas qu'ils ont un type bien défini en SQL. En regardant dans les fonctions SMO pour travailler avec les fonctions de partition, ils sont traités comme des objets, donc je ne crois pas qu'il existe un meilleur type de .NET pour eux. –

Répondre

3

En Mapping CLR Parameter Data de SQL Books en ligne, Object est répertorié comme le type correct à utiliser pour la carte sql_variant.

J'ai créé un projet simple SQL Server et ajouté la classe suivante à elle:

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()); 

    } 
}; 

je puis modifié le fichier test.sql exercer ce proc stocké:

DECLARE @thing sql_variant = 'hahahahaha'; 

EXEC dbo.StoredProcedure1 @thing 

Cela fonctionne comme attendu et produit la sortie suivante:

hahahahaha

Aucune ligne affectée.

(0 rangée (s) de retour)

terminé l'exécution sp_executesql.

1

valeurs limites de la partition, comme indiqué dans la documentation CREATE PARTITION FUNCTION, peut être l'un des nombreux types différents:

Tous les types de données sont valables pour une utilisation en tant que colonnes de séparation, à l'exception du texte, ntext, image, xml , horodatage, varchar (max), nvarchar (max), varbinary (max), types de données d'alias ou types de données définis par l'utilisateur CLR.

Et leur type de données actuel est stocké dans sys.partition_parameters.

Mais si on les sélectionne sur sys.partition_range_values, alors le champ value est de type SQL_VARIANT (et pour cause, évidemment).

Oui, SQL_VARIANT (comme indiqué précédemment) correspond à object dans .NET.

Si vous devez rechercher des valeurs NULL, comparez l'objet à DBNull.Value.

Si vous voulez connaître le type de la valeur sous-jacente de l'objet (le plus ne va probablement SQL_VARIANT/object), utilisez la méthode GetType():

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