Crear sentencia SQL

Las sentencias SQL o jobs SQL pueden ser una gran utilidad a la hora de implementarlas, su uso correcto a veces nos permite realizar pequeños fixers. En tutoriales anteriores hemos visto algunos ejemplos explicando su uso , pero no su funcionamiento, esto los limita a ustedes a usar las sentencia que nosotros dejamos y no poder crear sus propias sentencias.

Sql server 2000

Claro está que nuestro objetivo es que cada uno de ustedes pueda desarrollar con pequeños conocimientos grandes trabajos, y para eso estamos. Veamos un ejemplo normal de una sentencia SQL:

UPDATE Character SET energy= ('30000') WHERE energy<0

Ahora analizemos cada una de esas linas:

UPDATE: esa terminología propia , que significa "Actualizar" Character: justamente actualiza esta TABLA que pertenece a MuOnline Con solo leer esa primera linea , ya sabemos y debemos saber que la sentencia va a estar orientada a modificar alguna columna de la tabla Character.

SET energy= ('30000'): el set es otra terminología propia, nos indica para que entendemos (SET=seteo) que sucederá luego del update con la columna "energy" en este caso el STAT ENERGY va a estar en 30.000 , pero ¿Que hace que los stats vuelvan a 30.000?

WHERE energy<0 : y aca aparece lo que se conoce como un "Condicional" en este caso es directo y único, (más adelante veremos que podemos usar varios condicionales no sólo uno). En este caso el WHERE (donde) funciona asi. "Donde la energia sea menor a cero (0) Voy a escribir como se lee toda la sentencia completa para que entendamos:
Se actualizará la tabla character, seteando el stat energy a treinta mil , cuando la energia sea menor a 0
Sin duda esta sentencia se usa para cuando un pj se pasa de stat por ejemplo "32768" este regrese a un valor de "30.000", pero ¿Porque dice menor a 0?, y la respuesta es simple, porque en el SQL aparecen un número negativo o "0". Lo que habia quedado pendiente y es como mencioné anteriomente, no sólo se puede poner un condicional sino que podemos poner dos, tres, y muchos más para eso necesitas usar un AND ("y"). Entonces esto quedaría asi WHERE energy<0 AND (otra condición) por ejemplo
WHERE energy<0 AND vitality<0

En este caso la sentencia se ejecutará con éxito siempre y cuando se cumplan esas DOS condiciones , esto quiere decir que para que el stat regrese a 30.000 se deben cumplir dos condiciones. Pero tambien podemos hacer que se cumpla una u otra, para eso usamos un OR en este caso el OR (o) funciona de la siguiente manera
WHERE energy<0 OR vitality<0

Si lo leemos dice asi
Donde la enegia o la vitalidad sea menor a 0
¿Ven la diferencia? con el AND necesitamos que se cumplan dos condiciones con el OR sólo necesitamos que se cumpla una de ellas dos, con que se cumpla una la sentencia se ejecutá con exito. Ahora retomemos un poco el UPDATE Character , en este caso como trabajamos con los stats del personaje necesitamos de la tabla character pero si queremos cambiar algun dato por ejemplo de los conectados necesitamos cambiar la tabla por la MEMB_STAT , atencion si cambiamos la tabla tambien debemos cambiar la columna por alguna que exista en MEMB_STATS. Con las sentecia SQL en JOBs podemos hacer infinitas cosas, entre ellas reiniciar el server conservando las cuentas, o reiniciar los stats de los personajes, siempre hagan un backups un error de tipeo puede causar un desastre en el server.
Por ejemplo, para terminar el tema; piensen bien y usen toda la matemática que sepan antes de aplicar una sentencia SQL (o una querry), si usamos el símbolo de mayor o menor (><) tengan cuidado, por ejemplo si ponemos:
Energy<1

Si lo leemos dice "Menor" a 1 , si el stat está en 1 la sentencia no se ejecutará porque 1-0=1 y 1 sigue siendo mayor a 0, en este caso debemos usar lo que se conoce como menor e igual, sería asi:
Energy=<1

