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

sábado, 12 de noviembre de 2011

SQL SERVER - Consulta hardcodeada que devuelve el ID de la fila insertada

Esta pregunta se hizo en los foros, y algunos decían que no era posible recuperar el ID de la fila insertada, esto es un error porque sí se puede recuperar ese valor. Por ese motivo surgió este post.

Algunos dirán: "para qué hardcodeas la consulta SQL? simplemente haz un procedimiento almacenado y asunto solucionado".
La verdad que a veces necesitamos este tipo de soluciones que no siempre parecen ser las óptimas, no en vano tenemos la opción de hardcodear Guiño

Además, una consulta hardcodeada también puede evitar las inyecciones SQL si pasas la información mediante parámetros.

Ahora sí, vamos al ejemplo.
1.- Abrimos el SQL SERVER Y creamos una tabla llamada cmon_group, con este script:
CREATE TABLE [dbo].[cmon_group]
(
    [groupid] [int] IDENTITY(1,1) NOT NULL,
    [title] [varchar](150) NULL,
    [description] [varchar](500) NULL,
    [icon] [varchar](50) NULL,
    CONSTRAINT [pk_cmon_group] PRIMARY KEY CLUSTERED ( [groupid] ASC )
)
2.- Abrimos Visual Studio y creamos un nuevo proyecto de tipo ASP.NET con Visual Basic, agregamos una páginas aspx y ponemos este código:
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim Title As String = "title"
        Dim description As String = "description"
        Dim icon As String = "icon"

        Dim connectionString As New SqlClient.SqlConnection("LA_CADENA_DE_CONEXION_VA_AQUI")
        Dim t_sql As String = "INSERT INTO [cmon_group](Title,description,icon) "
        t_sql &= "VALUES(@title,@description,@icon) "
        t_sql &= "SET @groupid = SCOPE_IDENTITY()"

        Dim command As New SqlClient.SqlCommand(t_sql, connectionString)
        command.CommandType = CommandType.Text

        Dim p_groupid As New SqlClient.SqlParameter("@groupid", SqlDbType.Int)
        p_groupid.Direction = ParameterDirection.Output
        command.Parameters.Add(p_groupid)

        command.Parameters.AddWithValue("@title", Title)
        command.Parameters.AddWithValue("@description", description)
        command.Parameters.AddWithValue("@icon", icon)

        command.Connection.Open()
        command.ExecuteNonQuery()
        command.Connection.Close()

        'here is the return value
        Dim groupid As Integer = CInt(p_groupid.Value)

    End Sub
Así de simple, aquí la parte interesante está en las líneas donde añado un parámetro llamado groupid, el cual es de tipo OUTPUT… lo cual me permite obtener el valor de retorno de la clave primaria, la cual se almacena en SCOPE_IDENTITY().

Es todo, espero que les sea de utilidad Guiño

viernes, 9 de setiembre de 2011

Generar registros para hacer pruebas en tu base de datos

cross_join Muchas veces necesitamos generar miles o millones de registros para hacer pruebas desde nuestra aplicación.
Una forma simple y rápida de generrar datos que a menudo utilizo es como a continuación explico:
1.- Elijo una tabla existente (cualquier tabla)
2.- Inserto la data de esa columna en la tabla que quiero generar registros, pero el truco es multiplicar miles de veces esa data.
Y cómo genero miles de veces esas filas?
Fácil, hago un CROS JOIN de la misma tabla, así:
(para este ejemplo estoy usando la data de la tabla del sistema sys.objects)
CREATE TABLE #Dummy_Table(
columnINT INT, 
columnDATETIME DATETIME,
columnVARCHAR VARCHAR(100), 
columnBIT BIT)

INSERT INTO #Dummy_Table
SELECT a.object_id, 
a.modify_date, 
b.name, 
c.is_published
FROM       sys.objects a 
CROSS JOIN sys.objects b 
CROSS JOIN sys.objects c 

SELECT * FROM #Dummy_Table

DROP TABLE #Dummy_Table
Explicaré en qué consiste el T-SQL:
1.- Creo una tabla temporal para guardar los registros que generaremos.
2.- Inserto en la tabla temporal la data de algunas columnas de la tabla sys.objects…
al mismo tiempo, por cada CROSS JOIN que hago, la cantidad de filas se multiplicará por si misma… lo cual genera miles o millones (depende de cuantos CROSS JOIN hagas) de registros generados al vuelo al instante.
Espero que les sea de utilidad ;)

jueves, 30 de junio de 2011

SQL SERVER - Excluyendo columnas del GROUP BY

distinct_sql Bueno, el título es medio confuso… pero la idea es intentar recuperar de una tabla de la bd, un conjunto de filas distintas, y que además en su contenido incluyan una fila que no ha sido evaluada en el DISTINCT.
En otras palabras:
algunas veces no queremos que se evalúen todas las columnas… por ejemplo una columna fecha… dado que siempre va a ser distinta, pues la fecha incluye minutos, segundos , milisegundos, etc y entonces siempre cada fila será distinta… por lo que lo más sabio es excluir la fecha de la evaluación del DISTINCT (en tu caso puede ser otro campo, no necesariamente la fecha).
Recordatorio:
Como sabemos el DISTINCT se aplica  a toda la fila… y no a sólo algunas columnas, osea, esto no funciona:
SELECT DISTINCT(columna1), columna2, columna3
Si funcionara sería maravilloso.
Y entonces Uds me preguntan:
Y cómo logramos excluir algunas columnas del DISTINCT?
Ajá, para ello hacemos un truco sencillo:
1.- A la columna que no queremos evaluar la ponemos como argumento de una función SQL, por ejemplo MAX(columna1) o MIN(Columna2)
2.- Dado que estamos usando funciones de agrupamiento, tenemos que usar entonces también la cláusula GROUP BY… y como dice la teoría, en el GROUP BY van las columnas que no han sido incluídas en alguna función de agrupamiento. Ejm:
SELECT userid, documentid, MAX(RegisteredDate)
FROM Table_Document
--Opcional: WHERE userid = @userid
GROUP BY userid, documentid

