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

sábado, 20 de agosto de 2022

SQL LEN() DE UN DATO NULL

 SQL LEN() DE UN DATO NULL

Después de ejecutar el siguiente código de ejemplo, quedó claro que LEN de los valores NULL no es 0 (cero), pero es NULL.

DECLARE @MyVar VARCHAR(10)
SET @MyVar = NULL
SELECT LEN(@MyVar)

sql len


domingo, 14 de agosto de 2022

Obtener el día de la semana en sql Server

 Obtener el día de la semana en sql Server

SELECT (CASE DATENAME(dw,GETDATE())
     when 'Monday' then 'LUNES'
     when 'Tuesday' then 'MARTES'
     when 'Wednesday' then 'MIERCOLES'
     when 'Thursday' then 'JUEVES'
     when 'Friday' then 'VIERNES'
     when 'Saturday' then 'SABADO'
     when 'Sunday' then 'DOMINGO'
END)

Modificar columna de tabla sql para que no sea null

 Modificar columna de tabla sql para que no sea null

Solucion:

Sintax

ALTER TABLE table_name
ADD column_name datatype;

UPDATE persona SET nombre="0" WHERE nombre IS NULL; ALTER TABLE persona ALTER COLUMN nombre varchar NOT NULL;


viernes, 29 de julio de 2022

Usar una variable en un LIKE sql server

Usar una variable en un LIKE sql server 

Ejemplo:


ALTER PROCEDURE <Name>
(
    @PartialName VARCHAR(50) = NULL
)

SELECT Name 
    FROM <table>
    WHERE Name LIKE '%' + @PartialName + '%'

jueves, 16 de junio de 2022

Cannot truncate table 'XXXX' because it is being referenced by a FOREIGN KEY constraint.

 Cannot truncate table 'esquema.tutabla' because it is being referenced by a FOREIGN KEY constraint

Error:

Msg 4712, Level 16, State 1, Line 1

Cannot truncate table 'esquema.tutabla' because it is being referenced by a FOREIGN KEY constraint.


Solucion, primero tienes que eliminar las dependecias hijas de la tabla, despues ejecuta el siguiente script:

unicamente tienes que llenar el esquema y el nombre de tu tabla a truncar

DECLARE @Debug bit = 0;

-- List of tables to truncate
select
    SchemaName, Name
