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

sábado, 8 de noviembre de 2014

RESOLVER PROBLEMA DE COLLATION EN EL JOIN DE UNA CONSULTA EN SQL SERVER

sábado, 8 de noviembre de 2014

Ya había visto ese mensaje antes, así que sabía que estaba mal. Las colaciones para las dos tablas fueron inconsistentes. Como se trataba de una base de datos que se actualizó desde otra versión de SQL, y utiliza los objetos de un tercero, no me sorprendió que se utilizara una intercalación específica. Yo había creado la tabla "b" por mí mismo, usando los valores predeterminados de las bases de datos, y no coincidieron con el objeto.

Hice una búsqueda rápida ya que no podía recordar la sintaxis exacta de la cláusula para añadirlo a mi consulta. Acabé en el blog de un amigo y leí en ese post: No se puede resolver el conflicto de intercalación entre "SQL_Latin1_General_CP1_CI_AS" y "Modern_Spanish_CI_AS" de la operación equal to.

La solución es fácil, añadir un COLLATE DATABASE_DEFAULT a la condición de Join para forzar una intercalación específica sobre el campo. Yo fácilmente podría haber añadido un COLLATE Latin1_General_CI_AS también, pero ya que sabía que el segundo campo era por defecto el de base de datos actual, hice esto:

select TOP 10 * 
 from usuarios a
   inner join baneados b
   on a.idusuario COLLATE DATABASE_DEFAULT = b.idusuario

Leer mas

lunes, 5 de julio de 2010

Como filtrar un campo Datetime en mi consulta teniendo como parámetro una fecha simple en SQL Server

lunes, 5 de julio de 2010

Poseemos una tabla en la que ademas de otros campos esta incluido la fecha, pero resulta que lo hemos declarado como tipo de dato "DateTime", y que por defecto, al momento de crear o modificar el registro, este campo incluye ademas la hora, minutos, segundos y milisegundos (2007-06-08 12:23:56.234) en la que fue actualizada.

Esto puede resultar un dolor de cabeza al momento de realizar una consulta en la que tengamos como criterio de selección este campo fecha, ya que generalmente lo filtramos o parametrizamos como fecha y formato distinto: Select * from compras where fecha='08/06/2007'. Y el resultado de esto seria: Maldita sea, no tengo registros.

Bueno os traigo una solución sencilla por medio de una función hecha en SQL Server en la que podeis filtrais sin mas apuros que el de ejecutarla:

CREATE FUNCTION [dbo].[CONVERT_FECHA_SIMPLE]
(
@FECHA DATETIME
)
RETURNS SMALLDATETIME
AS
BEGIN
RETURN CAST(CONVERT(varchar, @FECHA, 103) AS DATETIME)
END

Bueno, después de codificar esto, acá lo único que deberais haceis en tu procedimiento almacenado en el cual harás la tan ansiada consulta es llamar a la función convert_fecha_simple desde el campo criterio, asi, mirais:

Select * from Compras where dbo.convert_fecha_simple(fecha)='08/06/2007'

Leer mas

viernes, 2 de julio de 2010

Realizar una búsqueda en una tabla por cada una de sus columnas en SQL Server

viernes, 2 de julio de 2010

En nuestro formulario de vb.net tenemos la idea de mostrar en una lista o en un grid los resultados de una búsqueda específica de los registros de una tabla y para ello tendríamos que filtrar las palabras clave según el tipo de columnas que estas contienen.

Esto podría ser de mucha utilidad para aquellos que utilizan una o pocas tablas en SQL Server para localizar los registros deseados y también para aquellos que quieren mostrar los resultados haciendo uso de un solo criterio y no complicarse con un sinfín de controles específicos para cada palabra o dato clave.

Todo esto se resume en realizar un procedimiento almacenado en SQL Server en la que ¡OJO! solo se pondrá como ejemplo el procedimiento en el cual se almacenarían los datos del nombre y el alias de las columnas asignadas en las tablas o consultas donde se realizará la búsqueda de los registros, y esta obvio que aparte ya tendras un procedimiento o vista en la cual consultaras los registros.

