Bienvenidos a nuevo tutorial, hoy aprenderemos generar secuencia de comandos SQL,
¿Para quĆ© nos sirve esto?
Esta funciĆ³n tiene infinitas utilidades, en este tutorial la usaremos para pasar "columnas" con sus respectivos tipos de datos, de una base de datos a otra.
1)En este tutorial simularemos tener dos bases de datos restauradas, a una la llamaremos "DB_Anterior" y a la otra la llamaremos "DB_Nueva"
En la DB_Anterior, simularemos tener muchas columnas en la tabla "Character" que queremos pasar a la DB_Nueva.
Entonces lo primero que haremos serĆ” ingresar a la "Db_Anterior" => "Tablas" => "Character" => "Todas las tareas" => "Generar secuencia de comandos SQL"
2)Lo que haremos en nuestra nueva ventana, serĆ” simplemente un clic en "Aceptar"
3)Ahora debemos seleccionar un lugar para guardar nuestra secuencia.
Lo que haremos serƔ en donde dice *.sql , borran el * y ponerle un nombre al archivo, en este caso lo llamarƩ muonlinetutorial.sql
Luego tildamos la opciĆ³n "Guardar"
4)Lo que hemos generado es una secuencia de comandos SQL.
En ella contenemos toda las columnas con sus propiedades (AtenciĆ³n: no contiene datos ni tampoco informaciĆ³n de su DB, para eso deben usar los anteriores tutoriales en donde vimos como exportar o importar tablas con su respectiva informaciĆ³n)
5)Entonces, en el archivo muonlinetutorial.sql tenemos todas las columnas con sus propiedades.
Si corremos esta querry en el analizador de consultas, tendremos como resultado lo siguiente:
Al correr dicha consulta, lo que hara serĆ” un drop de la tabla "Character" y crearla de nuevo con estas nuevas columnas.
Esto lo hariamos en el caso de querer mantener la originalidad de la tabla character de la DB_Anterior en la DB_Nueva.
Pero talvez lo que necesitemos sea crear algunas columnas de la DB_Anterior en la DB_Nueva, de esta forma mantendrĆamos nuestros datos actuales y anexarĆamos las columnas faltantes (Ya sea por que las necesitamos para una pĆ”gina web, o porque cambiamos de versiĆ³n, etc)
Supongamos lo siguiente:
En la Db_Anterior tenemos estas columnas:
[AccountID] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,Y en la DB_Nueva tenemos estas columnas:
[Name] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[cLevel] [int] NULL ,
[LevelUpPoint] [int] NULL ,
[Class] [tinyint] NULL ,
[Experience] [int] NULL ,
[Strength] [int] NULL ,
[Dexterity] [int] NULL ,
[Vitality] [int] NULL ,
[Energy] [int] NULL ,
[Inventory] [varbinary] (3776) NULL ,
[MagicList] [varbinary] (180) NULL ,
[Money] [int] NULL ,
[Life] [real] NULL ,
[MaxLife] [real] NULL ,
[Mana] [real] NULL ,
[MaxMana] [real] NULL ,
[MapNumber] [smallint] NULL ,
[MapPosX] [smallint] NULL ,
[MapPosY] [smallint] NULL ,
[MapDir] [tinyint] NULL ,
[PkCount] [int] NULL ,
[PkLevel] [int] NULL ,
[PkTime] [int] NULL ,
[MDate] [smalldatetime] NULL ,
[LDate] [smalldatetime] NULL ,
[CtlCode] [tinyint] NULL ,
[DbVersion] [tinyint] NULL ,
[Quest] [varbinary] (50) NULL ,
[Leadership] [int] NULL ,
[ChatLimitTime] [smallint] NULL ,
[FruitPoint] [int] NULL ,
[zs_count] [int] NULL ,
[ZY] [int] NULL ,
[FQBZ] [int] NULL ,
[FQCount] [int] NULL ,
[FQName] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[Resets] [int] NOT NULL ,
[mu_id] [int] IDENTITY (1, 1) NOT NULL ,
[SCFPCPoints] [int] NULL ,
[SCFMarried] [int] NOT NULL ,
[SCFMarryHusbandWife] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[SCFMasterLevel] [int] NOT NULL ,
[SCFMasterPoints] [int] NOT NULL ,
[SCFMasterSkills] [varbinary] (300) NULL ,
[SCFCustomQuest] [varbinary] (512) NULL ,
[SCFGensFamily] [smallint] NOT NULL ,
[SCFGensContribution] [int] NOT NULL ,
[SCFGensRank] [int] NOT NULL ,
[SCFGensDateLeave] [smalldatetime] NULL ,
[SCFGensRecvReward] [tinyint] NOT NULL ,
[Grand_Resets] [int] NOT NULL ,
[SCFMasterSkill] [varbinary] (240) NULL ,
[SCFExtInventory] [tinyint] NOT NULL ,
[SCFUpdatedPShop] [tinyint] NOT NULL ,
[SCFSealItem] [int] NOT NULL ,
[SCFSealTime] [int] NOT NULL ,
[SCFScrollItem] [int] NOT NULL ,
[SCFScrollTime] [int] NOT NULL
[AccountID] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,Como pueden observar, la DB_Anterior posee mayor cantidad de columnas que la DB_Nueva, entonces para pasar solamente las columnas que faltan en esta Ćŗtlima lo que haremos serĆ” lo siguiente:
[Name] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[cLevel] [smallint] NULL ,
[LevelUpPoint] [int] NULL ,
[Class] [tinyint] NULL ,
[Experience] [int] NULL ,
[Strength] [smallint] NULL ,
[Dexterity] [smallint] NULL ,
[Vitality] [smallint] NULL ,
[Energy] [smallint] NULL ,
[Inventory] [varbinary] (760) NULL ,
[MagicList] [varbinary] (60) NULL ,
[Money] [int] NULL ,
[Life] [real] NULL ,
[MaxLife] [real] NULL ,
[Mana] [real] NULL ,
[MaxMana] [real] NULL ,
[MapNumber] [smallint] NULL ,
[MapPosX] [smallint] NULL ,
[MapPosY] [smallint] NULL ,
[MapDir] [tinyint] NULL ,
[PkCount] [int] NULL ,
[PkLevel] [int] NULL ,
[PkTime] [int] NULL ,
[MDate] [smalldatetime] NULL ,
[LDate] [smalldatetime] NULL ,
[CtlCode] [tinyint] NULL ,
[DbVersion] [tinyint] NULL ,
[Quest] [varbinary] (50) NULL ,
[Reset] [int] NOT NULL
Anteriormente habĆamos generado una secuencia de comandos SQL a la cual yo llame muonlinetutoriales.sql, abrimos eso con el notepad o cualquier procesador de textos y de manera inmediata borramos lo siguiente:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Character]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)De esta forma evitamos que al correr la querry no nos borre la tabla character de la DB_Nueva
drop table [dbo].[Character]
GO
CREATE TABLE [dbo].[Character] (
Luego al final borramos esto que serĆa el cierre del cĆ³digo
) ON [PRIMARY]Literalmente nos quedarĆa algo asi:
GO
6)Lo que vimos entonces en la anterior imagen son tan sĆ³lo las columnas (Sin instruciones).
Lo que debemos hacer ahora, es una simple observaciĆ³n comparando las columnas que nos sobran en la DB_Anterior y que nos faltan en la DB_Nueva, en este caso es muy fĆ”cil, si prestan atenciĆ³n verĆ”n que en la DB_Anterior tenemos un listado de 29 columnas mĆ”s, estas son las siguientes:
[mu_id] [int] IDENTITY (1, 1) NOT NULL ,
[SCFPCPoints] [int] NULL ,
[SCFMarried] [int] NOT NULL ,
[SCFMarryHusbandWife] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[SCFMasterLevel] [int] NOT NULL ,
[SCFMasterPoints] [int] NOT NULL ,
[SCFMasterSkills] [varbinary] (300) NULL ,
[SCFCustomQuest] [varbinary] (512) NULL ,
[SCFGensFamily] [smallint] NOT NULL ,
[SCFGensContribution] [int] NOT NULL ,
[SCFGensRank] [int] NOT NULL ,
[SCFGensDateLeave] [smalldatetime] NULL ,
[SCFGensRecvReward] [tinyint] NOT NULL ,
[Grand_Resets] [int] NOT NULL ,
[SCFMasterSkill] [varbinary] (240) NULL ,
[SCFExtInventory] [tinyint] NOT NULL ,
[SCFUpdatedPShop] [tinyint] NOT NULL ,
[SCFSealItem] [int] NOT NULL ,
[SCFSealTime] [int] NOT NULL ,
[SCFScrollItem] [int] NOT NULL ,
[SCFScrollTime] [int] NOT NULL
[Leadership] [int] NULL ,
[ChatLimitTime] [smallint] NULL ,
[FruitPoint] [int] NULL ,
[zs_count] [int] NULL ,
[ZY] [int] NULL ,
[FQBZ] [int] NULL ,
[FQCount] [int] NULL ,
[FQName] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL
7)Esas columnas las aislamos del cĆ³digo y las pegamos en nuestro "Analizador de consultas" (Recuerden seleccionar arriba la base de datos en donde quieran anexar o agregar las columnas)
Luego delante del nombre de cada columna agregan lo siguiente:
ALTER TABLE character ADD¿QuĆ© funciĆ³n tiene este fragmento?
Esto lo que harĆ” serĆ” "Modificar/Alterar" la tabla character agregando esas columnas que tenemos en el listado"
Importante: si copiaron las columnas del archivo .txt es posible que tengan una "," al final de cada columna, eso deberƔn borrarlo tambiƩn sino al correr la querry tendrƔn un error.
Una vez que finalizamos, hacemos un clic en boton "Ejecutar" o aprentan "F5"
Con eso hemos creado todas las columnas faltantes en nuestra DB_Nueva.
Si al momento de ejecutar la consulta, nos arroja este error:
ALTER TABLE sĆ³lo permite agregar columnas que contengan valores Null o que tengan la definiciĆ³n DEFAULT. La columna 'El nombre de la columna' no se puede agregar a la tabla 'El nombre de tu tabla' porque no permite valores Null y no especifica la definiciĆ³n DEFAULT.Lo que deben hacer es buscar la columna que menciona el error (Este nombre dependerĆ” de la tabla con la que esten trabajando) y agregar despues del NULL lo siguiente
DEFAULT 0Entonces, por ejemplo si tenemos la siguiente columna con el error
ALTER TABLE character ADD [SCFGensFamily] [smallint] NOT NULLLe agregamos lo mencionado anteriormente de modo tal que nos quedarĆ” asi:
ALTER TABLE character ADD [SCFGensFamily] [smallint] NOT NULL DEFAULT 0Recuerden que antes de trabajar deben generar backups de sus bases de datos por si algo les sale mal.
Tambien mĆ”s adelante trabajaremos esto de manera mĆ”s simplificada sin necesidad de agregar tantas instrucciĆ³nes ni complicarnos con la sintaxĆs.