--Opcional: ORDER BY MAX(RegisteredDate)
Los puntos claves aquí son la función de agrupamiento, lo cual me permite evadir la columna RegisteredDate, y el GROUP BY, el cual es necesario al usar funciones de agrupamiento.
Se habrán dado cuenta que no uso el elemento DISTINCT ... para esta solución (paradójicamente) no la necesito.
Ahora hay otro tema que hay que considerar aquí: cómo hago si las columnas que quiero incluir en mi consulta, pero al mismo tiempo quiero excluir del GROUP BY son de tipo texto? (varchar, nvarchar,,,etc)
Interesante pregunta no?
Suponiendo que tengo una columna de tipo varchar, lo que tendría que hacer es envolver la columna de esta manera: 
MAX(Cast(column2 as varchar(max))) AS Column2
Y con eso se soluciona el asunto.
Espero que les sea de utilidad ;)

lunes, 13 de junio de 2011

SQL SERVER - Ordenar datos de una columna, poniendo NULL al final

Digamos que se da el caso que tenemos una lista de tareas por realizar, algunas de las cuales no tienen fecha definida de culminación, por lo tanto se han guardado en la base de datos con fecha NULL.
Luego, imaginemos que tenemos que mostrar estas tareas en una grilla… si nosotros hacemos una consulta para obtener todas las tareas, y las ordenamos por fecha de culminación… veremos desagradablemente que las tareas con fecha NULL se mostrarán primero que las demás… lo cual nos hace recordar que un NULL siempre es menor que un dato no NULL… ejemplo:
SELECT [taskid],[userid],[title],[progress],[duedate]

FROM [dbo].[tm_task]

ORDER BY [duedate] ASC
sort_order_null_end 
Y lógicamente no es lo que quisieramos obtener como resultado:

si hay tareas sin fecha definida, estas deberían ir al último (puede ser que tú pienses lo contrario, pero no discutamos).

Entonces, para lograr que las tareas con fecha NULL vayan al final, hacemos uso de COALESCE, elcual nos permite utilizar otro valor si es que el dato es NULL, algo así:

SELECT [taskid],[userid],[title],[progress]
COALESCE([duedate], aqui_pones_una_fecha_con_un_valor_alto) AS [duedate]

FROM [dbo].[tm_task]

ORDER BY [duedate] ASC

Simple no es cierto?

Obviamente no sólo funciona para fechas, también lo puedes usar para números, cadenas, etc.

Espero que les sea de utilidad ;)

lunes, 17 de enero de 2011

Obtener o cambiar el puerto que usa SQL SERVER en una instancia

Dado que este tema no es requerido a diario… a menudo termino olvidándome cómo se hacía, así que vamos a hacer un post que inmortalize este conocimiento ;)

Para saber cuál es el puerto que usa SQL SERVER 2005/2008 en una determinada instancia:

Start > Programs > Microsoft Sql Server 2005 >
configuration tools > SQL SERVER Configuration manager >

SQL SERVER 2005/2008 Network Configuration >

Se selecciona la instancia que se desea chequear >

tcp/ip (click derecho) > Propiedades

pestaña IP Addresses ....

al final hay una opción que dice :

IPALL
------
TCP Dinamic Ports  1232 (este sería el número)

sql_server_configuration_manager

Dicho sea de paso, si desean cambiar el número de puerto que usará dicha instancia de SQL SERVER… también es aquí… sólo que adicionalmente el servicio SQL SERVER para esa instancia debe ser reiniciado.

Para reiniciar la instancia, simplemente vamos a la opción que dice SQL SERVER Services y elegimos la instancia apropiada > click derecho y le das a reiniciar.

Espero que les sea de utilidad ;)

jueves, 6 de enero de 2011

SQL SERVER - Encontrar maximo o minimo valor de entre varias columnas

Este post sirve para mostrar varias de las cosas nuevas que trajo SQL SERVER 2008. Si alguien intentó hacer esta operación en SQL SERVER 2000, recordará que hacer esto era una proeza.
Ya no hablaremos sobre SQL SERVER 2000.
max_min_values
Para mostrar cómo encontramos el máximo o mínimo valor comparando varias columnas primeramente crearemos una tabla, pero sólo una variable tabla (otra cosa grande de SQL SERVER 2008) y le añadimos 5 filas de datos:
DECLARE 
@myTable TABLE (columnID INT , column1 INT, column2 INT, column3 INT, column4 VARCHAR(50)) 

INSERT INTO @myTable SELECT 1, 3341, 455, 576, 'abc'
INSERT INTO @myTable SELECT 2, 354, 6552, 354, 'cde'
INSERT INTO @myTable SELECT 3, 566, 3434, 4545, 'efg'
INSERT INTO @myTable SELECT 4, 6783, 445, 578, 'ghi'
INSERT INTO @myTable SELECT 5, 7877, 9994, 666, 'ijk'

Seguimos. Luego construímos la consulta añadiendo las columnas que deseamos que participen en la operación, en este caso column1, column2, column3:

SELECT ( 
SELECT MAX(columnx) FROM ( VALUES(column1),(column2),(column3) ) AS UNIQUECOLUMN(columnx)
)  AS Maximun
FROM @myTable


El resultado será idéntico a la imagen de arriba.

Eso es todo. Espero que les sea de utilidad ;)

viernes, 13 de agosto de 2010

Comparar bases de datos

database_compare Desde hace varios años uso este producto y quiero compartirlo con todos uds (muchos ya lo conocerán), dado que es muy útil… y sobre todo gratuito. Obviamente hay otros más sofisticados, pero éste es gratuito).
Lo que hace este producto es comparar la estructura de dos bases de datos, las cuales pueden estar en diferentes servidores o en local…
luego de ello arroja un reporte muy simple y comprensible en el que muestra todos los objetos de la base de datos (tablas, procedimientos almacenados, funciones, ..etc) e indica si son iguales o diferentes… además también detecta qué objetos faltan en comparación al otro servidor.
Ojo, compara estructuras ah? no compara datos.
Funciona para SQL SERVER, MYSQL y ACCESS.
Este es el enlace: http://www.starinix.com/sqlcompare02.htm

