Esta consulta muestra una lista de los informes que mas cuestan de sacar por tiempo. Con esto podemos determinar que informes son los más pesados e intentar optimizarlos.
SELECT EL.UserNAme,Name Informe, b.path Ruta, Parameters Parametros,
FORMAT Formato,TimeStart Inicio, TimeEnd Fin, ByteCount,
(TimedataRetrieval+Timeprocessing+TimeRendering)/1000 AS Seg_TiempoTotal
FROM
[ReportServer].[dbo].[ExecutionLog] EL
JOIN [ReportServer].[dbo].[CATALOG] b
ON EL.reportid = b.itemid
--WHERE Name =@INFORME
ORDER BY (TimedataRetrieval+Timeprocessing+TimeRendering)/1000 DESC
jueves, 10 de abril de 2014
jueves, 3 de abril de 2014
Leer active directory desde SQL
Para acceder desde SQL al LDAP hay que linkar nuestro servidor del Active directory con el servidor de SQL donde queremos hacer la consulta.
La lista de campos disponibles desde el LDAP la podeis encontrar en el siguiente link: lista de campos
Lo primero es linkar el servidor de la siguiente manera_
Exec
sp_addlinkedserver 'ADSI'
, 'Active Directory Service Interfaces'
, 'ADSDSOObject'
, 'adsdatasource'
Le ponemos un usuario del dominio para que tenga acceso, bien con la instrucción:
EXEC sp_addlinkedsrvlogin 'ADSI', 'false', NULL, 'UsuarioDominio'
O desde las propiedades de la conexión creada (Servidores Vinculados)
En caso de que tengas el "Ad Hoc Distributed Queries" desabilitado, entonces corre esto para habilitarlo:
sp_configure 'show advanced options'
, 1
reconfigure
go
sp_configure 'Ad Hoc Distributed Queries'
, 1
reconfigure
go
Para ejcutar las consultas, se hace utilizando OpenQuery y de la siguiente manera:
SELECT * FROM OpenQuery(ADSI, 'SELECT physicalDeliveryOfficeName,sAMAccountName,cn,Name,displayName, sn,givenName,initials,moniker, personalTitle,generationQualifier ,userPrincipalName ,distinguishedName ,adsPath FROM ''LDAP://DC=mi-dominio,DC=local'' WHERE objectCategory=''user'' ')
La lista de campos disponibles desde el LDAP la podeis encontrar en el siguiente link: lista de campos
Lo primero es linkar el servidor de la siguiente manera_
Exec
sp_addlinkedserver 'ADSI'
, 'Active Directory Service Interfaces'
, 'ADSDSOObject'
, 'adsdatasource'
Le ponemos un usuario del dominio para que tenga acceso, bien con la instrucción:
EXEC sp_addlinkedsrvlogin 'ADSI', 'false', NULL, 'UsuarioDominio'
O desde las propiedades de la conexión creada (Servidores Vinculados)
En caso de que tengas el "Ad Hoc Distributed Queries" desabilitado, entonces corre esto para habilitarlo:
sp_configure 'show advanced options'
, 1
reconfigure
go
sp_configure 'Ad Hoc Distributed Queries'
, 1
reconfigure
go
Para ejcutar las consultas, se hace utilizando OpenQuery y de la siguiente manera:
SELECT * FROM OpenQuery(ADSI, 'SELECT physicalDeliveryOfficeName,sAMAccountName,cn,Name,displayName, sn,givenName,initials,moniker, personalTitle,generationQualifier ,userPrincipalName ,distinguishedName ,adsPath FROM ''LDAP://DC=mi-dominio,DC=local'' WHERE objectCategory=''user'' ')
jueves, 27 de marzo de 2014
Imagenes externas en Reporting Services
En una red corporativa, podemos definir en los informes de reporting las imágenes como externas y darles la ruta donde se encuentran para que el servidor de informes las renderice, se hace de la siguiente manera:
file://datos/ImagenesProductos/Historico/imagen.jpg
file://datos/ImagenesProductos/Historico/imagen.jpg
jueves, 20 de marzo de 2014
Split en Reporting Services
Para utilizar la función de Split en Reporting Services y combinar así nuestra función de Web Services con Reportin Services, es muy útil la función Split de Reporting Services cuya definicón es la siguiente:
CDec(Split(Fields!RESULTADO.Value,"|")(1))
CDec(Split(Fields!RESULTADO.Value,"|")(1))
jueves, 13 de marzo de 2014
Arreglo de la funcion pasar filtros de navision a SQL
Utilizando la función pasar filtros de navision a SQL he detectado algunas deficiencias.
Donde pone :
SET @From = substring(@parFilter, @IndexToRead + 2, @NextIndexToRead - (@IndexToRead + 1))
Poner :
if LEN(@parFilter) = @NextIndexToRead
BEGIN
SET @From = substring(@parFilter, @IndexToRead + 2, @NextIndexToRead - (@IndexToRead + 1))
END
ELSE
BEGIN
SET @From = substring(@parFilter, @IndexToRead + 2, @NextIndexToRead - (@IndexToRead + 2))
END
Donde pone :
SET @From = substring(@parFilter, @IndexToRead + 2, @NextIndexToRead - (@IndexToRead + 1))
Poner :
if LEN(@parFilter) = @NextIndexToRead
BEGIN
SET @From = substring(@parFilter, @IndexToRead + 2, @NextIndexToRead - (@IndexToRead + 1))
END
ELSE
BEGIN
SET @From = substring(@parFilter, @IndexToRead + 2, @NextIndexToRead - (@IndexToRead + 2))
END
jueves, 27 de febrero de 2014
Pasar BigText a XML en Navision
¡La de problemas que me he encontrado para trabajar con los BigText en Navision!.
Su manejo no es intuitivo y se necesita de un poco de conocimiento previo a la hora de utilizarlo.
En particular, mi necesidad de las variables del tipo BigText surgen en un proyecto en el que desde un servidor de navision consumia los web services de otro servidor de Navision. En futuros posts comentare los pormenores de este proyecto, pero el post actual es para comentar uno de los quebraderos de cabeza que mas amargado me ha tenido.
En un determinado momento y por necesidades varias, me veo en el plan de transformar un BigText a XML. Sencillo, ¿No? aqui por ejemplo hay una solucion para leer bigtext y pasarlo a XML.
Pues bien, así utilice mi variable BigText, poniendo FORMAT() para que me leyese el contenido y en principio me funciono estupendamente.
Pero no podia ser tan bonito, si leemos la definicion de la funcion format vemos que indica que es para variables de tipo simple ysi leemos la definicion del tipo de datos BIGTEXT vemos que es compleja. Por lo que en teoria no deberia de funcionar, pero funciona!!!.
ERROR!!!!!!!!
No funciona!!!!!!!!!!
Bueno, para ser correctos, funciona cuando el BigText no contiene muchos caracteres, el error que da es el de Excedido el tamaño del bufer.
Por lo que la única solución correcta es la de utilizar InStream y OutStream.
Por lo que en realidad se deberia hacer así:
XmlDocPasado.async := FALSE;
TempBlob.HTML.CREATEOUTSTREAM(ostream);
BTPasado.WRITE(ostream);
TempBlob.CALCFIELDS(HTML);
TempBlob.HTML.CREATEINSTREAM(istream);
XmlDocPasado.load(istream);
Ocurre exactamento lo mismo con la variable Automation 'Navision Attain Hash 1.0'.BSTRConverter y su metodo BSTR. PArece que con este metodo nos va a devolver un bonito chorro de carácteres para pasar a nuesto XML y idem de idem, Excedido el tamaño del bufer.
Su manejo no es intuitivo y se necesita de un poco de conocimiento previo a la hora de utilizarlo.
En particular, mi necesidad de las variables del tipo BigText surgen en un proyecto en el que desde un servidor de navision consumia los web services de otro servidor de Navision. En futuros posts comentare los pormenores de este proyecto, pero el post actual es para comentar uno de los quebraderos de cabeza que mas amargado me ha tenido.
En un determinado momento y por necesidades varias, me veo en el plan de transformar un BigText a XML. Sencillo, ¿No? aqui por ejemplo hay una solucion para leer bigtext y pasarlo a XML.
Pues bien, así utilice mi variable BigText, poniendo FORMAT() para que me leyese el contenido y en principio me funciono estupendamente.
Pero no podia ser tan bonito, si leemos la definicion de la funcion format vemos que indica que es para variables de tipo simple ysi leemos la definicion del tipo de datos BIGTEXT vemos que es compleja. Por lo que en teoria no deberia de funcionar, pero funciona!!!.
ERROR!!!!!!!!
No funciona!!!!!!!!!!
Bueno, para ser correctos, funciona cuando el BigText no contiene muchos caracteres, el error que da es el de Excedido el tamaño del bufer.
Por lo que la única solución correcta es la de utilizar InStream y OutStream.
Por lo que en realidad se deberia hacer así:
XmlDocPasado.async := FALSE;
TempBlob.HTML.CREATEOUTSTREAM(ostream);
BTPasado.WRITE(ostream);
TempBlob.CALCFIELDS(HTML);
TempBlob.HTML.CREATEINSTREAM(istream);
XmlDocPasado.load(istream);
Ocurre exactamento lo mismo con la variable Automation 'Navision Attain Hash 1.0'.BSTRConverter y su metodo BSTR. PArece que con este metodo nos va a devolver un bonito chorro de carácteres para pasar a nuesto XML y idem de idem, Excedido el tamaño del bufer.
jueves, 20 de febrero de 2014
Saber si una columna concreta existe en una tabla
Estoy trabajando en un proyecto que pretende ser adaptable a varias bases de datos. En el, surge la necesidad de saber en una consulta de SQL si un campo existe en una tabla concreta o no existe.La consulta para averiguarlo es así: SELECTCASE WHEN (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'Empresa$Tabla' AND
COLUMN_NAME
= 'Columna') = 0 THEN 'NO TIENE COLUMNA Columna' ELSE 'SI TIENE COLUMNA Columna' END
Para averiguar si la Tabla existe sería así:
SELECTCASE WHEN (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES
WHERE
TABLE_NAME = 'Empresa$Tabla') = 0 THEN 'NO TIENE TABLA Empresa$Tabla' ELSE 'SI TIENE TABLA Empresa$Tabla' END
WHERE
TABLE_NAME = 'Empresa$Tabla' AND
COLUMN_NAME
= 'Columna') = 0 THEN 'NO TIENE COLUMNA Columna' ELSE 'SI TIENE COLUMNA Columna' END
Para averiguar si la Tabla existe sería así:
SELECTCASE WHEN (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES
WHERE
TABLE_NAME = 'Empresa$Tabla') = 0 THEN 'NO TIENE TABLA Empresa$Tabla' ELSE 'SI TIENE TABLA Empresa$Tabla' END
Suscribirse a:
Entradas (Atom)