SQL Server - Procedimiento almacenado que compruebe en 2 tablas

 
Vista:
sin imagen de perfil

Procedimiento almacenado que compruebe en 2 tablas

Publicado por Mon (4 intervenciones) el 23/03/2022 23:37:58
Buenas noches, mi consulta es relacionada con la creación de un procedimiento almacenado que tiene que comprobar la existencia de un campo en 2 tablas para así poderlo borrar. Tengo las siguientes tablas:
Tabla FormaMat, ,con las columnas: IdFormaMat, Nombre, Descripcion, FechaRegistro
Tabla StockMat, ,con las columnas: IdStockMat, IdFormaMat, ...
Tabla ConsultaMat, ,con las columnas: IdConsMat, IdFormaMat, ....
El procedimiento almacenado tiene que comprobar que no haya ninguna forma de material (FormaMat) en las tablas StockMat y ConsultaMat, para así poderlo borrar de la tabla con el IdFormaMat que se le pasa por una variable (@IdFormaMat)

Esto es lo que tengo escrito:
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
CREATE PROC sp_eliminarformamat(
@IdFormaMat int,
@Resultado bit output,
@Mensaje varchar(500) output
)
AS
BEGIN
	SET @Resultado = 1
	--SET @Mensaje = ''
	-- HAY QUE HACER UNA COMPROBACION CON LAS TABLAS CON LAS QUE ESTÉ RELACIONADA :
	-- FormaMat -> StockMaterial y ConsultaMaterial
	IF NOT EXISTS (
		SELECT * FROM FormaMat f
		INNER JOIN StockMaterial s ON s.IdFormaMat = f.IdFormaMat
		WHERE f.IdFormaMat = @IdFormaMat)
		OR (SELECT * FROM FormaMat f
		INNER JOIN ConsultaMaterial c ON c.IdFormaMat = f.IdFormaMat
		WHERE f.IdFormaMat = @IdFormaMat
		)
		BEGIN
			DELETE TOP(1) FROM FormaMat WHERE IdFormaMat = @IdFormaMat
		END
	ELSE
	BEGIN
		SET @Resultado = 0
		SET @Mensaje = 'La forma de material se encuentra relacionada en un stock de material.'
	END
END

Haciendo esto me da un error "Se ha especificado una expresión de tipo no booleano en el contexto donde se esperaba una expresión"

Según entiendo yo de esta forma, debe comprobar si sale false las 2 expresiones Select, entonces no existe en ninguna tabla y se puede eliminar, en cualquier otro caso no se puede borrar porque existe en alguna de las 2 tablas.
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: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Procedimiento almacenado que compruebe en 2 tablas

Publicado por Isaias (4558 intervenciones) el 24/03/2022 17:19:51
Coloca un SELECT 'Voy a borrar el registro', antes de hacer tu DELETE, para ver si esta entrando a borrar un registro, hay que "seguir" la ejecución de tu procedimiento

Si ejecutas solo este query, ¿te da algun resultado?