Actualización: Luego escribí otro post acerca del mismo tema, por favor léanlo desde aquí
http://www.neuronasoft.net/2011/10/comparar-bases-de-datos-con-visual.html

Espero que les sea de utilidad ;)

sábado, 26 de junio de 2010

ASP.NET - Subir y descargar archivos del servidor mediante pagina aspx intermedia

download_file Lo prometido es deuda (lean los comentarios de este otro post), así que vamos con el desarrollo del post.
En esta ocasión vamos a realizar el proceso de:
1.- Guardar, en una carpeta del servidor, archivos, los cuales deben guardarse con otros nombres (nombres autogenerados, por ejemplo: 3F2504E0-4F89-11D3-9A0C-0305E82C3301).

2.- Guardar en la base de datos, el nombre original del archivo y el nuevo nombre.

3.- Recuperar los nombres y rutas de los archivos subidos al servidor y listarlos en un gridview.

4.- Basado en los puntos 2 y 3, permitir descargar los archivos con su original nombre.

Para completar este ciclo voy a crear en la base de datos una tabla llamada document_attachment y los respectivos procedimientos almacenados para la gestión de archivos.
Entonces, este es el script T-SQL que uso para el caso ( una tabla y 3 procedimientos almacenados):
CREATE TABLE [dbo].[document_attachment](
[attachmentid] [int] IDENTITY(1,1) NOT NULL,
[filename] [varchar](250),
[fileguid] [varchar](50),
CONSTRAINT [pk_document_attachment] PRIMARY KEY CLUSTERED 
([attachmentid] ASC)
)
GO
--------------------------------------------------
CREATE PROCEDURE[dbo].[document_attachment_GetAll]
AS

SELECT
[attachmentid],
[filename],
[fileguid]
FROM [dbo].[document_attachment]

GO
--------------------------------------------------
CREATE PROCEDURE[dbo].[document_attachment_Insert]
@attachmentid int output,
@filename varchar(250),
@fileguid varchar(50)

AS
INSERT INTO[dbo].[document_attachment](
[filename],
[fileguid]
)
VALUES(
@filename,
@fileguid
)
SET @attachmentid = SCOPE_IDENTITY()
GO

--------------------------------------------------
CREATE PROCEDURE[dbo].[document_attachment_GetByGuid]
@guid varchar(50)
AS

SELECT
[filename],
[fileguid]
FROM [dbo].[document_attachment]
WHERE [fileguid] = @guid
--------------------------------------------------
Antes de pasar al código ASP.NET, les recomiendo que guarden la cadena de conexión a la base de datos en el web config (para el ejemplo está sin encriptar, …pero uds deben encriptarlo)

<connectionStrings>
<add name="DB" connectionString="server=.\SQLEXPRESS;database=my_database;uid=sa;pwd=xxxxxxxxxxxxxxx" />
</connectionStrings>

Otra cosa, deben crear una carpeta llamada Uploads (en la raiz de su aplicación), que es donde se guardarán los archivos que se suben… a esta carpeta hay que darle permisos de lectura/escritura al usuario SERVICIO DE RED.
uploads_folder

Ahora sí, necesitamos dos páginas aspx:
1.- Uploader.aspx, que es la página que permite subir los archivos al servidor e, inmediatamente después actualiza el contenido del gridview con los archivos subidos.

2.- Downloader.aspx, que es la página intermedia para descargar archivos… gracias a esta página podemos evitar que el usuario sepa desde qué carpeta se descargan los archivos y además en el código de esta página pueden hacer las verificaciones que quieran antes de permitirle al usuario descargar el archivo. Tú me preguntarás: puedo usar un archivo ashx (que es más ligero) en lugar de una pagina aspx para descargar? la respuesta es sí.

Este es el código completo:
Uploader.aspx
uploader

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div style="width: 350px; background-color: #f2ceea; padding: 10px; margin: 20px">
Seleccione archivo:<asp:FileUpload ID="FileUpload1" runat="server" />
<hr />
<asp:Button ID="btnUpload" runat="server" Text="Guardar archivo" />
</div>
<asp:GridView ID="griddocument_attachment" BackColor="lightgreen" Width="400px" runat="server"
AutoGenerateColumns="False" DataKeyNames="fileguid" HeaderStyle-HorizontalAlign="Left"
HeaderStyle-VerticalAlign="Top" RowStyle-VerticalAlign="Top">
<Columns>
<asp:TemplateField HeaderStyle-Width="3%">
<ItemTemplate>
<asp:Image ID="Image1" ImageUrl="~/images/file.png" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Archivo">
<ItemTemplate>
<%# Eval("filename")%>
                </ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Descargar" HeaderStyle-Width="5%">
<ItemTemplate>
<asp:HyperLink ID="hplAttachment" Text='<%# Eval("filename")%>' NavigateUrl='<%# String.Format("~/Downloader.aspx?guid={0}", Eval("fileguid")) %>'
ImageUrl="~/images/download.png" runat="server"></asp:HyperLink>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>    
</form>
</body>
</html>

En el gridview, el hyperlink con la imagen download.png es quien tiene el enlace de descarga, parecido a esto:
http://localhost/Test_UI/Downloader.aspx?guid=ee4a00fa-cfa9-490e-a65c-12d652fd2c00

código VB.NET:
Imports System.Data
Imports System.Data.SqlClient

Partial Public Class Uploader
Inherits System.Web.UI.Page

Private GlobalDBConnection As String = ConfigurationManager.ConnectionStrings("DB").ConnectionString
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If IsPostBack Then Return

document_attachment_GetAll()

End Sub

Protected Sub btnUpload_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnUpload.Click
If Not FileUpload1.HasFile Then Return

Dim fileguid As String = Guid.NewGuid.ToString
Dim FileName As String = FileUpload1.FileName

Try
FileUpload1.SaveAs(Server.MapPath("./Uploads/") & fileguid)
Catch
'error....
Return
End Try

Dim i As Integer = document_attachment_Insert(FileName, fileguid)
If i = 0 Then
'error....
Else
document_attachment_GetAll()
End If

