volver
ir arriba



PREGUNTAS Y ERRORES FRECUENTES

forward SQL Server Management Studio: Al intentar conectarme al motor SQL Server, obtengo el error: "A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible."
forward SQL Server Management Studio: Al modificar la estructura de una tabla, me aparece un warning "Saving changes is not permited"
forward SQL Server: Error 1638 instalando el motor Microsoft Visual C++ 2015 Redistributable
forward SQL Server: Cómo recuperar la password del usuario SA
forward SQL Server: ¿Qué es una variable?
forward SQL Server Express: Tengo problemas para ejecutar un script SQL con el comando SQLCMD
forward SQL Server: ¿Qué es una Vista?
forward SQL Server: Uso de Subquerys
forward Virtual Box en MAC OS: Error kernel driver not installed (rc=-1908)
forward SQL Server: ¿Porqué es importante definir una Foreign Key?
forward SQL Server: Variable de sistema @@IDENTITY
forward SQL Server: Propiedades CLUSTERED y NON CLUSTERED
forward SQL Server Management Studio: ¿Qué es una Solución y un Proyecto?
forward SQL Server: Tipos de Datos de Usuario
forward SQL Server: Diferencia entre RETURN y RETURNS en una Función
forward SQL Server: Uso de UNION y UNION ALL
forward SQL Server: Saltos en campo con propiedad IDENTITY activada
forward SQL Server: La propiedad COLLATE

SQL Server Management Studio: Al intentar conectarme al motor SQL Server, obtengo el error: "A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible."

Podemos obtener este error cuando intentamos conectarnos al motor SQL Server, para solucionarlo debemos comprobar lo siguiente:

1. Asegúrate que el servicio de SQL Server esté en ejecución. Para comprobarlo, vé a los servicios de Windows, para ello accede al Panel de control > Servicios y asegúrate que el servicio SQL Server esté en estado Running. En caso que no esté corriendo, ejecútalo desde los controles de inicio, tal como se muestra en la imagen:



2. Comprueba que el nombre de la instancia es el correcto. Si has instalado la versión Developer, el nombre de la instancia por default es .\
Si has instalado la versión Express, el nombre de la instancia por default será .\SQLEXPRESS

SQL Server Management Studio: Al modificar la estructura de una tabla, me aparece un warning "Saving changes is not permited"

Microsoft Management Studio (SSMS) tiene una opción configurada por Default, para prevenir cambios en nuestras tablas que requieran realizar un DROP y volver a crear el objeto.
Esta opción previene la pérdida posible de datos a causa de la reestructuración de la tabla.
Para desactivar esta opción, vaya al menú Tools > Options > Designers > Table and database designers, y desmarque la opción Prevent saving changes that require table recreation

SQL Server: Error 1638 instalando el motor Microsoft Visual C++ 2015 Redistributable



Para resolver este problema, pruebe el método siguiente:
Repare la versión x64 de Microsoft Visual C++ 2015 Redistributable desde Agregar o quitar programas mediante los siguientes pasos:
1. Abra Agregar o quitar programas
2. Busque y seleccione Microsoft Visual C++ 2015 Redistributable (x64)
3. Haga clic en el botón Cambiar.
4. Haga clic en el botón Reparar.

SQL Server: ¿Qué es una variable?

Las variables se utilizan dentro de Stored Procedures o Funciones y sirven para almacenar valores que te servirán como control para procesos posteriores.
Un ejemplo concreto:

DECLARE @cantidad int --declaro la variable @cantidad de tipo INT(entero)
SET @cantidad = (SELECT count(*) FROM Paciente) --cuento la cantidad de pacientes y le asigno el resultado a @cantidad
IF @cantidad > 0 --si @cantidad es mayor a cero
PRINT 'Existen pacientes cargados'

El ciclo de vida de una variable comienza con su declaración DECLARE y finaliza cuando termina el script.
Es decir, se destruye la variable de la memoria.
Su uso es exclusivamente local dentro del script. Su nombre y su valor no se almacena en la base de datos, sinó en la memoria del sistema.

SQL Server Express: Tengo problemas para ejecutar un script SQL con el comando SQLCMD

Si estás intentando ejecutar un script SQL através de un archivo con extensión .sql, mediante el comando SQLCMD y no estás obteniendo los resultados esperados, comprueba lo siguiente:

Tu linea de comandos debe tener la siguiente estructura:

SQLCMD -S .\192.168.0.25 -i c:\sqldata\backup.sql