1
2
3
4
5
6
SELECT * FROM FormaMat f
		INNER JOIN StockMaterial s ON s.IdFormaMat = f.IdFormaMat
		WHERE f.IdFormaMat = @IdFormaMat)
		OR (SELECT * FROM FormaMat f
		INNER JOIN ConsultaMaterial c ON c.IdFormaMat = f.IdFormaMat
		WHERE f.IdFormaMat = @IdFormaMat
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
sin imagen de perfil

Procedimiento almacenado que compruebe en 2 tablas

Publicado por Mon (4 intervenciones) el 24/03/2022 23:32:13
1
2
3
4
5
6
SELECT * FROM FormaMat f
		INNER JOIN StockMaterial s ON s.IdFormaMat = f.IdFormaMat
		WHERE f.IdFormaMat = 4
		OR (SELECT * FROM FormaMat f
		INNER JOIN ConsultaMaterial c ON c.IdFormaMat = f.IdFormaMat
		WHERE f.IdFormaMat = 4)

Dándole un valor de 4 donde tendría que ir @IdFormaMat:
Me subraya en rojo el segundo select y al darle a ejecutar me da error y me pone lo siguiente:

Se especificó una expresión no booleana en un contexto donde se esperaba una condición, cerca de ')'.
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: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Procedimiento almacenado que compruebe en 2 tablas

Publicado por Isaias (4558 intervenciones) el 30/03/2022 17:56:13
A este select, no tiene sentido, ya que esta incluyendo un comparativo (OR)

OR (SELECT * FROM FormaMat f
INNER JOIN ConsultaMaterial c ON c.IdFormaMat = f.IdFormaMat
WHERE f.IdFormaMat = 4)

Que en teoría te daría un TRUE o un FALSE
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: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Procedimiento almacenado que compruebe en 2 tablas

Publicado por Isaias (4558 intervenciones) el 30/03/2022 17:57:16
En todo caso debería ser un OR NOT EXISTS(SELECT...) o bien OR EXISTS(SELECT ...)
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
sin imagen de perfil

Procedimiento almacenado que compruebe en 2 tablas

Publicado por Mon (4 intervenciones) el 31/03/2022 08:03:19
Después de realizar algunas pruebas, el procedimiento ha quedado funcionando de esta manera, muchas gracias Isaias por tu respuestas y ayudarme a esclarecer la duda.

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
37
38
39
40
41
42
43
CREATE PROC sp_eliminarformamat(
@IdFormaMat int,
@Resultado bit output,
@Mensaje varchar(500) output
)
AS
BEGIN
	set @Resultado = 0
	set @Mensaje = ''
	declare @comprueba bit = 1		--ESTABLECEMOS : 1 COMO QUE EXISTE UN REGISTRO -> SE PUEDE BORRAR.
									--				 0 COMO QUE NO EXISTE -> NO SE PUEDE BORRAR.
 
	-- HAY QUE HACER UNA COMPROBACION CON LAS TABLAS CON LAS QUE ESTÉ RELACIONADA :
	-- FormaMat -> StockMaterial y ConsultaMaterial
 
	IF EXISTS (SELECT * FROM  StockMaterial s
	INNER JOIN FormaMat f ON f.IdFormaMat = S.IdFormaMat
	WHERE f.IdFormaMat=@IdFormaMat
	)
	BEGIN
		SET @Resultado = 0
		SET @comprueba = 0
		SET @Mensaje = @Mensaje + 'No se puede eliminar la forma del material porque se encuentra relacionado con un elemento de Stock de Material\n'
	END
 
	IF EXISTS (SELECT * FROM  ConsultaMaterial c
	INNER JOIN FormaMat f ON f.IdFormaMat = c.IdFormaMat
	WHERE f.IdFormaMat = @IdFormaMat
	)
	BEGIN
		SET @Resultado = 0
		SET @comprueba = 0
		SET @Mensaje = @Mensaje + 'No se puede eliminar la forma del material porque se encuentra relacionado con un elemento de Consulta de Material\n'
	END
 
	IF (@comprueba = 1)
	BEGIN
		DELETE FROM FormaMat WHERE IdFormaMat = @IdFormaMat
		SET @Resultado = 1
		SET @Mensaje = 'Se ha borrado la forma de material de la base de datos.'
	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
sin imagen de perfil

Procedimiento almacenado que compruebe en 2 tablas

Publicado por Mon (4 intervenciones) el 29/03/2022 10:12:03
Se podría realizar algo tal que así? No lo he probado todavía, porque no sé si es darle muchas vueltas y hay una forma mas sencilla...

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
37
38
39
40
41
42
43
44
CREATE PROC sp_eliminarformamat(
@IdFormaMat int,
@Resultado bit output,
@Mensaje varchar(500) output
)
AS
BEGIN
	SET @Resultado = 1			--ESTABLECEMOS 1 COMO EXISTE Y 0 COMO NO EXISTE.
	--SET @Mensaje = ''
	-- HAY QUE HACER UNA COMPROBACION CON LAS TABLAS CON LAS QUE ESTÉ RELACIONADA :
	-- FormaMat -> StockMaterial y ConsultaMaterial
	IF NOT EXISTS(
		SELECT * FROM FormaMat f
		INNER JOIN StockMaterial s ON s.IdFormaMat = f.IdFormaMat
		WHERE f.IdFormaMat = @IdFormaMat)
		BEGIN
			SET @Resultado = 0
		END
		ELSE
		BEGIN
			SET @Resultado = 1
		END
	IF NOT EXISTS(
		SELECT * FROM FormaMat f
		INNER JOIN ConsultaMaterial c ON c.IdFormaMat = f.IdFormaMat
		WHERE f.IdFormaMat = @IdFormaMat)
		BEGIN
			SET @Resultado = 0
		END
		ELSE
		BEGIN
			SET @Resultado = 1
		END
	IF (@Resultado=1)
		BEGIN
			DELETE TOP(1) FROM FormaMat WHERE IdFormaMat = @IdFormaMat
			SET @Mensaje = 'Se ha borrado la forma de material de la base de datos.'
		END
	ELSE
	BEGIN
		SET @Resultado = 0
		SET @Mensaje = 'La forma de material se encuentra relacionada en un stock de material.'
	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