in

Community Server

The platform that enables you to build rich, interactive communities

sql

  • Importar datos de un archivo a una tabla SQL

     

    Para importar datos de un archivo (.txt, .csv) dentro de una tabla se puede utilizar el siguiente script de SQL:

    BULK
    INSERT
    CSVTest
    FROM 'c:\csvtest.txt'
    WITH
    (
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n'
    )
    GO
    --Check the content of the table.
    SELECT *
    FROM
    CSVTest
    GO

  • Error SQL Cannot set a credential for principal 'sa'

    El error que nos manda al tratar de cambiar contraseña o habilitar el login del usuario ‘sa’  cuando se requiere hacerlo es el siguiente:

    Msg 15535, Level 16, State 1, Line 1
    Cannot set a credential for principal 'sa'.

    Anyway, for anyone on SQL Server 2005 who gets this Cannot set a credential for principal ‘sa’ error, the fix is easy. Here’s what you see:

    image

    Notice the arrow points to the “Map to Credential” checkbox that is unchecked. That’s the problem – it should be checked. I made my changes, clicked “Ok” and that’s when I received the error. Being the industrious little beaver that I am, I then clicked the Script button and tried to run the code:

    The fix looks like this:

    image

    It’s weird how “Map to Credential” is checked yet there is no credential specified. But that’s what you have to do.

  • Update en SQL usando INNER JOIN

     

    El siguiente script puede ser usado para actualizar una tabla específica usando el INNER JOIN para tomar en cuenta otra tabla para la actualización.

     

    BEGIN TRAN

    UPDATE Tabla1

    SET Campo = ValorNuevo

    FROM Tabla1

    INNER JOIN Tabla2 ON (CampoTabla1 = CampoTabla2)

    WHERE (Condiciones de la Union)

  • Script para obtener las columnas identity de una base de datos

     

    El siguiente script muestra todas las columnas que son identity de una base de datos, además de mostrar su valor inicial, el incremento, si contiene replicación y el último valor de la columna.

    SELECT
    Name AS Columna,
    is_identity AS "Es Identity",
    seed_value AS "Valor Inicial",
    increment_value AS Incremento,
    is_not_for_replication AS Replicacion,
    last_value AS "Ultimo Valor"
    FROM sys.identity_columns

     

  • Establecer modo de log simple a una Base de datos

    USE [master]
    GO
    ALTER DATABASE [Asistel] SET RECOVERY SIMPLE WITH NO_WAIT
    GO
    ALTER DATABASE [Asistel] SET RECOVERY SIMPLE
    GO

  • Como recuperar una Base de Datos sin archivo LDF

     

    Se crea una base de datos con el mismo Nombre de la que no tiene el log de transacciones 

    CREATE DATABASE [AsistelHSJ]

    ON PRIMARY ( NAME = 'AsistelHSJ', FILENAME = 'C:\AsistelHSJ.MDF')

    LOG ON (NAME = N'AsistelHSJ_Log', FILENAME = 'C:\AsistelHSJ_Log.LDF')

    Luego ejecuta

    alter database AsistelHSJ SET EMERGENCY

    Luego se detiene el servicio de SQL para Renombrar los archivos mdf y ldf, y copia el MDF de la base de datos que no
    le esta haciendo attach posteriormente se inicia nuevamente el servicio y se ejecuta para verificar que efectivamente este en estado de emergencia 

    SELECT state_desc FROM sys.databases WHERE name='AsistelHSJ'

    Preparamos la base de datos para ser utilizada por un solo usuario.
    alter database AsistelHSJ set single_user<?xml:namespace prefix = o />
    Se realiza la reparación de la Base de datos
    DBCC CHECKDB (AsistelHSJ , REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS;<?xml:namespace prefix = o />
    Se Regresa la base de datos para ser utilizada por varios usuarios
    alter database AsistelHSJ set multi_user<?xml:namespace prefix = o />
    Con esto se recuperará la base de datos con nuevo registro de transacciones. 

     

    Adjunta una base de datos que solo tiene un archivo de datos al servidor
    actual.

    Sintaxis
    sp_attach_single_file_db [ @dbname = ] 'dbname'
    , [ @physname = ] 'physical_name'

    Argumentos
    [@dbname =] 'dbname'
    Se trata del nombre de la base de datos que se va adjuntar al servidor. El
    argumento dbname es de tipo sysname y tiene un valor predeterminado de NULL.
    [@physname =] 'phsyical_name'
    Es el nombre fsico, incluida la ruta de acceso, del archivo de base de
    datos. El argumento physical_name es de tipo nvarchar(260) y tiene un valor
    predeterminado de NULL.

    Observaciones
    Cuando sp_attach_single_file_db adjunta la base de datos al servidor, genera
    un nuevo archivo de registro y realiza un trabajo adicional de limpieza para
    quitar la duplicación de la base de datos recién adjuntada.

    Utilice sp_attach_single_file_db sólo en bases de datos que haya separado
    previamente del servidor con una operación sp_detach_db explcita.

    Permisos
    Sólo pueden ejecutar este procedimiento los miembros de las funciones fijas
    de servidor sysadmin y dbcreator.

  • Actualizar datos de compañías de números definidos

     

    El siguiente script ayuda a actualizar los nombres de las compañías que ya estan almacenadas dentro del sistema para que las llamadas ya aparezcan con los nombres actualizados de las empresas a las cuales corresponde dicho número:

     

    select distinct CallDetails_sDialNumber,CallDetails_sCallType,CallDetails_sOwnerDescription from tblcalldetails where CallDetails_lOwnerId>1

    and calldetails_tDate>'2009-08-01'

     

    UPDATE TblCalldetails

    set    CallDetails_sOwnerDescription= newdata.Nombre,

    CallDetails_bOwnerType=0

    FROM

    (

    SELECT     Companies_lId as Id, Companies_sName  as Nombre  FROM tblCompanies

    ) newdata

    WHERE    CallDetails_tDate >'2009-08-01' and CallDetails_lOwnerId>0 AND CallDetails_lOwnerId =newdata.Id

  • Script para borrado de llamadas duplicadas utilizando INNER JOIN

    El siguiente script se puede utilizar en caso de tener necesidad de borrar llamadas que por alguna razón se hayan insertado en la TblCallDetails mas de una vez (en caso de que las llamadas se hayan insertado mas de 2 veces se tiene que ejecutar el script hasta que el resultado del borrado sea igual a 0) 

    Es decir cuando se obtenga el siguiente resultado: (0 row(s) affected) ; que quiere decir que ya no hay llamadas duplicadas. El script usa los siguientes filtros:

    1. Se establece una fecha para la búsqueda de llamadas duplicadas.
    2. Busca en un PBX específico.
    3. Verifica que el CallDetails_lRemoteId se encuentre más de una vez.

     

    BEGIN TRAN

    DELETE Llamadas

    FROM  TblCalldetails AS Llamadas

    INNER JOIN

     (

      SELECT MAX(CallDetails_lId) AS CallId FROM TblCalldetails

      WHERE CallDetails_tDate > CONVERT(DATETIME,'01/01/2009',103) AND CallDetails_lPbxId=36

      GROUP BY CallDetails_lRemoteId

      HAVING COUNT(CallDetails_lRemoteId)>1

    )AS Duplicadas

    ON Llamadas.CallDetails_lId = Duplicadas.CallId

    --ROLLBACK

    --COMMIT

  • Tamaño de Tablas

    Con este script se puede conocer el tamaño de cada una de las tablas de una base de datos.

    CREATE PROCEDURE spTableSpace

    AS

    BEGIN

    DECLARE @tablename sysname

    DECLARE tables_cursor CURSOR FOR SELECT name FROM sysobjects

    WHERE type = 'U'

    ORDER BY name OPEN tables_cursor FETCH NEXT

    FROM tables_cursor INTO @tablename WHILE (@@FETCH_STATUS <> -1)

    BEGIN

    EXEC ('sp_spaceused ' + @tablename)

    FETCH NEXT FROM tables_cursor INTO @tablename

    END

    CLOSE tables_cursor DEALLOCATE tables_cursor

    END

    GO

    exec spTableSpace

    drop procedure spTableSpace

     

  • Script para copiar datos de una tabla a otra

    Con el siguiente script se pueden copiar datos de una tabla a otra tomando en cuenta las siguientes restricciones:

    1. Deben de ser el mismo numero de campos
    2. Los campos deben ser del mismo tipo
    3. No permite copiar datos de columnas que sean Identity

     

    INSERT INTO [tabla donde se va a escribir] (campo1, campo2, campo3, ...)
    SELECT (campo1, campo2, campo3, ...)
    FROM [tabla de la que se quiere copiar]
    [
    LEFT JOIN ]
    [WHERE condicion]

    Esta forma de copiar datos entre tablas fue encontrada en la página http://www.sqlserverya.com.ar/index.php?inicio=0 en donde se pueden encontrar alrededor de 70 conceptos con ejemplos acerca de SQL Server.

     

    Otra manera de copiar datos entre tablas es la siguiente:

     

    UPDATE MyTable
    SET complete = 1, complete_date = newdata.complete_date, post_score = newdata.post_score
    FROM
    ( SELECT userID, complete_date, post_score
      FROM MyTable
      WHERE courseID = 6
      AND complete = 1
      AND complete_date > '8/1/2008'
    ) newdata
    WHERE CourseID = 11 AND userID = newdata.userID

     

    Este script nos permite copiar datos entre dos tablas o en la misma tabla.

  • Crear plan de mantenimiento (continuación)

    Problema :

    Al crear el plan de mantenimiento puede afectar un Bug que hay dentro del Service Pack 2 de SQL Server ya que no carga la tarea de generar respaldos completos de la base de datos. Y al momento de ejecutar dicho plan de mantenimiento se genera el siguiente error:

    Started:  1:18:50 PM  Error: 2009-04-07 13:19:21.07    
    Code: 0xC0010018     Source: Back Up Database (Full)     
    Description: Error loading a task.
    The contact information for the task is "Back Up Database Task; Microsoft Corporation;
    Microsoft SQL Server v9; © 2004 Microsoft Corporation;
    All Rights Reserved;
    http://www.microsoft.com/sql/support/default.asp;1".
    This happens when loading a task fails.  End Error 
    Progress: 2009-04-07 13:19:21.32     Source: {0E392D67-8BE5-4D36-B956-BF8E67693048}     
    Executing query "DECLARE @Guid UNIQUEIDENTIFIER     
    EXECUTE msdb..sp".: 100% complete  End Progress 
    Error: 2009-04-07 13:19:21.59    
    Code: 0xC0024104    
    Source: Back Up Database (Full)     
    Description: The Execute method on the task returned error code 0x80004003
    (Collection cannot be null.  Parameter name: c).
    The Execute method ...  The package execution fa...  The step failed.

    SOLUCION :

    Al momento de crear el plan de mantenimiento, hacerlo sin el asistente de creación de SQL Management Studio y elegir el tipo de tarea de T-SQL, arrastrarla al espacio de edición del plan de mantenimiento y elegir la opción de Editar…

    1. Elegir en la opción de Timeout el valor 0 que por default no establece ningún timeout para la ejecución.
    2. Escribir el siguiente script en el cuadro de texto.

     

    USE [nombre_BD] BACKUP DATABASE [nombre_BD]--BD que se va a respaldar. TO  DISK = N'C:\Ruta_donde_almacenar\nombre_BD_full.BAK'--Ruta a donde se va a generar el respaldo. WITH  DESCRIPTION = N'Respaldo completo de la base de datos nombre_BD', --Descripción del respaldo. NOFORMAT, INIT, NAME = N'nombre_BD_respaldo_completo', --Alias del respaldo a nivel lógico. SKIP, NOREWIND, NOUNLOAD, CHECKSUM

     

    Al terminar solo generar el Schedule para determinar cuando se va a generar la tarea y Guardar el plan de mantenimiento.

  • Error al modificar un plan de mantenimiento SQL 2005

    Error:

    GUID debe contener 32 dígitos con guiones 4 (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).

    Causa:

    Este problema se produce porque un registro del plan de mantenimiento no se actualiza en la tabla de sistema sysmaintplan_subplans al importar el plan de mantenimiento desde el paquete Integration Services.

    Solucion:

    Para solucionar este problema, crear manualmente el registro del plan de mantenimiento que se importa. Para ello, siga estos pasos:

    1. Inicie SQL Server Management Studio y, a continuación, conéctese a la instancia de SQL Server 2005.
    2. Para obtener el identificador GUID del plan de mantenimiento que se importa, ejecute las instrucciones siguientes.
      use msdb
      go
      select id from sysdtspackages90 where name='NewPlan'
      go
      
      Tenga en cuenta Estas instrucciones se supone que importar un plan de mantenimiento que se denomina NewPlan en la instancia predeterminada de SQL Server 2005.

      Para obtener el identificador GUID siguiente en la columna id del resultado:
      6A7FA469-F5DB-4FF4-B153-5F11926477B7
    3. Crear un trabajo que se denomina NewPlanJob y, a continuación, haga clic en Mantenimiento de bases de datos en la lista categoría .
    4. Para el trabajo que ha creado en el paso 3, crear un nuevo paso que se denomina NewPlanStep y, a continuación, haga clic en paquete de SQL Server Integration Services en la lista Tipo .
    5. Cierre el cuadro de diálogo nuevo trabajo .
    6. Para obtener el identificador GUID del paso que ha creado en el paso 4, ejecute las instrucciones siguientes.
      use msdb
      go
      select job_id from sysjobsteps where step_name='NewPlanStep'
      go
      
      Para obtener el identificador GUID siguiente en la columna idtrabajo del resultado:
      E85564E2-92A1-4B70-89DF-329F152CCD97
    7. Para obtener el identificador GUID del registro que no se actualiza en la tabla de sistema sysmaintplan_subplans al importar el plan de mantenimiento. Para ello, siga estos pasos:
      1. Iniciar Business Intelligence Development Studio y, a continuación, cree un nuevo proyecto de Integration Services.
      2. En el Explorador de soluciones, haga clic con el botón secundario en los paquetes de SSIS y, a continuación, haga clic en Agregar paquete existente .
      3. Agregue el plan de mantenimiento NewPlan al proyecto actual desde la ubicación correcta del paquete.
      4. En el Explorador de soluciones, haga doble clic en el paquete importado.
      5. En la vista Diseño, haga clic en la tarea que tiene un nombre que se asemeja a las siguientes:
        Notificación de tarea para subplan-{1EFB298F-1313-4A26-8986-A5C9C5A0C2AB}
        En este ejemplo, 1EFB298F-1313-4A26-8986-A5C9C5A0C2AB es el GUID.
    8. Para insertar el registro necesario en la tabla de sistema sysmaintplan_subplans , ejecute la siguiente instrucción en SQL Server Management Studio.
      insert into sysmaintplan_subplans (
      	subplan_id,
      	subplan_name,
      	subplan_description,
      	plan_id,
      	job_id
      )values (
      	'1EFB298F-1313-4A26-8986-A5C9C5A0C2AB',
      	'NewPlan','',
      	'6A7FA469-F5DB-4FF4-B153-5F11926477B7',
      	'E85564E2-92A1-4B70-89DF-329F152CCD97'
      )
      GO
    9. Para corregir el comando del programa el trabajo que ha creado en el paso 3, ejecute la siguiente instrucción.
      update sysjobsteps 
      set command='/Server YourServer /SQL "Maintenance Plans\NewPlan" /set "\Package\NewPlan.Disable;false"'
      where step_name='NewPlanStep'
  • Crear plan de mantenimiento no se pudo.

    Sintomas:

    El '@subsystem' especificado no es válido (los valores válidos son devuelto por sp_enum_sqlagent_subsystems). (Microsoft SQL Server, error 14234)

    Causa:

    Este comportamiento se produce cuando se instala SQL Server 2005 sin instalar el servicio de SQL Server 2005 Integration Services (SSIS). Al crear el plan de mantenimiento, el código siguiente se ejecuta.  

    Solucion:

    Para resolver este comportamiento, instale el servicio de Integration Services desde el CD de SQL Server 2005. Para ello, siga estos pasos:

    1. Ejecute el Asistente para instalación de SQL Server.
    2. En la página comprobar la configuración del sistema, haga clic en siguiente después de que finalice la exploración.
    3. En el cuadro Nombre y en el cuadro organización , escriba la información adecuada y, a continuación, haga clic en siguiente .
    4. Haga clic en para activar la casilla de verificación Integration Services y, a continuación, haga clic en siguiente .
    5. Haga clic en siguiente y, a continuación, haga clic en Instalar .
    6. Cuando finalice la instalación, haga clic en siguiente y, a continuación, haga clic en Finalizar .

    Fuente de Informacion:

    http://support.microsoft.com/kb/909036#top

  • Obtener la version del Servidor

    Para obtener la versión de sql podemos ejecutar el siguiente comnado:

     select @@version

Powered by Community Server (Non-Commercial Edition), by Telligent Systems