SQL - Error ejecución sentencia dinamica SQL desde String

 
Vista:

Error ejecución sentencia dinamica SQL desde String

Publicado por Pedro José (3 intervenciones) el 12/01/2017 12:42:29
Hola,

Estoy haciendo un script para mis bases de datos, que las recorra todas, y compruebe si existe una tabla 'valores', si esta existe, recoge la menor fecha de la tabla y la mayor fecha de la tabla, y crea tantas tablas como meses hayan pasado desde la diferencia en meses de estas dos fechas, e inserta el valor correspondiente de la tabla valores.

El problema llega cuando tengo que ejecutar esa sentencia SQL dinámica, que me lanza un error.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
EXEC sp_msForEachDB 'DECLARE @FECHAInicial varchar(50) DECLARE @FECHAFinal varchar(50) DECLARE @inicio varchar(50) DECLARE @fin varchar(50) DECLARE @sql varchar(200) DECLARE @sql2 varchar(200)  DECLARE @inicioMes varchar(30) DECLARE @finMes varchar(30)
	USE ?; 
	IF EXISTS (SELECT 1  FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE=''BASE TABLE'' AND TABLE_NAME=''valores'')
	BEGIN
	select DB_NAME() AS [Base de datos usada];
		set @FECHAInicial = (SELECT min(fecha) from valores);
        set @FECHAFinal = (SELECT max(fecha) from valores);
        set @inicio = (SELECT CONCAT("valores_", MONTH(@FECHAInicial), "_", YEAR(@FECHAInicial)));
        SET @fin = (SELECT CONCAT("valores_", MONTH(@FECHAFinal),"_", YEAR(@FECHAFinal)));
		WHILE @inicio <> @fin
		BEGIN
			SELECT @inicio;
			set @FECHAInicial =  (SELECT DATEADD(month, 1, @FECHAInicial));
			set @inicio = (SELECT CONCAT("valores_", MONTH(@FECHAInicial), "_", YEAR(@FECHAInicial)));
			set @inicioMes = (SELECT DATEADD(month, DATEDIFF(month, 0, @FECHAInicial), 0))
            set @inicioMes = (select convert(varchar(30), @inicioMes, 120))
            set @finMes = DATEADD(month, ((YEAR(@inicioMes) - 1900) * 12) + MONTH(@inicioMes), -1)
            set @finMes = DATEADD(day, 1, @finMes)
			IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE=''BASE TABLE'' AND TABLE_NAME=@inicio)
				BEGIN
					SELECT 1 AS res 
				END
			ELSE 
				BEGIN
				 set @sql2 = ''SELECT * into dbo.''+@inicio+'' FROM valores WHERE fecha>=FORMAT('''''' + @inicioMes + '''''',''''YYYY-MM-DD'''') and fecha<FORMAT('''''' + @finMes + '''''',''''YYYY-MM-DD'''')''
				 EXECUTE  @sql2
				END
		END
		IF  @inicio = @fin
		BEGIN
			SELECT @inicio
		END
	END'
go

Cuando ejecuto esto, me da el siguiente error
1
The name 'SELECT * into dbo.valores_6_2015 FROM valores WHERE fecha>=FORMAT('Jun  1 2015 12:00AM','YYYY-MM-DD') and fecha<FORMAT('Jul  1 2015 12:00AM','YYYY-MM-DD')' is not a valid identifier.

¿Me podeis hechar una mano?, No encuentro como puedo arreglar esto por ningún sitio. Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Error ejecución sentencia dinamica SQL desde String

Publicado por Isaias (1921 intervenciones) el 12/01/2017 18:10:27
¿Es MYSQL?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Error ejecución sentencia dinamica SQL desde String

Publicado por Pedro José (3 intervenciones) el 12/01/2017 18:20:42
Hola.
No, es SQL Server.

Ya he solucionado mi problema.
Era un tema relacionado con comillas
Dejo aquí la solución para que podais verla

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
EXEC sp_msForEachDB 'DECLARE @FECHAInicial varchar(50) DECLARE @FECHAFinal varchar(50) DECLARE @inicio varchar(50) DECLARE @fin varchar(50) DECLARE @sql varchar(200) DECLARE @sql2 varchar(800)  DECLARE @inicioMes varchar(30) DECLARE @finMes varchar(30)
	USE ?; 
	IF EXISTS (SELECT 1  FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE=''BASE TABLE'' AND TABLE_NAME=''valores'')
	BEGIN
	select DB_NAME() AS [Base de datos usada];
		set @FECHAInicial = (SELECT min(fecha) from valores);
        set @FECHAFinal = (SELECT max(fecha) from valores);
        set @inicio = (SELECT CONCAT("valores_", MONTH(@FECHAInicial), "_", YEAR(@FECHAInicial)));
        SET @fin = (SELECT CONCAT("valores_", MONTH(@FECHAFinal),"_", YEAR(@FECHAFinal)));
		WHILE @inicio <> @fin
		BEGIN
			set @inicio = (SELECT CONCAT("valores_", MONTH(@FECHAInicial), "_", YEAR(@FECHAInicial)));
			set @inicioMes = (SELECT convert(char(10), DATEADD(month, DATEDIFF(month, 0, @FECHAInicial), 0), 126))
            set @finMes = DATEADD(month, ((YEAR(@inicioMes) - 1900) * 12) + MONTH(@inicioMes), -1)
            set @finMes = (SELECT(convert(char(10), DATEADD(day, 1, @finMes), 126)))
			IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE=''BASE TABLE'' AND TABLE_NAME=@inicio)
				BEGIN
				
				END
			ELSE 
				BEGIN
				 set @sql2 = ''SELECT * into dbo.''+@inicio+'' FROM valores WHERE fecha>= ''''''+@inicioMes +''''''  and fecha< ''''''+ @finMes+''''''''
				 select @sql2
				exec(@sql2)
				
				END
			set @FECHAInicial =  (SELECT DATEADD(month, 1, @FECHAInicial));
		END
		IF @inicio = @fin
		BEGIN
		set @FECHAInicial = (SELECT min(fecha) from valores);
        set @FECHAFinal = (SELECT max(fecha) from valores);
        set @inicio = (SELECT CONCAT("valores_", MONTH(@FECHAInicial), "_", YEAR(@FECHAInicial)));
        SET @fin = (SELECT CONCAT("valores_", MONTH(@FECHAFinal),"_", YEAR(@FECHAFinal)));
		END
	END'
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Error ejecución sentencia dinamica SQL desde String

Publicado por Isaias (1921 intervenciones) el 12/01/2017 18:38:58
Puedes aun mejorar tu codigo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- Esto
set @FECHAInicial = (SELECT min(fecha) from valores);
set @FECHAFinal = (SELECT max(fecha) from valores);
 
-- Por esto
SELECT @FECHAInicial = min(fecha)
		@FECHAFinal = max(fecha)
from valores
 
-- Esto
DECLARE @sql varchar(200)
-- Por esto
DECLARE @sql nvarchar(200)
 
-- Esto
exec(@sql2)
-- Por esto
execute sp_executesql @sql2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Error ejecución sentencia dinamica SQL desde String

Publicado por Pedro José (3 intervenciones) el 12/01/2017 18:46:39
Ahora lo que necesito es lo siguiente:

Imaginarse que, este script falla a la mitad de su ejecución.

Tal y como está hecho, pasaria a crear la siguiente tabla a la ultima creada cuando se reinicie....

Pues bien, yo ahora quiero que el script compruebe si existe la tabla, que los datos de esa tabla sean los mismos que los de el rango de ese mes en la tabla valores.

¿Alguna forma de implementar esto?, Tengo una ligera idea, y es, hacer un select count de los valores de la tabla creada, y un select count del rango de ese mes, si el resultado es el mismo, es que la tabla está bien.

Si no es el mismo, hacer un insert into select que comience desde el id mas alto de la tabla que estoy comprobando y el ultimo valor de la fecha del mes que estoy comprobando en el mes de esa tabla.


¿Voy bien encaminado? (Es algo bastante complejo)

Un Saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar