Mostrando entradas con la etiqueta SQLServer. Mostrar todas las entradas
Mostrando entradas con la etiqueta SQLServer. Mostrar todas las entradas

martes, 9 de noviembre de 2010

SQLServer. Extraer la fecha de un campo DateTime

Cuando buscas cómo hacerlo hay un montón de gente que utiliza el CONVERT, que formatea la fecha de múltiples maneras en función de un parámetro:

SELECT CONVERT(VARCHAR(10),<campofecha>,111)

El problema es que el resultado del CONVERT es una cadena, y si se quiere tratar como fecha hay que hacerle un segundo CAST a DateTime.

La manera "elegante" de resolverlo, y yo me huelo que bastante más eficiente, es la siguiente:

SELECT DATEADD(D, 0, DATEDIFF(D, 0, <campofecha>))

Hale!

martes, 16 de diciembre de 2008

SQLServer. Columna(s) que forman la clave principal

Hola.

Bonita y elegante SQL que, tirando de las vistas de sistema, obtiene el nombre de las columnas que componen la clave principal (primary key para los amigos) de una tabla (en este caso la tabla 'PERSONA'):

SELECT i.name AS nombre, ic.column_id as numCampo, c.name as nombreCampo
FROM (sys.indexes AS i inner join sys.index_columns AS ic on i.object_id=ic.object_id
and i.index_id=ic.index_id) inner join sys.columns c on i.object_id=c.object_id
and ic.column_id=c.column_id
where i.object_id = OBJECT_ID('dbo.PERSONA') and i.is_primary_key=1


Hale!

jueves, 31 de enero de 2008

Numerar las filas de una tabla (se puede utilizar para implementar la paginación de un datalist)

Para ello se utiliza una claúsula nueva de SQL SERVER 2005 para numerar las filas : ROW_NUMBER() OVER (ORDER BY campo)

Si queremos filtrar por el número de fila es necesario crear una tabla temporal mediante la instrucción : WITH tabla_temporal AS (sentencia SQL)

En el ejemplo siguiente creamos un procedimiento almacenado que tiene dos parámetros para indicar el rango de filas que queremos devolver.

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[prueba]

@inicio INT,
@fin INT
AS
BEGIN

SET NOCOUNT ON;

WITH consultaTMP AS
(SELECT pro_id, ROW_NUMBER() OVER (ORDER BY pro_id) AS posicion
FROM dbo.provincias)

SELECT pro_id, posicion
FROM consultaTMP
WHERE posicion BETWEEN @inicio AND @fin

END

lunes, 17 de diciembre de 2007

LLamar a un procedimiento almacenado que devuelve valor a través de RETURN

Como sabemos una de las maneras de que un procedimiento almacenado de SqlServer nos devuelva un valor (entero) es usando el RETURN:

CREATE PROCEDURE nombreProc
@Parametro nvarchar(50)
AS
BEGIN
  IF EXISTS (SELECT Id from Tabla where campo=@Parametro)
    begin
      RETURN 1
    end
    else begin
      RETURN 0
    end
END

Para llamar a este procedimiento desde el .net y obtener el valor devuelto hay que crearle un parámetro específico del tipo ReturnValue, aparte de los definidos en el procedimiento:

cmd.CommandType = Data.CommandType.StoredProcedure
cmd.CommandText = "nombreProc"
cmd.Parameters.Clear()
cmd.Parameters.Add(New SqlParameter("@Parametro", "valor"))
Dim retValue As New SqlParameter("@RETURN_VALUE", Data.SqlDbType.Int)
retValue.Direction = Data.ParameterDirection.ReturnValue
cmd.Parameters.Add(retValue)
cmd.ExecuteScalar()
Dim resultado As Integer = Convert.ToInt32(retValue.Value)
If resultado = 1 Then
  ...
  ...
Else
  ...
  ...
End If

miércoles, 12 de diciembre de 2007

SQLServer. Transacciones en procedimientos almacenados

Ejemplillo de cómo implementar un procedimiento almacenado con operaciones dentro de una transacción y controlar la excepción para tirar un rollback:

CREATE PROCEDURE nombreProcedimiento
    @parametro1 bla, bla...
AS
BEGIN
  BEGIN TRY
    BEGIN TRANSACTION
    INSERT ...
    UPDATE ...
    (etc...)
    COMMIT
  END TRY
  BEGIN CATCH
    IF @@TRANCOUNT > 0
      ROLLBACK
      DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
      SELECT @ErrMsg = ERROR_MESSAGE(),
      @ErrSeverity = ERROR_SEVERITY()
      RAISERROR(@ErrMsg, @ErrSeverity, 1)
    END CATCH
END

miércoles, 5 de diciembre de 2007

Vincular servidores remotos en SQLServer

Al grano:

Ver los servidores que tienes vinculados:

exec sp_linkedservers


Añadir un nuevo servidor remoto a tus vínculos:


EXEC sp_addlinkedserver
@server='nombreVinculo',
@srvproduct='',
@provider='SQLNCLI',
@datasrc='IPRemotaServidor'


Añadirle credenciales para poder acceder a un servidor remoto:

EXEC sp_addlinkedsrvlogin 'nombreVinculo', 'false', NULL, 'usuarioBDRemota', 'claveBDRemota'


Y hale, a tirarle al servidor vinculado.

Más info en el MSDN, aquí y aquí.
Enlace a un blog que lo explica bastante bien, acá.