viernes, 21 de marzo de 2014

CommandType.Text & @@NESTLEVEL

Bueno, me ha llevado un rato encontrar la solución (los problemas salen solos)
Situación:
  • Tenía dos procedimientos, uno llamaba al otro los dos retornaba un valor. En el segundo controlaba el @@NESTLEVEL para que al llamar al primero el resultado fuera el suyo y no el del segundo.
  • Por supuesto el server management funcionaba todo correctamente
  • Cuando lo ejecutaba por código, al llamar solo al segundo el @@NESTLEVEL tenía como valor 3 y no lo entendía

Mi problema estaba en como se hacía la consulta por código y el problema estaba aquí. Cuando llamas a un procedimiento usando CommandType.Text y asociando parámetros el @@NESTLEVEL es 3 : documentación del SQLServer lo dice “sp_executesql, el valor devuelto es 2 +”

Por si lo quieres probar
SQL Server
CREATE PROCEDURE [dbo].[usp_InnerProc] @miparametro INT AS
    SELECT @@NESTLEVEL AS 'Inner Level'; 

  Codigo 


    Dim connectionString, sServidor, sBase, cUsuario, cPassword As String
        connectionString = "data source = " & sServidor & "; initial catalog = " & sBase & "; user id = " & cUsuario & "; password = " & cPassword & ";"

        Dim cad1 As String
        Dim cad2 As String
        Dim cad3 As String
        Using connection As New SqlClient.SqlConnection(connectionString)
            connection.Open()
            Dim command As SqlCommand = New SqlCommand("", connection)
            Dim drDatosSql As SqlClient.SqlDataReader
            command.CommandText = "usp_InnerProc 1 "
            command.CommandType = CommandType.Text
            drDatosSql = command.ExecuteReader()
            drDatosSql.Read()
            cad1 = drDatosSql.GetValue(0)
            command.Dispose()
            drDatosSql.Close()
            ' cad =1

            Dim command2 As SqlCommand = New SqlCommand("", connection)
            Dim drDatosSql2 As SqlClient.SqlDataReader
            command2.CommandText = "usp_InnerProc"
            command2.CommandType = CommandType.StoredProcedure
            Dim idParam As SqlParameter = New SqlParameter("@miparametro", SqlDbType.Int) With {.Value = 1}
            command2.Parameters.Add(idParam)
            drDatosSql2 = command2.ExecuteReader()
            drDatosSql2.Read()
            cad2 = drDatosSql2.GetValue(0)
            drDatosSql2.Close()
            ' cad2 =1

            Dim command3 As SqlCommand = New SqlCommand("", connection)
            Dim drDatosSql3 As SqlClient.SqlDataReader
            command3.CommandText = "usp_InnerProc @miparametro"
            command3.CommandType = CommandType.Text
            Dim idParam3 As SqlParameter = New SqlParameter("@miparametro", SqlDbType.Int) With {.Value = 1}

            command3.Parameters.Add(idParam3)
            drDatosSql3 = command3.ExecuteReader()
            drDatosSql3.Read()
            cad3 = drDatosSql3.GetValue(0)
            ' cad3 =3
        End Using

viernes, 14 de febrero de 2014

RecordCount siempre vale -1

Seguro que muchos programadores de vb6 esto lo darán por obvio, pero si estas en mi situación de toma un código y haz que funcione bien en SqlSever tal vez no sea tan evidente.
Durante la migración
Dim total as Integer
sSql = "SELECT distinct nif FROM miTabla "
miRs.Open sSql, gConSQL
total = miRs.RecordCount
Con la conexión vieja funcionaba pero con la conexión a sqlserver no ¿? el resultado era siempre el mismo -1 y tenía datos!!!
Solución
Dim  total as Integer 
sSql = "SELECT distinct nif FROM  miTabla "
miRs.Open sSql, gConSQL, , adOpenStatic
total = miRs.RecordCount
http://www.lawebdelprogramador.com/foros/Visual_Basic_ADO/1064827-RecordCount_SQL...ante_query__.html

viernes, 7 de febrero de 2014

Servidores vinculados - update




Tengo dos servidores
Servidor1
Servidor2