1. Ejecuta la consola CMD en modo Administrador: Click derecho > ejecutar como Admin
2. El parámetro -S (Server) debe ir en mayúsculas
3. El parámetro -i (input file) debe ir en minúsculas
4. La instancia del servidor debe ser .\IP LOCAL o bien .\ solamente

SQL Server: ¿Qué es una Vista?

Una vista es un SELECT específico sobre una o más tablas y se almacena de manera permanente en el servidor de base de datos.
El nombre de la Vista puede ser utilizado en un SELECT, por ejemplo: SELECT * FROM VistaEjemplo
Se utiliza para almacenar consultas genéricas que son usadas en varios procesos, para no tener que repetir la misma consulta, lo que se hace es hacer un SELECT de la Vista.
Esta Vista también se puede conectar mediante un JOIN con otra tabla.
Un ejemplo claro es crear una vista para obtener todos los turnos pendientes y luego mediante un JOIN con la tabla Pacientes filtramos los turnos pendientes de un paciente específico, por ej:

CREATE VIEW VistaEjemplo AS
SELECT * from TurnoPaciente T
INNER JOIN Paciente P
ON P.idPaciente = T.idPaciente

SQL Server: Uso de Subquerys

Si bien siempre es conveniente realizar un JOIN antes que una subconsulta o subquery, por cuestiones de performance, hay casos en los que no tenemos otra alternativa que realizar una subconsulta.
Ya sea porque queremos comparar el total de una tabla con un COUNT o bien cuando queremos saber con el operador IN (SELECT campo FROM) si existen datos en esa tabla.
El uso de un subquery corresponde cuando queremos obtener un valor adicional en una consulta y que no podemos obtenerla mediante la consulta principal.
Por ejemplo, quieres obtener la lista de pacientes y además quieres obtener un campo con la cantidad de turnos que tiene cada uno.
Por ej:

SELECT *, (SELECT COUNT(*) FROM TurnoPaciente TP
WHERE TP.idPaciente = P.idPaciente) as cantTurnos
FROM Paciente P

SQL Server: Cómo recuperar la password del usuario SA

Puede ser que nos encontremos en determinada situación que no recordemos la contraseña de nuestro usuario SA, para conectarnos al motor SQL Server.
Muchas cosas se nos vienen a la mente: ¿Debo reinstalar el motor? ¿Nunca más podré conectarme? ¿He perdido todo mi trabajo?
Afortunadamente nada de lo anterior ocurrirá y tiene solución, solo debes seguir este procedimiento:

1. Inicia el entorno conectándote con Windows Authentication mode (no te pedirá usuario ni clave)
2. Vé a la carpeta Security > Logins > y accede a las propiedades del usuario SA
3. Cambia la contraseña
4. Cierra el entorno, vuelve a abrir Management Studio, selecciona SQL Server Authentication, y coloca usuario SA y la contraseña anteriormente escrita.



Virtual Box en MAC OS: Error kernel driver not installed (rc=-1908)

Cuando instalamos VirtualBox en MAC OS e intentamos iniciar una máquina virtual con Windows 10, es posible que obtengamos el siguiente error:



Para solucionar este problema, debemos activar la opción que permita ejecutar aplicaciones que fueron desarrolladas por Oracle Inc.
Para ello tienes que ir a System Preferences / Security & Privacy y hacer click en el botón Allow.



Nota: Este botón está visible hasta 30 minutos después de la instalación de VirtualBox, por lo tanto si no lo visualizas, debes desinstalar VirtualBox e instalarlo nuevamente.
Una vez reinstalado, el botón estará visible.

SQL Server: ¿Porqué es importante definir una Foreign Key?

Existe una regla o restricción de integridad referencial llamada Foreign Key que podemos definir para preservar la integridad de los datos en nuestras tablas y generar registros consistentes.
¿Que previene esta regla? Imaginemos dos tablas, la tabla Orden y la tabla OrdenEstado.
La tabla OrdenEstado tiene 2 registros (1 - Cancelado; 2 - Realizado )
Supongamos que insertamos un registro en la tabla Orden, con un estado 3 por ejemplo, el estado 3 no existe en la tabla OrdenEstado; entonces, estamos generando una inconsistencia de datos.
Esto puede aparejar muchos problemas, principalmente tendremos un problema cuando mostremos esa información al usuario en una aplicación.
Imaginen que necesitamos mostrar los registros de la tabla Orden, el campo estado lo mostramos de tipo ListBox. Pero recuerden que tenemos un registro cuyo estado es 3 (inexistente).
Esto provocará que la lista de estados o el valor que deba mostrarse quede vacío, con valor NULL o bien el usuario obtenga un error.

Para solucionar esto, por ello la necesidad de definir una Foreign Key, que evitará que insertemos un registro en la tabla Orden, con un estado que no exista en la tabla OrdenEstado.
Para definir nuestra FK, debemos realizar la siguiente sentencia:

ALTER TABLE Orden ADD FOREIGN KEY (OrdenID) REFERENCES OrdenEstado(OrdenID);

Muy bien, hemos definido nuestra Foreign Key. Por lo tanto, si intentamos insertar un registro con un estado inválido o inexistente, obtendremos un error del motor como el siguiente:

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Orden_ OrdenEstado".

SQL Server: Variable de sistema @@IDENTITY

La variable de sistema @@IDENTITY almacena el último valor de un campo IDENTITY insertado en una tabla. Por ej, si realizas un INSERT en la tabla Paciente (esta tabla tiene el campo IDENTITY idpaciente) y dá como resultado un nuevo registro con el campo idpaciente = 8, si inmediatamente despues del INSERT lees el valor de la variable @@IDENTITY también será igual a 8.
Teniendo en cuenta el ejemplo de Turnos, es recomendable usar la variable @@IDENTITY, ya que tenemos 2 tablas para almacenar turno, una es la tabla Turno y la otra TurnoPaciente.
Cuando realizamos el INSERT primero en Turno, luego hacemos INSERT en TurnoPaciente y lo hacemos con el valor de @@IDENTITY para poder copiar exactamente el mismo idturno en ambas tablas.
En el caso que el INSERT sea en una tabla que tenga 2 o más campos IDENTITY, la variable @@IDENTITY almacenará el valor del último campo IDENTITY de la tabla.
Ejemplo para obtener su valor:

DECLARE @a INT; SET @a = @@IDENTITY;

SQL Server: Propiedades CLUSTERED y NON CLUSTERED

Cuando definimos un campo como Primary Key, le estamos dando la tarea al motor SQL Server, que indexe y ordene esa tabla, para que cuando realicemos consultas en dicha tabla, la respuesta sea lo más rápida posible.
Las propiedades Clustered y Non Clustered, determinan el modo en que SQL Server ordenará las información en nuestra tabla.
Clustered significa que la Primary Key estará indexada (almacenada) por el campo PK en si mismo.
Non Clustered quiere decir que internamente SQL ordenará la tabla por un campo adicional de uso interno. Clustered es la propiedad por default de las Primary Keys, por lo tanto, si no lo colocamos, de todas formas la Primary Key se creará de tipo Clustered.

SQL Server Management Studio: ¿Qué es una Solución y un Proyecto?

Primeramente debes que saber que no existe una relación entre la base de datos y la solución.
Antiguamente en versiones previas a Management Studio, no existía la herramienta de soluciones y proyectos.
También tenemos que saber que una solución puede tener 1 o varios proyectos dentro.
Puedes conectarte a la base de datos separadamente de la solución o puedes conectarte dentro de la solución, es decir que utilizar proyectos y soluciones no es obligatoriamente requerido.
La solución es útil a la hora de generar scripts, que nos permiten guardar todos los archivos en un solo lugar y no tener que estar guardando archivos separados para luego tener que abrirlos uno a uno. Con la solución, abrimos ésta y listo, todos nuestros scripts allí estarán.
Estos archivos son externos a la base de datos, contienen scripts o Stored Procedures que van creando nuestros objetos dentro de la base de datos.
Entonces resumiendo, la base de datos contendrá nuestros objetos creados a partir de los scripts (archivos) que tenemos dentro del proyecto. Los scripts (archivos) que tenemos dentro del proyecto, no son parte de la base de datos.


SQL Server: Tipos de Datos de Usuario

Un Tipo de Dato de Usuario, no es más que un tipo de dato determinado identificado con un nombre específico.
1. Una ventaja al definir Tipos de Datos de Usuario, es que evitas que otros programadores o incluso tu mismo, defina un campo que tienen en común muchas tablas, con un tipo de dato diferente a los de las otras tablas.
Por ej: En la tabla Paciente el campo idPaciente es INT
En la tabla TurnoPaciente el campo idPaciente es SMALLINT
Aquí ya tenemos un problema, porque SMALLINT acepta hasta 256 valores, en cambio INT muchos más.
Entonces si definimos el tipo de dato "paciente" (INT) y establecemos en nuestro proyecto de equipo, que ese será el tipo de dato a utilizar, tendremos el mismo tipo de dato en el campo de todas nuestras tablas, que así lo requieran.

