Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Inserccion desconocida.

Estas en el tema de Inserccion desconocida. en el foro de SQL Server en Foros del Web. Buen dia. Alguien me pude ayudar a desifrar lo que significa este codigo:: en realidad lo que no entiendo es lo que esta en negrita. ...
  #1 (permalink)  
Antiguo 08/12/2011, 23:47
 
Fecha de Ingreso: mayo-2011
Ubicación: sinaloa
Mensajes: 150
Antigüedad: 13 años, 6 meses
Puntos: 4
Pregunta Inserccion desconocida.

Buen dia. Alguien me pude ayudar a desifrar lo que significa este codigo::
en realidad lo que no entiendo es lo que esta en negrita.

DECLARE @fDesde DATETIME, @fHasta DATETIME
SELECT @fDesde = '20010101', @fhasta = '20111205'
;WITH
l0 AS(SELECT 0 AS c UNION ALL SELECT 0),
l1 AS(SELECT 0 AS c FROM l0 AS a, l0 AS b),
l2 AS(SELECT 0 AS c FROM l1 AS a, l1 AS b),
l3 AS(SELECT 0 AS c FROM l2 AS a, l2 AS b),
l4 AS(SELECT 0 AS c FROM l3 AS a, l3 AS b),
l5 AS(SELECT 0 AS c FROM l4 AS a, l4 AS b),
l6 AS(SELECT 0 AS c FROM l5 AS a, l5 AS b),
nums AS(SELECT ROW_NUMBER() OVER(ORDER BY c) AS n FROM l6)

INSERT table_1 (nombre,anio,mes,dia,numdia,semana,quarter,bimestr e,trimestre,semestre)
SELECT
DATEADD(DAY, nums.n - 1, @fDesde),
YEAR(@fDesde+nums.n - 1),
MONTH(@fDesde+nums.n - 1),
Day(@fDesde+nums.n - 1),
Datepart(dayofyear,@fDesde+nums.n - 1),
Datepart(weekday,@fDesde+nums.n - 1),
Datepart(quarter,@fDesde+nums.n - 1),
case
when month(@fDesde+nums.n - 1) in (1,2) then 1
when month(@fDesde+nums.n - 1) in (3,4) then 2
when month(@fDesde+nums.n - 1) in (5,6) then 3
when month(@fDesde+nums.n - 1) in (7,8) then 4
when month(@fDesde+nums.n - 1) in (9,10) then 5
when month(@fDesde+nums.n - 1) in (11,12) then 6
end,
case
when month(@fDesde+nums.n - 1) in (1,2,3) then 1
when month(@fDesde+nums.n - 1) in (4,5,6) then 2
when month(@fDesde+nums.n - 1) in (7,8,9) then 3
when month(@fDesde+nums.n - 1) in (10,11,12) then 4
end,
case
when month(@fDesde+nums.n - 1) in (1,2,3,4,5,6) then 1
when month(@fDesde+nums.n - 1) in (7,8,9,10,11,12) then 2
end
FROM nums WHERE n <= DATEDIFF(DAY, @fDesde, @fHasta) + 1
  #2 (permalink)  
Antiguo 09/12/2011, 10:34
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Inserccion desconocida.

ya probaste quitando ese pedazo de codigo y viendo que te regresa?? No mejor no hagas eso jejeje lo que hace ese pedazo de codigo te crea como una tabla temporal que estas usando en tu query nums.n.

Saludos!!!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 09/12/2011, 22:38
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 1 mes
Puntos: 85
Respuesta: Inserccion desconocida.

La estructura WITH AS se conoce como CTE (common table expression), y de forma similar a las tablas derivadas, vistas o tablas temporales, sirve para crear conjuntos de datos temporales dentro del ámbito de ejecución de una consulta SQL, pero con dos mejoras:

1. Las CTE permiten múltiples referencias sobre una misma definición, es decir, puedes crear un conjunto de datos temporal con una sola sentencia SQL y utilizarlo varias veces en el FROM, esto es una ventaja sobre las tablas derivadas, que requieren una definición por cada referencia, lo que genera código SQL más complejo.

2. Las CTE no son objetos, y las vistas o tablas temporales si lo son, en este caso, aunque también permitan múltiples referencias sobre una definición, tienen la desventaja de que se deben crear en la base de datos antes de formar parte de una consulta SQL.

Este ejemplo, sin mucho sentido, sirve para ver las diferencias.

Código:
--Selft join con tablas derivadas.
--Se codifica 2 veces la consulta sobre clientes
--para generar T1 y T2
select t1.nombre_cliente, t2.apellido_cliente
from
 (select id_cliente, nombre_cliente, apellido_cliente 
     from clientes) as t1,
 (select id_cliente, nombre_cliente, apellido_cliente 
     from clientes) as t2
where t1.id_cliente = t2.id_cliente
go

--Self join con vistas.
--Se codifica 1 consulta sobre clientes para generar T1 y T2
--pero se crea una vista
create view t as
 select id_cliente, nombre_cliente, apellido_cliente
 from clientes
go

select t1.nombre_cliente, t2.apellido_cliente
from t as t1, t as t2
where t1.id_cliente = t2.id_cliente
go

--Self join con tablas temporales.
--Se codifica 1 consulta sobre clientes para generar T1 y T2
--pero se crea una tabla temporal
insert into #t
 select id_cliente, nombre_cliente, apellido_cliente
 from clientes
go

select t1.nombre_cliente, t2.apellido_cliente
from #t as t1, #t as t2
where t1.id_cliente = t2.id_cliente
go

--Self join con tablas CTE.
--Se codifica 1 consulta sobre clientes para generar T1 y T2
--sin crear objetos
with t as (
 select id_cliente, nombre_cliente, apellido_cliente
 from clientes )
select  t1.nombre_cliente, t2.apellido_cliente
from t as t1, t as t2
where t1.id_cliente = t2.id_cliente
go
En cuanto a rendimiento, es probable que tengas el mismo con CTE, vistas y tablas anidadas porque se resuelven con igual (o muy parecido) plan de ejecución, pero sea superior al de la tabla temporal.

Saludos

Etiquetas: select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:27.