Asignar datos de parámetros CLR
En la tabla siguiente se enumeran tipos de datos de Microsoft SQL Server, sus equivalentes en CLR (Common Language Runtime) para SQL Server en el espacio de nombres System.Data.SqlTypes y sus equivalentes CLR nativos en Microsoft .NET Framework.
Tipo de datos de SQL Server |
Tipo (en System.Data.SqlTypes o Microsoft.SqlServer.Types) |
Tipo de datos CLR (.NET Framework) |
bigint |
SqlInt64 |
Int64, Nullable<Int64> |
binary |
SqlBytes, SqlBinary |
Byte[] |
bit |
SqlBoolean |
Boolean, Nullable<Boolean> |
char |
Ninguna |
Ninguna |
cursor |
Ninguna |
Ninguna |
date |
SqlDateTime |
DateTime, Nullable<DateTime> |
datetime |
SqlDateTime |
DateTime, Nullable<DateTime> |
datetime2 |
Ninguna |
DateTime, Nullable<DateTime> |
DATETIMEOFFSET |
None |
DateTimeOffset, Nullable<DateTimeOffset> |
decimal |
SqlDecimal |
Decimal, Nullable<Decimal> |
float |
SqlDouble |
Double, Nullable<Double> |
geography |
SqlGeography SqlGeography se define en Microsoft.SqlServer.Types.dll, que se instala con SQL Server y puede descargarse desde el Feature Pack de SQL Server 2008. |
Ninguno |
geometry |
SqlGeometry SqlGeometry se define en Microsoft.SqlServer.Types.dll, que se instala con SQL Server y puede descargarse desde el Feature Pack de SQL Server 2008. |
Ninguno |
hierarchyid |
SqlHierarchyId SqlHierarchyId se define en Microsoft.SqlServer.Types.dll, que se instala con SQL Server y puede descargarse desde el Feature Pack de SQL Server 2008. |
Ninguno |
image |
Ninguno |
Ninguno |
int |
SqlInt32 |
Int32, Nullable<Int32> |
money |
SqlMoney |
Decimal, Nullable<Decimal> |
nchar |
SqlChars, SqlString |
String, Char[] |
ntext |
Ninguno |
Ninguno |
numeric |
SqlDecimal |
Decimal, Nullable<Decimal> |
nvarchar |
SqlChars, SqlString SQLChars es más adecuado para la transferencia de datos y el acceso a los mismos, mientras que SQLString es mejor para realizar operaciones de cadena. |
String, Char[] |
nvarchar(1), nchar(1) |
SqlChars, SqlString |
Char, String, Char[], Nullable<char> |
real |
SqlSingle |
Single, Nullable<Single> |
rowversion |
Ninguna |
Byte[] |
smallint |
SqlInt16 |
Int16, Nullable<Int16> |
smallmoney |
SqlMoney |
Decimal, Nullable<Decimal> |
sql_variant |
Ninguna |
Object |
table |
Ninguna |
Ninguna |
text |
Ninguna |
Ninguna |
time |
Ninguna |
TimeSpan, Nullable<TimeSpan> |
timestamp |
Ninguna |
Ninguna |
tinyint |
SqlByte |
Byte, Nullable<Byte> |
uniqueidentifier |
SqlGuid |
Guid, Nullable<Guid> |
User-defined type(UDT) |
Ninguna |
La misma clase que está enlazada al tipo definido por el usuario en el mismo ensamblado o en un ensamblado dependiente. |
varbinary |
SqlBytes, SqlBinary |
Byte[] |
varbinary(1), binary(1) |
SqlBytes, SqlBinary |
byte, Byte[], Nullable<byte> |
varchar |
Ninguno |
Ninguno |
xml |
SqlXml |
Ninguno |
Conversión automática de tipos de datos con parámetros OUT
Un método CLR puede devolver información al código o programa de llamada marcando un parámetro de entrada con el modificador out (Microsoft Visual C#) o <Out()> ByRef (Microsoft Visual Basic). Si el parámetro de entrada es un tipo de datos CLR del espacio de nombres System.Data.SqlTypes y el programa de llamada especifica su tipo de datos de SQL Server equivalente como parámetro de entrada, se produce una conversión de tipos automáticamente cuando el método CLR devuelve el tipo de datos.
Por ejemplo, el siguiente procedimiento almacenado CLR tiene un parámetro de entrada de tipos de datos CLR SqlInt32 que se marca con out (C#) o <Out()> ByRef (Visual Basic):
[Microsoft.SqlServer.Server.SqlProcedure]
public static void PriceSum(out SqlInt32 value)
{ … }
<Microsoft.SqlServer.Server.SqlProcedure> _
Public Shared Sub PriceSum( <Out()> ByRef value As SqlInt32)
…
End Sub
Una vez generado y creado el ensamblado en la base de datos, el procedimiento almacenado se crea en SQL Server con el siguiente Transact-SQL, que especifica un tipo de datos SQL Server de int como parámetro OUTPUT:
CREATE PROCEDURE PriceSum (@sum int OUTPUT)
AS EXTERNAL NAME TestStoredProc.StoredProcedures.PriceSum
Cuando se llama al procedimiento almacenado CLR, el tipo de datos SqlInt32 se convierte automáticamente en un tipo de datos int y se devuelve al programa que hace la llamada.
Pero no todos los tipos de datos CLR se pueden convertir automáticamente en sus tipos de datos SQL Server equivalentes mediante un parámetro OUT. En la tabla siguiente se enumeran estas excepciones.
Tipo de datos CLR (SQL Server) |
Tipo de datos de SQL Server |
Decimal |
smallmoney |
SqlMoney |
smallmoney |
Decimal |
money |
DateTime |
smalldatetime |
SQLDateTime |
smalldatetime |