End Sub

Sub document_attachment_GetAll()
Dim connection As New SqlConnection(GlobalDBConnection)
Dim command As New SqlDataAdapter("document_attachment_GetAll", connection)
command.SelectCommand.CommandType = CommandType.StoredProcedure

Dim dt As New DataTable()
command.Fill(dt)

griddocument_attachment.DataSource = dt
griddocument_attachment.DataBind()

End Sub

Function document_attachment_Insert(ByVal filename As String, ByVal fileguid As String) As Integer
Dim connection As New SqlConnection(GlobalDBConnection)
Dim command As New SqlCommand("document_attachment_Insert", connection)
command.CommandType = CommandType.StoredProcedure

Dim p_attachmentid As New SqlParameter("@attachmentid", SqlDbType.Int)
p_attachmentid.Direction = ParameterDirection.Output
command.Parameters.Add(p_attachmentid)
command.Parameters.AddWithValue("@filename", filename)
command.Parameters.AddWithValue("@fileguid", fileguid)

command.Connection.Open()
Try
command.ExecuteNonQuery().ToString()
Catch
Return 0
Finally
command.Connection.Close()
End Try

If Not IsDBNull(p_attachmentid.Value) Then
Return CInt(p_attachmentid.Value)
Else
Return 0
End If
End Function

End Class

Downloader.aspx
 en el lado aspx tiene absolutamente nada, excepto el tag Page:
<%@ Page Language="vb" …………………………………………………… %>
 código VB.NET:
Imports System.Data
ImportsSystem.Data.SqlClient

Partial Public Class Downloader
Inherits System.Web.UI.Page

Private GlobalDBConnection As String= ConfigurationManager.ConnectionStrings("DB").ConnectionString
Protected SubPage_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim guid As String= Request.QueryString("guid")

If String.IsNullOrEmpty(guid) Then Return

' aquí puedes poner las validaciones que quieras

'............   ....................

Dim dt As DataTable = document_attachment_GetByGuid(guid)
If dt.Rows.Count = 0 Then Return

Dim
OriginalFileName As String= dt.Rows(0)("filename")
 DownloadFile(Server.MapPath("./Uploads/") & guid, OriginalFileName)
End Sub

Public Sub
DownloadFile(ByVal FilePath As String, ByVal OriginalFileName As String)
Dim fs As IO.FileStream = Nothing

'obtenemos el archivo del servidor
fs = IO.File.Open(FilePath, IO.FileMode.Open, IO.FileAccess.Read)
Dim byteBuffer(CInt(fs.Length - 1)) As Byte
fs.Read(byteBuffer, 0, CInt(fs.Length))
 fs.Close()

Using ms As New IO.MemoryStream(byteBuffer)
'descargar con su nombre original
Response.AddHeader("Content-Disposition", "attachment; filename=" & OriginalFileName)
 ms.WriteTo(Response.OutputStream)
End Using

End Sub

Function
document_attachment_GetByGuid(ByVal guid As String) As DataTable
Dim connection As New SqlConnection(GlobalDBConnection)
Dim command As New SqlDataAdapter("document_attachment_GetByGuid", connection)
 command.SelectCommand.CommandType = CommandType.StoredProcedure
 command.SelectCommand.Parameters.AddWithValue("@guid", guid)
Dim dt As New DataTable()
 command.Fill(dt)

Return dt
End Function

 End Class


ACTUALIZACIÓN:
Debido a las preguntas que constantemente estoy recibiendo acerca de este post, veo que no ha quedado muy claro... entonces, estoy añadiendo el proyecto completo para que lo descarguen y lo analicen con más calma. 
Debido a que estoy incluyendo la base de datos en la carpeta app_data, lo único que tendrían que modificar en el we.config antes de correr el proyecto es el nombre del servidor de su bd... osea reemplacen .\SS2008 por el nombre del servidor que Uds le hayan puesto.
Es todo, espero que les sea de utilidad.
 ;)

sábado, 6 de marzo de 2010

Listado de paises script SQL SERVER

Les dejo el script con el listado de todos los países en español.
Dado que un blog también es un repositorio de información: a mí también me conviene publicarlo para tenerlo siempre a la mano.
/*==================================*/
/* Table: FPG_PAIS                                     */
/*=================================*/

create table FPG_PAIS (
   PAISID              int                  identity,
   ISOnum               smallint             null,
   ISO2                 char(2)              null,
   ISO3                 char(3)              null,
   TITULO               varchar(150)         not null,
   constraint PK_FPG_PAIS primary key (PAISID)
)
go