2. Otra ventaja es que si en un futuro, el tipo de dato debe ser BIGINT, actualizamos el tipo de dato de usuario (paciente) y automáticamente, todas las tablas que tengan un campo con ese tipo de dato, se actualizarán. Evitando así tener que modificar una a una.

Para definir un Tipo de Dato de Usuario desde Transact-SQL utiliza la siguiente sentencia:

CREATE TYPE paciente FROM INT;

SQL Server: Diferencia entre RETURN y RETURNS en una Función

Para definir el tipo de dato que retornará una función utilizamos RETURNS y se define al comienzo de la función.
En cambio, utilizamos RETURN, cuando se devuelve un valor con ese tipo de dato dentro de la función.
En resúmen son dos instrucciones diferentes, RETURNS establece el tipo de dato que devolverá y RETURN lo devuelve.

CREATE FUNCTION mifuncion (@var int)
RETURNS int
AS
BEGIN return @var END;

SQL Server: Uso de UNION y UNION ALL

El uso más adecuado de UNION, es cuando quieres obtener un conjunto de registros homogéneos, pero consultando varias tablas.
Por ejemplo, imagina que necesitas crear un reporte con los pacientes y los turnos.
Estamos mezclando bananas con manzanas, porque la estructura de cada tabla es diferente, es decir, sus campos son distintos.
De todas maneras utilizando UNION, podemos devolver un conjunto de registros homogéneo, y en los lugares donde el campo no existe, colocamos doble comillas o cero, dependiendo el tipo de dato del campo. Por ejemplo:

SELECT idpaciente, nombre, apellido, pais, '', '' FROM Paciente
UNION
SELECT idTurno, '', '', '', fecha, observacion FROM Turno

Como resultado obtendrás un conjunto de registros, algunos campos con valores, otro no, lógicamente porque no los tienes, pero si quisieras usar este resultado en una aplicación, podrias incluso agregar un campo que indique que tipo de registro es, si es paciente o turno. Entonces filtrar dentro de la aplicación para mostrar el registro deseado.

Por otro lado, la sentencia UNION ALL se comporta de manera similar, con la única diferencia que agrupará los registros y no devolverá repeticiones.

SQL Server: Saltos en campo con propiedad IDENTITY activada

En determinadas oportunidades nos encontraremos con que un campo con propiedad IDENTITY activada, tiene un salto, por ejemplo va de 20 a 1000.
Eso ocurre porque el motor reserva 1000 registros para ese campo identity, para realizar más rápido las sentencias INSERT.
En determinadas ocasiones, lo que sucede es que esos valores quedan reservados por el motor y no son liberados, por eso continúa desde 1001, 1002 etc.
En principio, esto no debería preocuparnos, ya que ese intervalo en su valor, no debería afectar la integridad de los datos, si es que nuestros procesos están desarrollados para prevenir eso.
De todas maneras, existe una sentencia que nos permite reiniciar el valor al último guardado, para poder continuar con la correlatividad de los registros, solo con motivos de organización.
Lo que puedes hacer es eliminar el registro correspondiente al valor 1002 por ejemplo y luego ejecutar la siguiente sentencia para resetear el valor identity al deseado:

DBCC CHECKIDENT ('Tabla', RESEED, 2); --el primer parámetro indica la tabla que quieres reiniciar
--el tercer parámetro, es el número desde donde comienza

SQL Server: La propiedad COLLATE

Dependiendo la configuración de sistema, cuando creamos nuestra base de datos dentro del motor SQL Server, está se crea con la propiedad COLLATION correspondiente al idioma del sistema.
En determinadas situaciones, necesitaremos realizar búsquedas en nuestras tablas, desde aplicaciones o procesos y en algunos casos, es posible que debamos ignorar acentos o mayúsculas.
Si queremos ignorar los acentos o mayúsculas en las búsquedas o validaciones, debemos especificar un COLLATE específico en la base de datos, o bien colocarlo en tu sentencia.

Para establecer un COLLATE en la BD:

USE master; GO ALTER DATABASE MiBase SQL_LATIN1_GENERAL_CP1_CI_AI

Para utilizar un COLLATE específico en una sentencia:

if 'cardiología' = 'cardiologia' COLLATE SQL_LATIN1_GENERAL_CP1_CI_AI --CI = case insensitive (ignora mayúsculas) --AI = accent insensitive (ignora acentos)