Están vinculados, es decir desde el servidor 1 puedo acceder al servidor2.
Si ejecuto esta sentencia en el servidor1

select servidor2.mibase.dbo.mitabla.columna1  from servidor2.mibase.dbo.mitabla 

Mens. 4104, Nivel 16, Estado 1, Línea 1
El identificador formado por varias partes "servidor2.mibase.dbo.mitabla.columna1" no se pudo enlazar.

Pero esto funciona:select mitabla.columna1  from servidor2.mibase.dbo.mitabla 

Bien alguno estará pensado que estoy un poco torpe, porque lo podría solucionan con alias. Eso sería cierto si no fuera porque lo quería en un update y era algo más complejo que todo eso

UPDATE servidor2.mibase.dbo.mitabla  SET
 columna2 = (SELECT a.valor1 FROM #tablatemporal a WHERE mitabla.columan1 = a.c1)
 WHERE columan1 IN (SELECT c1 FROM #tablatemporal)

viernes, 31 de enero de 2014

Secuencias Sql Server

Hablando sobre cuál sería la mejor forma de poner un contador de visitas. Descubrí las secuencias. Claro si eres de Oracle esto se sonara como algo normal, pero si vives del SQL SERVER tal vez no te suene tan evidente y lo primero que pienses sea en una tabla con una columna IDENTITY.

Aquí te dejo como construir un  secuencia.. si lo único que quieres es poner un contador de visitas tampoco hay que complicarse con una tabla no??

http://www.guillesql.es/Articulos/Secuencias_SQLServer2012.aspx

http://blogs.msdn.com/b/askjay/archive/2012/10/08/sequence-objects-in-sql-2012-and-sql-2008.aspx

viernes, 24 de enero de 2014

SqlServer date a string yyyymm



Chorra del dia, estoy en  SQLSERVER un campo de tipo date, pero quiero obtener una cadena con formato yyyymm (si el mes es 9 quiero 09 ).



select fecha,  YEAR(fecha ), MONTH(fecha),  FORMAT( MONTH(fecha),'00') , CONCAT (YEAR(fecha ), FORMAT( MONTH(fecha),'00')) 
from mitabla


sábado, 18 de enero de 2014

Parámetros opcionales y sus problemas



Vale culpa mía, tengo mucha tendencia a usar parámetros opcionales. Y para intentar arreglar un problema de otra cosa, en una dll puse uno, está dll se usa en mucho proyectos.

El problema, que si se compila nuevamente el proyecto que lo usa no hay problema, pero si otra dll lo usa da problemas en ejecución.

La explicación no puede estar más claro que en este link
http://www.variablenotfound.com/2010/05/parametros-opcionales-usense-con.html

jueves, 2 de enero de 2014

Cookies


Después de mirar, mucho esta el tema de las cookies, en realidad no creo que alguien que tenga un blog, sin publicidad y que únicamente usa el Google Analytics para ver quien usa el blog, debamos cumplir con esta exigencia. Pero como pueden resultar contradictoria la información, veamos como curarnos en salud

http://www.doctormetrics.com/2012/06/13/cumplir-ley-cookies-google-analytics/#.UsWcnbTJKQQ

http://nuriagarciacastro.es/guia-legal-del-blog-v-el-caso-de-google-analytics/

He modificado mi aviso:
Por : http://www.focoblogger.com/2014/02/implementar-aviso-de-cookies-en-blogger.html

Es lo mismo pero de distinta forma.

El año pasado tenia este aviso
En la plantilla del blog, añade un Gadget HTML/Javascript

Copiar el código que te da http://sitebeam.net/cookieconsent/code/

El mio está copiado de alli directamente (más o menos)


<!-- Begin Cookie Consent plugin by Silktide - http://silktide.com/cookieconsent -->
<link rel="stylesheet" type="text/css" href="http://assets.cookieconsent.silktide.com/current/style.min.css"/>
<script type="text/javascript" src="http://assets.cookieconsent.silktide.com/current/plugin.min.js"></script>
<script type="text/javascript">
// <![CDATA[
cc.initialise({
            cookies: {
                        analytics: {}
            }

});
// ]]>
</script>
<!-- End Cookie Consent plugin -->