SET IDENTITY_INSERT fpg_pais ON 
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (1, 4, 'AF', 'AFG', 'Afganistán');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (2, 248, 'AX', 'ALA', 'Islas Gland');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (3, 8, 'AL', 'ALB', 'Albania');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (4, 276, 'DE', 'DEU', 'Alemania');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (5, 20, 'AD', 'AND', 'Andorra');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (6, 24, 'AO', 'AGO', 'Angola');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (7, 660, 'AI', 'AIA', 'Anguilla');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (8, 10, 'AQ', 'ATA', 'Antártida');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (9, 28, 'AG', 'ATG', 'Antigua y Barbuda');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (10, 530, 'AN', 'ANT', 'Antillas Holandesas');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (11, 682, 'SA', 'SAU', 'Arabia Saudí');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (12, 12, 'DZ', 'DZA', 'Argelia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (13, 32, 'AR', 'ARG', 'Argentina');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (14, 51, 'AM', 'ARM', 'Armenia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (15, 533, 'AW', 'ABW', 'Aruba');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (16, 36, 'AU', 'AUS', 'Australia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (17, 40, 'AT', 'AUT', 'Austria');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (18, 31, 'AZ', 'AZE', 'Azerbaiyán');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (19, 44, 'BS', 'BHS', 'Bahamas');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (20, 48, 'BH', 'BHR', 'Bahréin');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (21, 50, 'BD', 'BGD', 'Bangladesh');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (22, 52, 'BB', 'BRB', 'Barbados');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (23, 112, 'BY', 'BLR', 'Bielorrusia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (24, 56, 'BE', 'BEL', 'Bélgica');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (25, 84, 'BZ', 'BLZ', 'Belice');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (26, 204, 'BJ', 'BEN', 'Benin');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (27, 60, 'BM', 'BMU', 'Bermudas');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (28, 64, 'BT', 'BTN', 'Bhután');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (29, 68, 'BO', 'BOL', 'Bolivia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (30, 70, 'BA', 'BIH', 'Bosnia y Herzegovina');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (31, 72, 'BW', 'BWA', 'Botsuana');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (32, 74, 'BV', 'BVT', 'Isla Bouvet');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (33, 76, 'BR', 'BRA', 'Brasil');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (34, 96, 'BN', 'BRN', 'Brunéi');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (35, 100, 'BG', 'BGR', 'Bulgaria');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (36, 854, 'BF', 'BFA', 'Burkina Faso');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (37, 108, 'BI', 'BDI', 'Burundi');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (38, 132, 'CV', 'CPV', 'Cabo Verde');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (39, 136, 'KY', 'CYM', 'Islas Caimán');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (40, 116, 'KH', 'KHM', 'Camboya');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (41, 120, 'CM', 'CMR', 'Camerún');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (42, 124, 'CA', 'CAN', 'Canadá');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (43, 140, 'CF', 'CAF', 'República Centroafricana');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (44, 148, 'TD', 'TCD', 'Chad');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (45, 203, 'CZ', 'CZE', 'República Checa');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (46, 152, 'CL', 'CHL', 'Chile');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (47, 156, 'CN', 'CHN', 'China');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (48, 196, 'CY', 'CYP', 'Chipre');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (49, 162, 'CX', 'CXR', 'Isla de Navidad');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (50, 336, 'VA', 'VAT', 'Ciudad del Vaticano');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (51, 166, 'CC', 'CCK', 'Islas Cocos');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (52, 170, 'CO', 'COL', 'Colombia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (53, 174, 'KM', 'COM', 'Comoras');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (54, 180, 'CD', 'COD', 'República Democrática del Congo');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (55, 178, 'CG', 'COG', 'Congo');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (56, 184, 'CK', 'COK', 'Islas Cook');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (57, 408, 'KP', 'PRK', 'Corea del Norte');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (58, 410, 'KR', 'KOR', 'Corea del Sur');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (59, 384, 'CI', 'CIV', 'Costa de Marfil');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (60, 188, 'CR', 'CRI', 'Costa Rica');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (61, 191, 'HR', 'HRV', 'Croacia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (62, 192, 'CU', 'CUB', 'Cuba');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (63, 208, 'DK', 'DNK', 'Dinamarca');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (64, 212, 'DM', 'DMA', 'Dominica');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (65, 214, 'DO', 'DOM', 'República Dominicana');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (66, 218, 'EC', 'ECU', 'Ecuador');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (67, 818, 'EG', 'EGY', 'Egipto');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (68, 222, 'SV', 'SLV', 'El Salvador');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (69, 784, 'AE', 'ARE', 'Emiratos Árabes Unidos');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (70, 232, 'ER', 'ERI', 'Eritrea');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (71, 703, 'SK', 'SVK', 'Eslovaquia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (72, 705, 'SI', 'SVN', 'Eslovenia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (73, 724, 'ES', 'ESP', 'España');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (74, 581, 'UM', 'UMI', 'Islas ultramarinas de Estados Unidos');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (75, 840, 'US', 'USA', 'Estados Unidos');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (76, 233, 'EE', 'EST', 'Estonia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (77, 231, 'ET', 'ETH', 'Etiopía');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (78, 234, 'FO', 'FRO', 'Islas Feroe');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (79, 608, 'PH', 'PHL', 'Filipinas');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (80, 246, 'FI', 'FIN', 'Finlandia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (81, 242, 'FJ', 'FJI', 'Fiyi');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (82, 250, 'FR', 'FRA', 'Francia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (83, 266, 'GA', 'GAB', 'Gabón');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (84, 270, 'GM', 'GMB', 'Gambia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (85, 268, 'GE', 'GEO', 'Georgia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (86, 239, 'GS', 'SGS', 'Islas Georgias del Sur y Sandwich del Sur');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (87, 288, 'GH', 'GHA', 'Ghana');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (88, 292, 'GI', 'GIB', 'Gibraltar');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (89, 308, 'GD', 'GRD', 'Granada');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (90, 300, 'GR', 'GRC', 'Grecia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (91, 304, 'GL', 'GRL', 'Groenlandia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (92, 312, 'GP', 'GLP', 'Guadalupe');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (93, 316, 'GU', 'GUM', 'Guam');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (94, 320, 'GT', 'GTM', 'Guatemala');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (95, 254, 'GF', 'GUF', 'Guayana Francesa');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (96, 324, 'GN', 'GIN', 'Guinea');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (97, 226, 'GQ', 'GNQ', 'Guinea Ecuatorial');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (98, 624, 'GW', 'GNB', 'Guinea-Bissau');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (99, 328, 'GY', 'GUY', 'Guyana');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (100, 332, 'HT', 'HTI', 'Haití');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (101, 334, 'HM', 'HMD', 'Islas Heard y McDonald');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (102, 340, 'HN', 'HND', 'Honduras');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (103, 344, 'HK', 'HKG', 'Hong Kong');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (104, 348, 'HU', 'HUN', 'Hungría');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (105, 356, 'IN', 'IND', 'India');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (106, 360, 'ID', 'IDN', 'Indonesia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (107, 364, 'IR', 'IRN', 'Irán');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (108, 368, 'IQ', 'IRQ', 'Iraq');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (109, 372, 'IE', 'IRL', 'Irlanda');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (110, 352, 'IS', 'ISL', 'Islandia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (111, 376, 'IL', 'ISR', 'Israel');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (112, 380, 'IT', 'ITA', 'Italia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (113, 388, 'JM', 'JAM', 'Jamaica');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (114, 392, 'JP', 'JPN', 'Japón');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (115, 400, 'JO', 'JOR', 'Jordania');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (116, 398, 'KZ', 'KAZ', 'Kazajstán');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (117, 404, 'KE', 'KEN', 'Kenia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (118, 417, 'KG', 'KGZ', 'Kirguistán');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (119, 296, 'KI', 'KIR', 'Kiribati');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (120, 414, 'KW', 'KWT', 'Kuwait');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (121, 418, 'LA', 'LAO', 'Laos');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (122, 426, 'LS', 'LSO', 'Lesotho');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (123, 428, 'LV', 'LVA', 'Letonia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (124, 422, 'LB', 'LBN', 'Líbano');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (125, 430, 'LR', 'LBR', 'Liberia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (126, 434, 'LY', 'LBY', 'Libia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (127, 438, 'LI', 'LIE', 'Liechtenstein');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (128, 440, 'LT', 'LTU', 'Lituania');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (129, 442, 'LU', 'LUX', 'Luxemburgo');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (130, 446, 'MO', 'MAC', 'Macao');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (131, 807, 'MK', 'MKD', 'ARY Macedonia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (132, 450, 'MG', 'MDG', 'Madagascar');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (133, 458, 'MY', 'MYS', 'Malasia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (134, 454, 'MW', 'MWI', 'Malawi');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (135, 462, 'MV', 'MDV', 'Maldivas');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (136, 466, 'ML', 'MLI', 'Malí');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (137, 470, 'MT', 'MLT', 'Malta');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (138, 238, 'FK', 'FLK', 'Islas Malvinas');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (139, 580, 'MP', 'MNP', 'Islas Marianas del Norte');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (140, 504, 'MA', 'MAR', 'Marruecos');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (141, 584, 'MH', 'MHL', 'Islas Marshall');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (142, 474, 'MQ', 'MTQ', 'Martinica');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (143, 480, 'MU', 'MUS', 'Mauricio');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (144, 478, 'MR', 'MRT', 'Mauritania');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (145, 175, 'YT', 'MYT', 'Mayotte');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (146, 484, 'MX', 'MEX', 'México');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (147, 583, 'FM', 'FSM', 'Micronesia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (148, 498, 'MD', 'MDA', 'Moldavia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (149, 492, 'MC', 'MCO', 'Mónaco');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (150, 496, 'MN', 'MNG', 'Mongolia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (151, 500, 'MS', 'MSR', 'Montserrat');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (152, 508, 'MZ', 'MOZ', 'Mozambique');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (153, 104, 'MM', 'MMR', 'Myanmar');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (154, 516, 'NA', 'NAM', 'Namibia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (155, 520, 'NR', 'NRU', 'Nauru');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (156, 524, 'NP', 'NPL', 'Nepal');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (157, 558, 'NI', 'NIC', 'Nicaragua');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (158, 562, 'NE', 'NER', 'Níger');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (159, 566, 'NG', 'NGA', 'Nigeria');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (160, 570, 'NU', 'NIU', 'Niue');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (161, 574, 'NF', 'NFK', 'Isla Norfolk');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (162, 578, 'NO', 'NOR', 'Noruega');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (163, 540, 'NC', 'NCL', 'Nueva Caledonia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (164, 554, 'NZ', 'NZL', 'Nueva Zelanda');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (165, 512, 'OM', 'OMN', 'Omán');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (166, 528, 'NL', 'NLD', 'Países Bajos');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (167, 586, 'PK', 'PAK', 'Pakistán');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (168, 585, 'PW', 'PLW', 'Palau');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (169, 275, 'PS', 'PSE', 'Palestina');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (170, 591, 'PA', 'PAN', 'Panamá');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (171, 598, 'PG', 'PNG', 'Papúa Nueva Guinea');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (172, 600, 'PY', 'PRY', 'Paraguay');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (173, 604, 'PE', 'PER', 'Perú');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (174, 612, 'PN', 'PCN', 'Islas Pitcairn');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (175, 258, 'PF', 'PYF', 'Polinesia Francesa');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (176, 616, 'PL', 'POL', 'Polonia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (177, 620, 'PT', 'PRT', 'Portugal');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (178, 630, 'PR', 'PRI', 'Puerto Rico');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (179, 634, 'QA', 'QAT', 'Qatar');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (180, 826, 'GB', 'GBR', 'Reino Unido');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (181, 638, 'RE', 'REU', 'Reunión');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (182, 646, 'RW', 'RWA', 'Ruanda');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (183, 642, 'RO', 'ROU', 'Rumania');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (184, 643, 'RU', 'RUS', 'Rusia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (185, 732, 'EH', 'ESH', 'Sahara Occidental');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (186, 90, 'SB', 'SLB', 'Islas Salomón');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (187, 882, 'WS', 'WSM', 'Samoa');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (188, 16, 'AS', 'ASM', 'Samoa Americana');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (189, 659, 'KN', 'KNA', 'San Cristóbal y Nevis');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (190, 674, 'SM', 'SMR', 'San Marino');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (191, 666, 'PM', 'SPM', 'San Pedro y Miquelón');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (192, 670, 'VC', 'VCT', 'San Vicente y las Granadinas');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (193, 654, 'SH', 'SHN', 'Santa Helena');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (194, 662, 'LC', 'LCA', 'Santa Lucía');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (195, 678, 'ST', 'STP', 'Santo Tomé y Príncipe');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (196, 686, 'SN', 'SEN', 'Senegal');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (197, 891, 'CS', 'SCG', 'Serbia y Montenegro');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (198, 690, 'SC', 'SYC', 'Seychelles');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (199, 694, 'SL', 'SLE', 'Sierra Leona');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (200, 702, 'SG', 'SGP', 'Singapur');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (201, 760, 'SY', 'SYR', 'Siria');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (202, 706, 'SO', 'SOM', 'Somalia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (203, 144, 'LK', 'LKA', 'Sri Lanka');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (204, 748, 'SZ', 'SWZ', 'Suazilandia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (205, 710, 'ZA', 'ZAF', 'Sudáfrica');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (206, 736, 'SD', 'SDN', 'Sudán');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (207, 752, 'SE', 'SWE', 'Suecia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (208, 756, 'CH', 'CHE', 'Suiza');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (209, 740, 'SR', 'SUR', 'Surinam');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (210, 744, 'SJ', 'SJM', 'Svalbard y Jan Mayen');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (211, 764, 'TH', 'THA', 'Tailandia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (212, 158, 'TW', 'TWN', 'Taiwán');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (213, 834, 'TZ', 'TZA', 'Tanzania');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (214, 762, 'TJ', 'TJK', 'Tayikistán');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (215, 86, 'IO', 'IOT', 'Territorio Británico del Océano Índico');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (216, 260, 'TF', 'ATF', 'Territorios Australes Franceses');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (217, 626, 'TL', 'TLS', 'Timor Oriental');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (218, 768, 'TG', 'TGO', 'Togo');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (219, 772, 'TK', 'TKL', 'Tokelau');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (220, 776, 'TO', 'TON', 'Tonga');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (221, 780, 'TT', 'TTO', 'Trinidad y Tobago');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (222, 788, 'TN', 'TUN', 'Túnez');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (223, 796, 'TC', 'TCA', 'Islas Turcas y Caicos');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (224, 795, 'TM', 'TKM', 'Turkmenistán');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (225, 792, 'TR', 'TUR', 'Turquía');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (226, 798, 'TV', 'TUV', 'Tuvalu');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (227, 804, 'UA', 'UKR', 'Ucrania');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (228, 800, 'UG', 'UGA', 'Uganda');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (229, 858, 'UY', 'URY', 'Uruguay');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (230, 860, 'UZ', 'UZB', 'Uzbekistán');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (231, 548, 'VU', 'VUT', 'Vanuatu');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (232, 862, 'VE', 'VEN', 'Venezuela');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (233, 704, 'VN', 'VNM', 'Vietnam');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (234, 92, 'VG', 'VGB', 'Islas Vírgenes Británicas');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (235, 850, 'VI', 'VIR', 'Islas Vírgenes de los Estados Unidos');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (236, 876, 'WF', 'WLF', 'Wallis y Futuna');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (237, 887, 'YE', 'YEM', 'Yemen');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (238, 262, 'DJ', 'DJI', 'Yibuti');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (239, 894, 'ZM', 'ZMB', 'Zambia');
INSERT INTO fpg_pais(paisid, ISOnum, ISO2, ISO3, titulo) VALUES (240, 716, 'ZW', 'ZWE', 'Zimbabue');

SET IDENTITY_INSERT fpg_pais OFF

Sé que nos será de utilidad ;)

sábado, 27 de febrero de 2010

SQL SERVER – Llamar Funciones de la base de datos directamente

udfs Hasta que me lo preguntaron, me dijeron: Yo sé que las funciones definidas por el usuario (en adelante UDF) han sido creadas para encapsular funcionalidades y para que al ser llamadas desde un procedimiento almacenado (en adelante SP), simplifiquen el armado y entendimiento de las sentencias t-sql que finalmente terminan siendo los SP.
Pero, pero, pero (continuaban…):Se puede llamar una UDF directamente? osea, sin necesidad de usarla desde un SP?
La razón que argumentaban era que querían testear las funciones y se veían en la engorrosa necesidad de meterla en un SP cada vez que querían testear la función.
Mi respuesta fue: hmmm… de poder se puede, y sería así:
1.- Creen una UDF, digamos algo como esto
CREATE FUNCTION [dbo].[risk_user_GetDescription]
(@userid int)
RETURNS varchar(150)

AS
BEGIN
    RETURN
    (
    SELECT [FirstName] + ' ' + [LastName])

    FROM [dbo].[risk_user]
    WHERE [userid] = @userid
    )
END

Esta UDF es muy senclla: simplemente devuelve el nombre de un usuario, recibiendo como parámetro el ID de usuario.
2.- Ahora, cómo lo llamo directamente?
Si están en el SQL SERVER Management Studio, simplemente presionen el botón Nueva consulta y tipeen
SELECT [dbo].[risk_user_GetDescription](1)
Luego presionen F5 para que se ejecute la consulta. Verán que se originan resultados.
Si se dan cuenta, es muy simple: sólo añadí un SELECT antes del nombre de la UDF y al final simplemente le pasé el parámetro que requiere la función.
Si quisieras hacer lo mismo ( llamar una UDF directamente ) desde el Visual Studio, también se puede. Simplemente harías esto:
Dim connection As New SqlConnection("server=.\SQLEXPRESS;database=midatabase;uid=sa;pwd=")

Dim command As New SqlCommand("SELECT [dbo].[risk_user_GetDescription](1)", connection)
command.CommandType = CommandType.Text

connection.Open()
Dim NombreDeUsuario As String = DirectCast(command.ExecuteScalar(), String)
connection.Close()

Lo que hace este código es llamar a la UDF directamente, y la variable NombreDeUsuario es la que recibe el resultado.
Yo he hecho el ejemplo con una función que devuelve un string, les dejo como tarea a Uds el que traten con funciones que devuelven otros tipos de datos.
;)

viernes, 12 de febrero de 2010

SQL SERVER – Generar script INSERT con los datos de las tablas SQL

select-insert A veces queremos exportar los datos de algunas tablas hacia archivos planos… y no siempre tenemos a la mano alguna herramienta para realizar esta tarea.
Y desde el SQL Management Studio no tenemos la opción (al menos no la he visto en SQL SERVER 2005) de exportar los datos como un script. Me refiero a hacerlo de manera simple.
Si haces click derecho sobre una de tus tablas verás que hay distintas opciones para generar scripts para lo que quieras, menos lo que realmente queremos: exportar los datos como un script.
Pero eso no debería ser problema para nosotros, vamos a ver cómo lo podemos hacer…
1.- Estando en el Management Studio y dentro de una base de datos, hacemos click en New Query (Nueva consulta) y suponiendo que tenemos una tabla que se llama emotiaudio_distrito
la cual tiene tres campos llamados distritoid, title y costoreparto…  de tipos int, varchar y decimal respectivamente… tipeamos lo sgte:
PRINT 'SET IDENTITY_INSERT emotiaudio_distrito ON'  --Use esta línea sólo si la tabla incluye una columna identity
SET NOCOUNT ON
SELECT     'INSERT INTO emotiaudio_distrito(distritoid,
                                title, costoreparto)

           VALUES(' +
            cast(distritoid as varchar) + ',''' +
            title + ''',' +
            cast(costoreparto as varchar) +
           ') '
FROM         emotiaudio_distrito
SET NOCOUNT OFF
PRINT 'SET IDENTITY_INSERT emotiaudio_distrito OFF'  --Use esta línea sólo si la tabla incluye una columna identity

Puede darse el caso en que uno de los datos devuelva NULL, en ese caso el resultado de toda esa fila será simplemente NULL… porque:
NULL + no null = NULL… lo cual no queremos. Por ejemplo, cuando una tabla incluye una columna parentID, es posible que no todos tengan parentID … no es cierto? por eso es mejor agregarle una pequeña modificación:
PRINT 'SET IDENTITY_INSERT fpg_ubigeo ON'  --Use esta línea sólo si la tabla incluye una columna identity
SET NOCOUNT ON
SELECT     'INSERT INTO fpg_ubigeo(ubigeoid, parentid, ubigeotypeid, titulo)
           VALUES('
+
            cast(locationid as varchar) + ',' +
            CASE WHEN cast(ISNULL(parentid, 0) as varchar) = '0' THEN 'NULL' ELSE cast(parentid as varchar) END  + ',' +
            cast(locationtypeid as varchar) + ',''' +
            title +
           ''') '
FROM         risk_location
SET NOCOUNT OFF
PRINT 'SET IDENTITY_INSERT fpg_ubigeo OFF'  --Use esta línea sólo si la tabla incluye una columna identity
Y luego presionamos F5 para que se ejecute la consulta… eeeeeeespera, debiste antes de presionar F5 ir al menú Consultas… > Resultados a… > Resultados a Texto… de esa manera los datos se muestran en un formato plano, para poder ser copiados y guardarlos en un block de notas.
result
Pero… y qué estoy haciendo? simplemente estoy armando un string de los datos… osea, concateno “INSERT INTO TU_TABLA…” con los datos.
Recuerda que si incluyes campo de tipo integer o decimal debes castearlos a varchar y también nota que no lo concateno con tres comillas simples como lo hago cuando es un string, sólo uso una comilla simple.
Para terminar, diré que este artificio nos sirve hasta SQL SERVER 2005, porque ya el SQL SERVER 2008 brinda la opción de generar el script INSERT de los datos.
;)

martes, 26 de enero de 2010

SQL SERVER - Obtener texto de procedimientos almacenados recientemente modificados

sqlquery Este post es la continuación de este otro: Obtener fecha de modificacion de procedimientos almacenados, …
Como les decía en el post anterior, la idea finalmente es recuperar el texto o código de los objetos recientemente modificados… si se fijan en el código que a continuación pego, estoy haciendo la consulta a partir de una fecha dada… en mi caso, desde el 21/enero/2010:
YEAR(modify_date)=2010 AND month(modify_date)=1 AND DAY(modify_date)>20
Vean el código T-SQL:
set nocount on
declare @ProcName nvarchar(100)
declare @ProcSortOrder int
declare @CursorProcList CURSOR

declare @StoredProcs TABLE
(
SortOrder int,
ProcedureName varchar(100),
ProcedureCode varchar(7500)
)

Insert Into @StoredProcs
SELECT 0 AS SortOrder, name, SC.Text
FROM sys.objects SO INNER JOIN SysComments SC
ON SO.OBJECT_ID = SC.ID
WHERE type = 'P'
AND YEAR(modify_date)=2010 AND month(modify_date)=1 AND DAY(modify_date)>20
ORDER BY modify_date DESC
set nocount off

SET @CursorProcList = CURSOR FAST_FORWARD
FOR
select ProcedureName,
SortOrder = (select count(*)
from @StoredProcs B
WHERE (A.ProcedureName <> B.ProcedureName)
and (REPLACE(UPPER(B.ProcedureCode),B.ProcedureName,'')
LIKE '%' + upper(A.ProcedureName) + '%')
)
from @StoredProcs A
order by SortOrder Desc
OPEN @CursorProcList
FETCH NEXT FROM @CursorProcList
INTO @ProcName,@ProcSortOrder

WHILE @@FETCH_STATUS = 0
BEGIN

PRINT 'if exists (select * from dbo.sysobjects '
PRINT ' where id = object_id(N' + char(39) + '[dbo].[' + @ProcName + ']' + char(39) + ')'
PRINT ' and OBJECTPROPERTY(id, N' + char(39) + 'IsProcedure' + char(39) + ') = 1) '
PRINT ' drop procedure ' + @ProcName
PRINT ' GO '
PRINT ' SET QUOTED_IDENTIFIER OFF '
PRINT ' GO '
PRINT ' SET ANSI_NULLS OFF '
PRINT ' GO'
exec sp_helptext @ProcName
PRINT ' GO '
PRINT ' SET QUOTED_IDENTIFIER OFF '
PRINT ' GO '
PRINT ' SET ANSI_NULLS ON '
PRINT ' GO '

FETCH NEXT FROM @CursorProcList
INTO @ProcName,@ProcSortOrder
END

CLOSE @CursorProcList
DEALLOCATE @CursorProcList

Antes de ejecutar este código, debes ir al Menú Query (en español supongo que será Consultas) y seleccionar Resultados a… > Resultados a Texto… como la imagen que muestro al inicio de este post.
Nota: No me voy a dar todo el crédito por este código, en realidad es un código cogido del maestro Robbe D. Morris, el cual me permitía recuperar todos los procedimientos almacenados de una base de datos… pero no listaba ordenados por fecha de modificación, porque consultaba de otras tablas del sistema… el valor agregado que le di es cambiar las tablas de consulta que hacia, para que me liste ordenados por fecha de modificación y además me permita recuperar desde una fecha determinada.
;)