Codigo en SQL Server:

CREATE PROCEDURE SP_COLUMNAS_TABLA
@TABLA VARCHAR(20)
AS
BEGIN
--CREAMOS UNA TABLA TEMPORAL EN LA CUAL ALMACENAREMOS LOS NOMBRES DE LAS COLUMNAS Y SU ALIAS POR CADA TABLA ELEJIDA
DECLARE @TABLA_COLUMNAS TABLE(COLUMNA varchar(50), DESCRIPCION varchar(50))
SET NOCOUNT ON
DECLARE @COLUMNA AS VARCHAR(50)
DECLARE @ARRAY_COL AS NVARCHAR(500)
DECLARE @DESCRIPCION AS VARCHAR(50)
DECLARE @ARRAY_DES AS NVARCHAR(500)
IF @TABLA='PERSONAS' BEGIN
SET @ARRAY_COL='COD_PERSONA,NOMBRE,FECHA_NACIMIENTO,' --NOMBRE DE LAS COLUMNAS EN LA TABLA1 QUE DESEAMOS FILTRAR EN LA BUSQUEDA, OVIAMENTE ESTA TABLA PODRIA TENER MAS COLUMNAS, SOLO SELECCIONAMOS LAS QUE QUEREMOS MOSTRAR
SET @ARRAY_DES='CODIGO,NOMBRE,FECHA DE NAC,' --ALIAS DE LAS COLUMNAS EN ORDEN CORRESPONDIENTE AL NOMBRE, DE ESTA FORMA SE DESCRIBIRAN AL MOMENTO DE MOSTRARLOS EN UN CONTROL DEL FORMULARIO
END
IF @TABLA='CIUDADES' BEGIN
SET @ARRAY_COL='COD_CIUDAD,NOMBRE,'
SET @ARRAY_DES='CODIGO,NOMBRE,'
END
--puedes elejir mas tablas incluso columnas de una consulta


IF @TABLA='CIUDAD_PERSONAS' BEGIN
SET @ARRAY_COL='CIUDADES.NOMBRE,PERSONAS.NOMBRE,'
SET @ARRAY_DES='CIUDAD,PERSONA,'
END

WHILE LEN(@ARRAY_COL)<>0
BEGIN
SET @COLUMNA =SUBSTRING(@ARRAY_COL,0, CHARINDEX(',',@ARRAY_COL))
SET @ARRAY_COL =SUBSTRING(@ARRAY_COL,CHARINDEX(',',@ARRAY_COL,0)+1,LEN(@ARRAY_COL))
SET @DESCRIPCION =SUBSTRING(@ARRAY_DES,0, CHARINDEX(',',@ARRAY_DES))
SET @ARRAY_DES =SUBSTRING(@ARRAY_DES,CHARINDEX(',',@ARRAY_DES,0)+1,LEN(@ARRAY_DES))
INSERT INTO @TABLA VALUES(@COLUMNA, @DESCRIPCION)
END
SELECT * FROM @TABLA_COLUMNAS
END

Pero si tu eres de lo que no quiere complicarse aun mas con este código, y quieres de un porraso todas las columnas de una tabla y que el usuario elija de todas que campo filtrar en la busqueda pues te recomiendo usar este codigo en SQL Server:

Select name from syscolumns where id=object_id('Nombre_Tabla')


Bueno esta claro que acá no pondré el código en vb.net para invocar este procedimiento y efectuar la secuencia de la búsqueda, eso queda a criterio de cada programador, aca solo les di una idea de como podrían solucionarlo de forma práctica la búsqueda en una tabla o consulta específica. El filtro de búsqueda mas o menos quedaría de esta forma:



Leer mas

Buscar

 
Copyright © 2009 .Net Solucion