into #tables
from (values 
    ('esquema''tutabla')

as X(SchemaName, Name)


BEGIN TRANSACTION TruncateTrans;

with foreignKeys AS (
     SELECT 
        SCHEMA_NAME(fk.schema_idas SchemaName
        ,fk.Name as ConstraintName
        ,OBJECT_NAME(fk.parent_object_idas TableName
        ,SCHEMA_NAME(t.SCHEMA_IDas ReferencedSchemaName
        ,OBJECT_NAME(fk.referenced_object_idas ReferencedTableName
        ,fc.constraint_column_id
        ,COL_NAME(fk.parent_object_idfc.parent_column_idAS ColumnName
        ,COL_NAME(fk.referenced_object_idfc.referenced_column_idas ReferencedColumnName
        ,fk.delete_referential_action_desc
        ,fk.update_referential_action_desc
    FROM sys.foreign_keys AS fk
        JOIN sys.foreign_key_columns AS fc
            ON fk.object_id = fc.constraint_object_id
        JOIN #tables tbl 
            ON OBJECT_NAME(fc.referenced_object_id= tbl.Name
        JOIN sys.tables t on OBJECT_NAME(t.object_id= tbl.Name 
            and SCHEMA_NAME(t.schema_id= tbl.SchemaName
            and t.OBJECT_ID = fc.referenced_object_id
)



select
    quotename(fk.ConstraintNameAS ConstraintName
    ,quotename(fk.SchemaName+ '.' + quotename(fk.TableNameAS TableName
    ,quotename(fk.ReferencedSchemaName+ '.' + quotename(fk.ReferencedTableNameAS ReferencedTableName
    ,replace(fk.delete_referential_action_desc'_'' 'AS DeleteAction
    ,replace(fk.update_referential_action_desc'_'' 'AS UpdateAction
    ,STUFF((
        SELECT ',' + quotename(fk2.ColumnName)
        FROM foreignKeys fk2 
        WHERE fk2.ConstraintName = fk.ConstraintName and fk2.SchemaName = fk.SchemaName
        ORDER BY fk2.constraint_column_id
        FOR XML PATH('')
    ),1,1,''AS ColumnNames
    ,STUFF((
        SELECT ',' + quotename(fk2.ReferencedColumnName)
        FROM foreignKeys fk2 
        WHERE fk2.ConstraintName = fk.ConstraintName and fk2.SchemaName = fk.SchemaName
        ORDER BY fk2.constraint_column_id
        FOR XML PATH('')
    ),1,1,''AS ReferencedColumnNames
into #FKs
from foreignKeys fk
GROUP BY fk.SchemaNamefk.ConstraintNamefk.TableNamefk.ReferencedSchemaNamefk.ReferencedTableNamefk.delete_referential_action_descfk.update_referential_action_desc



-- Drop FKs
select 
    identity(int,1,1as ID,
    'ALTER TABLE ' + fk.TableName + ' DROP CONSTRAINT ' + fk.ConstraintName AS script
into #scripts
from #FKs fk

-- Truncate 
insert into #scripts
select distinct 
    'TRUNCATE TABLE ' + quotename(tbl.SchemaName+ '.' + quotename(tbl.NameAS script
from #tables tbl

-- Recreate
insert into #scripts
select 
    'ALTER TABLE ' + fk.TableName + 
    ' WITH CHECK ADD CONSTRAINT ' + fk.ConstraintName + 
    ' FOREIGN KEY ('+ fk.ColumnNames +')' + 
    ' REFERENCES ' + fk.ReferencedTableName +' ('+ fk.ReferencedColumnNames +')' +
    ' ON DELETE ' + fk.DeleteAction COLLATE Latin1_General_CI_AS_KS_WS + ' ON UPDATE ' + fk.UpdateAction COLLATE Latin1_General_CI_AS_KS_WS AS script
from #FKs fk


DECLARE @script nvarchar(MAX);

DECLARE curScripts CURSOR FOR 
    select script
    from #scripts
    order by ID

OPEN curScripts

WHILE 1=1 BEGIN
    FETCH NEXT FROM curScripts INTO @script
    IF @@FETCH_STATUS != 0 BREAK;

    print @script;
    IF @Debug = 0
        EXEC (@script);
END
CLOSE curScripts
DEALLOCATE curScripts


drop table #scripts
drop table #FKs
drop table #tables


COMMIT TRANSACTION TruncateTrans;

lunes, 6 de junio de 2022

Renombrar COLUMNA SQL server

Sintaxis 

EXEC sp_rename 'esquema.tabla.columna', 'nombrenuevodecolumna', 'COLUMN';

Ejemplo:

   EXEC sp_rename 'dbo.cfdparse.noTasaIrs', 'noTasaISR', 'COLUMN';


jueves, 2 de junio de 2022

Eliminar los caracteres de espacio en blanco de una cadena en SQL Server

 Intento eliminar espacio en blanco con rtrin, trin y ltrim pero no funciona.

Solucion:

SELECT LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(CADENACONESPACIOS, CHAR(10), ''), CHAR(13), ''), CHAR(9), '')))




martes, 31 de mayo de 2022

Eliminar filas duplicadas de una tabla de SQL Server


DELETE T

FROM

(

SELECT *

, DupRank = ROW_NUMBER() OVER (

              PARTITION BY nombre

              ORDER BY (SELECT NULL)

            )

FROM Nombres

) AS T

WHERE DupRank > 1 


Elimina los registros duplicados en este caso nombre es la columna que tiene los valores duplicados. 


martes, 24 de mayo de 2022

SQL: COMO OBTENER FECHA DE INICIO Y FIN DE SEMANA

 

En base a la fecha de hoy obtiene el dia en que inicia y finaliza la semana:



DECLARE @HOY   DATETIME
DECLARE @INISEM DATETIME
DECLARE @FINSEM DATETIME
SET @HOY = GETDATE() 


SELECT  @INISEM = DATEADD(dd, 0 - (@@DATEFIRST + 5 + DATEPART(dw, @HOY)) % 7, @HOY)  ,
        @FINSEM = DATEADD(dd, 6 - (@@DATEFIRST + 5 + DATEPART(dw, @HOY)) % 7, @HOY)  


SELECT @HOY HOY, @INISEM INICIO_SEMANA,@FINSEM FIN_SEMANA

miércoles, 2 de marzo de 2022

Obtener días del mes SQL

 Con la siguiente consulta te permite obtener una lista de los dias de un mes, pide como parametros de entrada el mes y el año

declare @MES INT
DECLARE @AÑO INT
DECLARE @FechaInicio date
DECLARE @FechaFin date


SET @MES = 2
SET @AÑO = 2022

 SELECT @FechaInicio = CONVERT(DATE,CONVERT(NVARCHAR,@AÑO)+'-'+CONVERT(NVARCHAR,@MES)+'-01')

select @FechaFin = EOMONTH(@FechaInicio)

 
--Aquí creamos la variable tabla con los valores
DECLARE @DiaMes TABLE ([Fecha] DATE,[Año] int,[Mes] int,[Dia] int,[noDia] int, [dsDia] nvarchar(50))

    WHILE(@FechaInicio<=@FechaFin) 
        BEGIN   
            INSERT @DiaMes([Fecha],[Año],[Mes] ,[Dia] ,[noDia], [dsDia] )
            SELECT  @FechaInicio, YEAR(@FechaInicio), MONTH(@FechaInicio), 
DAY(@FechaInicio),DATEPART(weekday,@FechaInicio),(case DATEPART(dw,@FechaInicio) when 2 
then 'Lunes' when 3 then 'Martes' when 4 then 'Miércoles' when 5 then 'Jueves' when 6
 then 'Viernes' when 7 then 'Sábado' when 1 then 'Domingo' end
            SET @FechaInicio = DATEADD(DD,1,@FechaInicio)
        END
select * from @DiaMes

Resultado:



Obtener Descripcion de dia sql

 De esta forma podrías obtener el nombre del día de la semana pero lo devolvería en inglés.

SELECT DATENAME(weekday, getdate()) AS nombreDiaSemana;

Por lo tanto, lo más recomendable sería traer el número del día de la semana y mediante el uso de casos ir determinando el nombre del día de la semana.


SELECT (case DATEPART(dw,getdate()when 2 then 'Lunes' when 3 then 'Martes' when 4 then 'Miércoles' when 5 then 'Jueves' when 6 then 'Viernes' when 7 then 'Sábado' when 1 then 'Domingo' endAS nombreDiaSemana;

jueves, 23 de diciembre de 2021

Ver el número de línea en el SQL Server Management Studio

 Por default viene sin esta configuración y se ve de esta manera:








Para configurar nos vamos a tolos/ Options












Marcamos el check Line numbers y le damos OK











Y Listo…



 

 


 

SP_WHO2 Tunning BD Monitoreo

 Con sp_who2 se puede saber que procesos estan corriendo en el momento  










Con la siguiente consulta se puede ver cual es la sentencia que se esta ejecutando en base al SPID:

declare
    @spid int
,   @stmt_start int
,   @stmt_end int
,   @sql_handle binary(20)

set @spid = XXX -- LLENAR SPID

select  top 1
    @sql_handle = sql_handle
,   @stmt_start = case stmt_start when 0 then 0 else stmt_start / 2 end
,   @stmt_end = case stmt_end when -1 then -1 else stmt_end / 2 end
from    sys.sysprocesses
where   spid = @spid
order by ecid

SELECT
    SUBSTRING(  text,
            COALESCE(NULLIF(@stmt_start, 0), 1),
            CASE @stmt_end
                WHEN -1
                    THEN DATALENGTH(text)
                ELSE
                    (@stmt_end - @stmt_start)
                END
        )
FROM ::fn_get_sql(@sql_handle)

Obtendrá como resultado el SP o fracción de consulta que se esta ejecutando.

martes, 27 de julio de 2021

Replication – Execution of filter stored procedure xxxx failed. See the SQL Server errorlog for more information.

 Execution of filter stored procedure 1288585956 failed. See the SQL Server errorlog for more information.

The Log-Scan Process failed to construct a replicated command from log sequence number (LSN) {005765c9:0000bb74:0002}. Back up the publication database and contact Customer Support Services.


El error anterior indica que Log Reader Agent está bloqueado en LSN {0001d651: 00002a49: 0006} y no puede leer ni crear un comando para este LSN.
Como el Agente de lectura de registros está atascado en el LSN, no avanza y ya que solo podemos tener 1 Agente de lectura de registros en Replicación transaccional que se utiliza para todas las publicaciones. Todas las publicaciones muestran errores en el monitor de replicación y no avanzan.
Verificamos la transacción en el LSN {0001d651: 00002a49: 0006}.

En el error anterior, vemos "Error en la ejecución del procedimiento almacenado del filtro 2048634987"
. Verificamos el ID del procedimiento almacenado del filtro de sysarticles y descubrimos que era el procedimiento almacenado del filtro para la tabla dbo.booking



SELECT * FROM sys.dm_cdc_errors


Sin embargo, la entrada de el procedimiento almacenado del filtro faltaba en las tablas sysobjects, lo que indica que el procedimiento almacenado del filtro se eliminó por alguna razón. Para confirmar esto usamos la siguiente consulta

select * from (select art.name as article_name

, art.pubid as publication_id

, art.artid as article_id

, art.filter as filter_proc_id

, isnull(obj.name,'## MISSING!! ##') as filter_proc_name

from sysarticles art left outer join sys.objects obj

on art.filter = obj.object_id

where art.filter > 0)as results

solución

Eliminé la publicación, la recreé y luego creé una suscripción sin inicialización. esto impidió una instantánea completa.

O

Entonces, para resolver esto, identificamos las publicaciones de la tabla syspublications con pubid = 750.
Luego eliminamos el filtrado para los 3 artículos anteriores y los volvimos a agregar y el procedimiento almacenado se volvió a crear.
Luego recreamos la instantánea para esa publicación y marcamos su suscriptor para reinicializar.
El agente de instantáneas volvió a crear la instantánea y el agente de lector de registros comenzó a funcionar correctamente sin errores.
Verificamos el Monitor de replicación y el error desapareció.

domingo, 11 de octubre de 2020

Convertir DataReader a DataTable C# (SqlDataReader to DataTable)

 Puede cargar un archivo DataTabledirectamente desde un lector de datos utilizando el Load()método que acepta un archivo IDataReader.

var dataReader = cmd.ExecuteReader();
var dataTable = new DataTable();
dataTable.Load(dataReader);
o
  var dataTable = new System.Data.DataTable();
   var dt = new System.Data.DataTable();
  SqlDataReader dr;
  dr = cmd.ExecuteReader();
 if (dr.Read())
                    {
                        dataTable.Load(dr);
                        dt = dataTable;
                    }



lunes, 17 de agosto de 2020

ACTUALIZAR ESTADISTICAS SQL (TODAS LAS TABLAS)

 ACTUALIZAR ESTADISTICAS SQL (TODAS LAS TABLAS)

SET NOCOUNT  ON

DECLARE  @SQLcommand NVARCHAR(512),

         @Table      SYSNAME

 

DECLARE curAllTables CURSOR  FOR

SELECT table_schema + '.[' + table_name + ']'

FROM   information_schema.tables

WHERE  TABLE_TYPE = 'BASE TABLE'

order by table_name

 

OPEN curAllTables

 

FETCH NEXT FROM curAllTables

INTO @Table

 

WHILE (@@FETCH_STATUS = 0)

  BEGIN

    PRINT N'UPDATING STATISTICS FOR TABLE: ' + @Table

    SET @SQLcommand = 'UPDATE STATISTICS ' + @Table + ' WITH FULLSCAN'

    EXEC sp_executesql @SQLcommand

     

    FETCH NEXT FROM curAllTables

    INTO @Table

  END

CLOSE curAllTables

DEALLOCATE curAllTables

SET NOCOUNT  OFF

GO


Cómo establecer nivel de compatibilidad para SQL Server 2008 o 2005 Database

 Cómo establecer nivel de compatibilidad para SQL Server 2008 o 2005 Database

[Microsoft][ODBC SQL Server Driver][SQL Server][Msg 4147, Level 15, State 1, Line 4] The query uses non-ANSI outer join operators (“*=” or “=*”). To run this query without modification, please set the compatibility level for current database to 80, using the SET COMPATIBILITY_LEVEL option of ALTER DATABASE. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions

of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.

 

 

For example, SQL query below is not valid:

SELECT o.name FROM sys.objects o, sys.views v WHERE o.object_id *= v.object_id;

And should be replaced with the following code:

SELECT o.name FROM sys.objects o LEFT JOIN sys.views v ON o.object_id = v.object_id;

Or the following abbreviated inner join statement:

SELECT o.name FROM sys.objects o, sys.views v WHERE o.object_id = v.object_id;

For administrator who can’t change the code, the easiest workaround is to revert the compatibility level of the database in order to provide the backward compatibility to old-style joins. sp_dbcmptlevel stored procedures (deprecated) or Transact-SQL can be used to set certain (partially, not all) database behaviors to be compatible with the earlier version of SQL Server. This MSDN article provides overview on what behaviors are changed on each compatibility level.

Version of SQL Server that can be reverted to can be one of the following:

60 = SQL Server 6.0

65 = SQL Server 6.5

70 = SQL Server 7.0

80 = SQL Server 2000

90 = SQL Server 2005

100 = SQL Server 2008

Note: Compatibility level 60, 65, and 70 no longer available in SQL Server 2008. And future version of SQL Server will support only two (2) prior version of backward compatibility. A database containing an indexed view cannot be changed to a compatibility level lower than 80. Do also take note that when a database is set to backward-compatibility mode, some of the new functionalities may be lost, such as SQL CLR support and SSMS diagrams for the database. Beside, the compatibility mode affects behaviors only for the specified database, not for the entire server.

Steps to Change and Set Compatibility Level of A Database in SQL Server

The following SQL commands can be issued in SQL Server Management Studio Query window. Remember to execute Go after each command.

  1. Optional: Set the database to single user access mode:
    ALTER DATABASE database_name SET SINGLE_USER;
  2. Set the database compatibility level to one of the earlier version stated above:
    Transact-SQL Method
    ALTER DATABASE database_name SET COMPATIBILITY_LEVEL = { 80 | 90 | 100 }
    For example,
  3. ALTER DATABASE my_db SET COMPATIBILITY_LEVEL = 80
    sp_dbcmptlevel Stored Procedure Method
    EXEC sp_dbcmptlevel database_name, compatibility_level value;
    For example,
    EXEC sp_dbcmptlevel my_db, 90;
  4. Optional: Put back the database in multiuser access mode:
    ALTER DATABASE database_name SET MULTI_USER;