En este caso si el stat es 1 ahi si funciona correctamente la sentencia , frenaría si tenemos un 2 Otro ejemplo, para los que usan el autoreset si ponemos que el pj resetea al level 400 y escribimos esto como sentencia:
Clevel>400
Esta mal, porque
400 no es mayor a 400 es igual
Si restamos 400-400=0 matemáticamente hablando si restamos dos números y tenemos 0 eso nos indica que los dos números son IGUALES u OPUESTOS, una pequeña fórmula seria
x-x=0 entonces x=x [Siempre y cuando hablemos de (+)x.]
¿Y por qué digo que está mal? , porque nunca va a resetear ese PJ , porque su level máximo es 400 dentro del juego , y la sentencia se ejecuta si es MAYOR a 400, dos posibles soluciones o hacemos lo mismo que en el ejemplo anterior: usamos un mayor o igual (aunque seria ilógico usar un mayor porque nunca un usuario tendrá nivel mayor a 400, directamente aplicamos un igual) o podemos usar otra alternativa, si pensamos podriamos poner
Clevel>399
No se asusten nadie va a resetia en nivel 399 porque sucede lo mismo , el personaje debe ser nivel mayor a 399 si es 399 no es mayor sino igual.
Sentencia_Autoreset.sql [3 kb]

¿Necesitas ayuda? Visita www.iceventas.com y nosotros lo hacemos por ti.

Se han publicado un total de 4 comentarios en Mu Online Tutoriales :

12 de marzo de 2015, 13:50

Hola bueno lei casi todas las guias y cree unas cuantas sentencias Y me sirvieron de mucho el problema surgió cuando cree una sentencia para dar cspoints cada día a las 11.59 PM a todos los personajes
UPDATE MEMB_INFO
SET cspoints = 0 + ( 1 * ( cspoints + 1))

Ese funciona perfecto todo bien el problema surgió que a los usuarios que recién creaban su cuenta en la tabla cspoints tienen el valor de y a estos no les da nada entonces decidí crear otra sentencia para cambiar ese por un simple 1 y lo hice de la siguiente manera
UPDATE MEMB_INFO
SET cspoints = 1
WHERE cspoints < 1
Entonces simplemente no hace caso y le quite el where cspoints <1 y lo que hace es poner a todos los usuarios con cspoints en 1 como ya se dieron cuenta como no tiene condicional lo hace obviamente. Pero no logro que solo cambie a los usuarios recién creados eh intentado de muchas formas sin resultado. Estoy ya 4 días en esto jeje y por eso ahora pido una ayuda y una guia para saber que otros condicionales pueda usar desde ya muchas gracias

12 de marzo de 2015, 17:35

Anónimo : Bien, comenzemos por el principio, ¿Por qué multiplicas por 1? y más aun ¿Para que sumas cero?.
Por ejemplo 45*1 es igual a 45 y siguiendo con la misma linea, 45+0 es igual 45

Segunda parte, en tu texto redactas que cuando comienza un nuevo usuario su cuenta en la tabla tiene un valor ¿de ... ? (Te olvidaste creo el valor)

No entiendo que deseas hacer, porque has redactado lo que has echo pero te falto decirme lo que quieres hacer.
Si tu único problema es que los usuarios nuevos comienzan con un valor NULL, simplemente diseñas la tabla , y en valor predeterminado colocas 1 o el valor que deseas y guardas los cambios. De esta forma las cuentas nuevas comenzarán con un valor predeterminado en la columna de la tabla que deseas.
Saludos

13 de marzo de 2015, 19:39

Hola de nuevo si puse el cero por que supuestamente todos los usuarios nuevos empiezan con 0 y a esto le sumo 1 mas sus cspoints
Lo segundo si era n u l l extrañamente el celular no lo escribió baja
Y como hago para rediseñar tablas con las sentencias me parece interesantisimo solo se agregar tablas mas no rediseñar

14 de marzo de 2015, 7:15

Anónimo : Pero no es necesario poner ese "0+", eso no hará que los personajes comienzen con un valor 0 en dicha columna y tampoco es necesario multiplicar por 1, sumar 1 está correcto, pero ese multiplicador no tiene función.
De echo simplemente puedes hacer un test, coloca esta sentencia UPDATE MEMB_INFO
SET cspoints = cspoints + 1 y obtendrás el mismo resultado.

Sobre diseñar tablas, puedes orientarte con este tutorial http://www.muonlinetutoriales.com/2009/03/crea-la-tabla-resets.html, pero en tu caso debes aplicarlo sobre la tabla "memb_info" y sobre la columna "cspoint"
Saludos

Publicar un comentario en la entrada