Usuário com melhor resposta
Dúvidas em stored procedure

Pergunta
-
tenho a seguinte stored procedure:
Code SnippetCREATE PROCEDURE stp_exemplo_sel01
(
@CodTipo CHAR(1)
)
AS
SET NOCOUNT ON
SELECT
CASE WHEN @CodTipo LIKE 'A' THEN 'Tipo de Cliente 1'
WHEN @CodTipo LIKE 'B' THEN 'Tipo de Cliente 2'
WHEN @CodTipo LIKE 'C' THEN 'Tipo de Cliente 3'
ELSE 'Outros Clientes'
END AS TIPO
FROM
TBL_CLIENTE
WHERE....
minha dúvida é: na claúsula WHERE, tenho q fazer uma condição para se o usuário entrar com um código ele verifique se o código existe cadastrado na tabela, ou se ele não digitar nenhum, ele não verificar a claúsula WHERE fazendo nesse exemplo acima exibir "Outros Clientes" em todos os registros.
Respostas
-
Fernando, segue um exemplo de como você pode fazer essa query:
Code SnippetCREATE
PROCEDURE stp_exemplo_sel01(
@CodTipo
CHAR(1) NULL)
AS
SET
NOCOUNT ONDECLARE
@Sql nvarchar(4000)IF
(@CodTipo IS NULL)BEGIN
SET @Sql =CASE WHEN @CodTipo LIKE '
WHEN @CodTipo LIKE '
B' THEN 'Tipo de Cliente 2'WHEN @CodTipo LIKE '
C' THEN 'Tipo de Cliente 3'ELSE '
Outros Clientes'END AS TIPO
FROM
TBL_CLIENTE'
END
ELSE
BEGIN
SET @Sql =CASE WHEN @CodTipo LIKE '
WHEN @CodTipo LIKE '
B' THEN 'Tipo de Cliente 2'WHEN @CodTipo LIKE '
C' THEN 'Tipo de Cliente 3'ELSE '
Outros Clientes'END AS TIPO
FROM
TBL_CLIENTE
WHERE ....'
END
EXEC
sp_executesql (@Sql)Abraços,
Todas as Respostas
-
Fernando, segue um exemplo de como você pode fazer essa query:
Code SnippetCREATE
PROCEDURE stp_exemplo_sel01(
@CodTipo
CHAR(1) NULL)
AS
SET
NOCOUNT ONDECLARE
@Sql nvarchar(4000)IF
(@CodTipo IS NULL)BEGIN
SET @Sql =CASE WHEN @CodTipo LIKE '
WHEN @CodTipo LIKE '
B' THEN 'Tipo de Cliente 2'WHEN @CodTipo LIKE '
C' THEN 'Tipo de Cliente 3'ELSE '
Outros Clientes'END AS TIPO
FROM
TBL_CLIENTE'
END
ELSE
BEGIN
SET @Sql =CASE WHEN @CodTipo LIKE '
WHEN @CodTipo LIKE '
B' THEN 'Tipo de Cliente 2'WHEN @CodTipo LIKE '
C' THEN 'Tipo de Cliente 3'ELSE '
Outros Clientes'END AS TIPO
FROM
TBL_CLIENTE
WHERE ....'
END
EXEC
sp_executesql (@Sql)Abraços,
-
Fernando,
Desculpe, mas não entendi bem sua dúvida. O código a ser informado pelo usuário e verificado é o @codTipo (que é o único parâmetro da sua SP)?
Se for, você já está comparando o valor dele (um conjunto de valores pré-determinados na verdade) no CASE, então porque precisaria fazer o FROM? Isso aqui não resolveria?
Code SnippetCREATE PROCEDURE stp_exemplo_sel01
(
@CodTipo CHAR(1)
)
AS
BEGIN
SET NOCOUNT ON
SELECT
CASE WHEN @CodTipo = 'A' THEN 'Tipo de Cliente 1' -- por ser char(1), o like não é necessário
WHEN @CodTipo = 'B' THEN 'Tipo de Cliente 2'
WHEN @CodTipo = 'C' THEN 'Tipo de Cliente 3'
ELSE 'Outros Clientes'
END AS TIPO
END
Caso vc tenha que verificar o código na tabela, com o mesmo nome ou referenciando outra coluna (o que parece ser o caso):
Code SnippetCREATE PROCEDURE stp_exemplo_sel01
(
@CodTipo CHAR(1)
)
AS
SET NOCOUNT ON
IF (@codTipo is NULL)
SELECT 'Outros Clientes' AS TIPO
ELSE
SELECT
CASE WHEN codXXX = 'A' THEN 'Tipo de Cliente 1' -- ou @codTipo, tanto faz
WHEN codXXX = 'B' THEN 'Tipo de Cliente 2'
WHEN codXXX = 'C' THEN 'Tipo de Cliente 3'
ELSE 'Outros Clientes'
END AS TIPO
FROM
TBL_CLIENTE
WHERE
codXXX = @codTipo
Caso o código a ser utilizado pelo usuário seja outro que não o @codTipo, vc teria que informá-lo como parâmetro:
Code SnippetCREATE PROCEDURE stp_exemplo_sel01
(
@CodTipo CHAR(1), @codUsuario int
)
AS
SET NOCOUNT ON
IF (@codUsuario is NULL)
SELECT 'Outros Clientes' AS TIPO
ELSE
SELECT
CASE WHEN @codTipo = 'A' THEN 'Tipo de Cliente 1'
WHEN @codTipo = 'B' THEN 'Tipo de Cliente 2'
WHEN @codTipo = 'C' THEN 'Tipo de Cliente 3'
ELSE 'Outros Clientes'
END AS TIPO
FROM
TBL_CLIENTE
WHERE
codUsuario = @codUsuario