Posteado por: eurecadigital | septiembre 21, 2009

Resetear un Campo de tipo Identidad en SQL SERVER

Si queremos comenzar desde 0 el contador de un campo Identidad en una tabla tendremos que escribir lo siguiente:

DBCC CHECKIDENT (nombreTabla, RESEED, valor_a_inicializar)

Posteado por: eurecadigital | septiembre 3, 2009

Utilizar un campo calculado en una clausula WHERE

Algunas vescesnos encontramos con una select de este tipo:

SELECT CASE WHEN campo1 = 1 THEN 'R'
CASE WHEN campo1 = 2 THEN 'Y'
ELSE 'T'  as 'Value'
FROM TABLA
WHERE Value = 'R'

Esto nos dará un error de columna invalida (campo Value)
Se debe a que sql Server evalua en el siguiente orden:

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. HAVING
  7. SELECT
  8. ORDER BY

Con lo cual al intentar evaluar el WHERE antes que la SELECT da un error de campo desconocido. Para solucionar esto existe un truco sencillo:

SELECT T.* FROM (SELECT CASE WHEN campo1 = 1 THEN 'R'
CASE WHEN campo1 = 2 THEN 'Y'
ELSE 'T' END as 'Value', campo2, campo3, campo4
FROM TABLA) as T
WHERE T.Value = 'R'

tabla(udf)ADO

Como se puede ver en el ejemplo el CommandType es de tipo Text y para recuperar los valores de la tabla
devuelta por la función se utiliza una select del udf.  Luego  cargamos los datos en una datareader y los vamos añadiendo junto con los metadatos al Datatable resul que es el que tiene el resultado final.

Existe una limitación en SQLServer 2000 para poder recuperar la fecha del sistema ya que no se admiten las funciones normales como: COURRENT_TIMESTAMP o GETDATE() ….y se produce un error al usarlos.

CREATE FUNCTION dbo.addDay()

RETURNS DATETIME 
AS 
BEGIN 
DECLARE @dt DATETIME 
SET @dt = DATEADD(DAY, 1, GETDATE()) 
RETURN @dt
END

Esto daría un error al grbar la función.  Para solucionarlo podemos utilizar lo siguiente:

Creamos una vista de este modo.. y la podremos llamar con un SELECT VAL FROM V_DATE

CREATE VIEW V_DATE
AS
SELECT GETDATE() VAL
Posteado por: eurecadigital | julio 29, 2009

Devolver una tabla en una Función de Usuario (UDF) de SQL Server

Existen varias formas de hacerlo.
La primera y más sencilla….

CREATE FUNCTION getClientesCoincidentes(@parametro1 smallint)
RETURNS TABLE
AS
RETURN (SELECT campo1, campo2 FROM miTabla WHERE campo3 = @parametro1)

Aquí se devuelve la Tabla sin definir para nada el resultado.

En este Ejemplo le daremos formato a los campos de salida (Esto es muy útil si vamos a
utilizar esta función con algún lenguaje de programación como c# en mi caso, ya quelos
parámetros llegan totalmente definidos….

CREATE FUNCTION getClientesCoincidentes(@empresa smallint)
RETURNS @Clientes TABLE (cliente int primary key, nombre varchar(128))
AS
BEGIN
INSERT @Clientes values(1, ‘Chirila’);
INSERT @Clientes values(2, ‘Pesquete’);
INSERT @Clientes values(3, ‘Macuan’);
RETURN
END

Además de definir la Tabla resultante y todos sus campos, insertaremos los registros
a devolver por el sistema.

Para hacer una llamada desde Transac SQL sería así:
SELECT * FROM dbo.getClientesCoincidentes(1)

SELECT *
FROM dbo.getClientesCoincidentes(1, ‘%%’, ‘%MUNARRIZ%’, ‘%%’, ‘%%’, ‘%%’)

Para recuperar estos valores desde .Net aquí tenemos un ejemplo

PD: Este editor es una basura, haber si voy mejorando mis entradas….

Posteado por: eurecadigital | julio 7, 2009

Patrón Singleton

Este es un patrón muy utilizado que se usa para conseguir que únicamente se pueda acceder a una instancia de una determinada clase.

Un ejemplo.

public class MiClase
{
#region Patrón Singleton

static MiClase instance = null;
public static MiClase Instance
{
get
{
if (instance == null)
{
instance = new MiClase();
}
return instance;
}
}
#endregion
}
private MiClase()
{
InitializeComponent();
}

Nota importante: El constructor de la clase ha de ser privado, para no poder hacer una instancia de la forma tradicional.

Ahora se hará de este modo:

MiClase boo = MiClase.Instance;

Older Posts »

Categorías